0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

靜態(tài)分析有助于代碼可移植性

星星科技指導(dǎo)員 ? 來(lái)源:嵌入式計(jì)算設(shè)計(jì) ? 作者:Chris Tapp ? 2022-06-28 11:56 ? 次閱讀

代碼重用通常是新項(xiàng)目中的主要考慮因素,無(wú)論是在利用先前項(xiàng)目的遺留代碼方面,還是作為后續(xù)項(xiàng)目的基礎(chǔ)。靜態(tài)分析可用于確保遺留代碼不會(huì)成為項(xiàng)目中問(wèn)題的根源,并保證在其開發(fā)過(guò)程中生成的任何代碼不會(huì)影響任何將其作為代碼庫(kù)的項(xiàng)目。

C 代碼特別容易受到移植問(wèn)題的影響,特別是因?yàn)椴荒芷谕幾g器檢測(cè)到它們,因?yàn)榇a將符合語(yǔ)言規(guī)范(假設(shè)沒有使用語(yǔ)言擴(kuò)展)。因此,開發(fā)人員必須使用靜態(tài)分析工具來(lái)確認(rèn)移植將按計(jì)劃進(jìn)行。靜態(tài)分析工具可以通過(guò)多種方式幫助解決此問(wèn)題。

int 大小引起的可移植性問(wèn)題

int 中的精度(位數(shù))可能因系統(tǒng)而異。為了解決這個(gè)問(wèn)題,通常定義一組 typedef 來(lái)將系統(tǒng)類型映射到應(yīng)用程序類型。可以為 16 位架構(gòu)定義以下示例:

typedef 無(wú)符號(hào)字符 U8;

typedef unsigned int U16;

typedef unsigned long U32;

如果將代碼移植到 32 位架構(gòu),則此示例可以更改為以下內(nèi)容:

typedef 無(wú)符號(hào)字符 U8;

typedef 無(wú)符號(hào)短 U16;

typedef unsigned int U32;

然而,移植并不是那么簡(jiǎn)單,因?yàn)?int 大小的變化會(huì)對(duì)代碼產(chǎn)生一些不太明顯的影響。例如,其結(jié)果取決于整數(shù)提升效果的任何表達(dá)式都可能表現(xiàn)出不同的行為。因此,只有在包含受影響類型的對(duì)象的所有表達(dá)式中的精度符合目的時(shí),這種更改才合適。靜態(tài)分析可以用來(lái)驗(yàn)證這個(gè)假設(shè)。

編譯器不會(huì)報(bào)告任何這些問(wèn)題,因?yàn)榇a對(duì)于目標(biāo)環(huán)境完全有效,即使它的行為可能不符合預(yù)期。

編譯器實(shí)現(xiàn)引起的可移植性問(wèn)題

與編譯器相關(guān)的實(shí)現(xiàn)定義的、未指定的或未定義的行為的差異可能會(huì)導(dǎo)致移植時(shí)出現(xiàn)缺陷。

實(shí)現(xiàn)定義的行為是編譯器之間可能不同但由編譯器供應(yīng)商記錄的行為。靜態(tài)分析工具可以檢測(cè)調(diào)用此類行為的代碼,以便將其消除以促進(jìn)移植。

也可以檢測(cè)到未指定或未定義的行為;但是,它帶來(lái)的不僅僅是可移植性問(wèn)題,因?yàn)檫@種行為可能會(huì)在同一編譯器的不同版本之間以未記錄的方式發(fā)生變化,甚至可能在同一編譯器內(nèi)的各種用例之間發(fā)生變化。調(diào)用這種行為的代碼可以工作,但很可能會(huì)非常脆弱。值得注意的是,遷移到不同版本的編譯器可以被視為移植。

編譯器不需要檢測(cè)實(shí)現(xiàn)定義的、未指定的或未定義的行為的使用,因?yàn)榇a是完全有效的。

編碼標(biāo)準(zhǔn)

諸如 MISRA C:2004 (www.misra-c.com) 等公開可用的編碼標(biāo)準(zhǔn),可以通過(guò)靜態(tài)分析工具嚴(yán)格執(zhí)行,包括防御這些可移植性問(wèn)題的規(guī)則。后面的例子使用了這個(gè)標(biāo)準(zhǔn)。

C 中的整數(shù)轉(zhuǎn)換

在 C 中對(duì)表達(dá)式求值期間,管理不同算術(shù)類型的隱式轉(zhuǎn)換方式和時(shí)間的規(guī)則很復(fù)雜。為確保移植代碼時(shí)結(jié)果符合預(yù)期,在考慮了所有此類隱式轉(zhuǎn)換后,表達(dá)式中的所有操作都應(yīng)以相同的類型進(jìn)行。

與整數(shù)提升相關(guān)的隱式轉(zhuǎn)換很容易導(dǎo)致代碼的執(zhí)行方式與開發(fā)人員期望的方式大不相同。整數(shù)提升基本上要求將任何小于 int 的類型(例如 char、short)轉(zhuǎn)換為 int,然后再將其用作表達(dá)式中的操作數(shù)。許多嵌入式系統(tǒng)廣泛使用這些類型,因?yàn)樗鼈兺ǔT试S更有效地使用內(nèi)存資源,這可能會(huì)受到限制以節(jié)省成本、空間和功率。

整數(shù)提升是保值的(意味著保留大小和符號(hào)),但對(duì)象的符號(hào)可能會(huì)改變。此外,表達(dá)式將以比操作數(shù)類型更寬的類型進(jìn)行計(jì)算??紤]以下示例:

U8 u8a = 200U;

U8 u8b = 100U;

U8 u8r = u8a + u8b;

在此示例中,u8a 和 u8b 在加法發(fā)生之前都被轉(zhuǎn)換為寬度至少為 16 位的有符號(hào)整數(shù)。然后將加法的結(jié)果隱式轉(zhuǎn)換回 8 位,然后再存儲(chǔ)到 u8r 中。在這種情況下,開發(fā)人員可能會(huì)期待結(jié)果 (44),因?yàn)榭梢院侠淼丶僭O(shè)他們知道賦值時(shí)發(fā)生的模 2 運(yùn)算。這意味著結(jié)果實(shí)際上與以 8 位精度進(jìn)行操作時(shí)的結(jié)果相同(整數(shù)提升不影響結(jié)果)。

但是,當(dāng)整數(shù)提升與隱式擴(kuò)展轉(zhuǎn)換同時(shí)發(fā)生時(shí),可能會(huì)造成混淆??紤]以下:

U16 u16a = 0xffffU;

U16 u16b = 0x0001U;

U32 u32r = u16a + u16b;

在 32 位架構(gòu)上,u32r 的類型為 unsigned int,而 u16a 和 u16b 的類型為 unsigned short。整數(shù)提升將導(dǎo)致操作數(shù)在加法之前轉(zhuǎn)換為有符號(hào)整數(shù),結(jié)果將在賦值時(shí)隱式轉(zhuǎn)換為無(wú)符號(hào)整數(shù),最終值為 0x10000。開發(fā)人員可以(也許有理由)依靠發(fā)生的整數(shù)提升來(lái)確保加法不會(huì)像使用 16 位算術(shù)時(shí)那樣換行。

如果開發(fā)人員決定將代碼移植到 16 位架構(gòu),則 u32r 將具有 unsigned long 類型,而 u16a 和 u16b 將具有 unsigned int 類型。這一次,在加法發(fā)生之前(也在 unsigned int 中),不會(huì)對(duì)已經(jīng)是 unsigned int 的操作數(shù)應(yīng)用任何轉(zhuǎn)換,并且 0x0000 的結(jié)果將在賦值時(shí)隱式轉(zhuǎn)換為 unsigned long,最終值為0x0000。以更廣泛的類型執(zhí)行添加的假設(shè)現(xiàn)在不再有效,并且存在發(fā)生意外回繞的風(fēng)險(xiǎn)。

這表明當(dāng)代碼從一個(gè)平臺(tái)移植到另一個(gè)平臺(tái)時(shí),它可以多么容易地表現(xiàn)出不同的行為。這里的真正問(wèn)題與在分配結(jié)果時(shí)發(fā)生的隱式擴(kuò)大轉(zhuǎn)換有關(guān)。這可以通過(guò)確保始終使用強(qiáng)制轉(zhuǎn)換以必要的精度評(píng)估表達(dá)式來(lái)消除,例如:

u32r = (u32) u16a + u16b;

( u32 ) 強(qiáng)制轉(zhuǎn)換確保表達(dá)式始終以具有適當(dāng)精度的類型進(jìn)行評(píng)估。在前面的示例中,這意味著表達(dá)式是以 unsigned long 而不是 unsigned int 計(jì)算的。如圖 1 所示,靜態(tài)分析可以很容易地檢測(cè)到隱式加寬。

圖 1: LDRA 工具套件等靜態(tài)分析工具可以突出顯示有效 C 代碼中的問(wèn)題,這些問(wèn)題在移植時(shí)可能導(dǎo)致功能錯(cuò)誤。因?yàn)榇a是有效的 C,編譯器不會(huì)檢測(cè)到這些問(wèn)題。

poYBAGK6fCGAQ1o2AAH-WXrqZfA267.png

整數(shù)提升也會(huì)影響其他操作??紤]以下:

u16a = 0x1234U;

u16r = ~u16a 》》 8;

在 16 位架構(gòu)上,這將導(dǎo)致 u16a 的位被反轉(zhuǎn),頂部字節(jié)移入底部字節(jié),將 0x00ED 分配給 u16r。

但是,在 32 位架構(gòu)上,u16a 將在補(bǔ)碼發(fā)生之前轉(zhuǎn)換為帶符號(hào)的 int(32 位),從而將值 0xFFED 分配給 u16r。

再一次,使用強(qiáng)制轉(zhuǎn)換將確保行為符合預(yù)期:

u16r = ( U16 )~u16a 》》 8;

評(píng)估代碼適用性

靜態(tài)分析工具是代碼移植的寶貴幫助。如圖 2 所示,這些工具允許開發(fā)人員評(píng)估遺留代碼并確保以允許移植的方式開發(fā)新代碼。

圖 2:靜態(tài)分析工具報(bào)告,例如 LDRA 工具套件中的這個(gè)示例,可以有效評(píng)估代碼移植的適用性。

pYYBAGK6fCqAaVH9AAKRnPFNo9U070.png

在項(xiàng)目生命周期中盡早采用靜態(tài)分析將確保盡早驗(yàn)證遺留代碼,并確保任何新代碼從一開始就可移植。通過(guò)縮短開發(fā)時(shí)間和顯著降低殘留缺陷水平,開發(fā)人員可以快速收回使用此類工具所涉及的初始支出。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2100

    瀏覽量

    73453
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1617

    瀏覽量

    49015
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    汽車異構(gòu)硬件平臺(tái)開發(fā)如何進(jìn)行靜態(tài)代碼分析

    先進(jìn)的靜態(tài)代碼分析工具,其新版本中引入的多CCT功能為開發(fā)人員提供了強(qiáng)大的支持,該功能不僅簡(jiǎn)化了多編譯器環(huán)境下的代碼分析過(guò)程,還可以極大增強(qiáng)
    汽車異構(gòu)硬件平臺(tái)開發(fā)如何進(jìn)行<b class='flag-5'>靜態(tài)</b><b class='flag-5'>代碼</b><b class='flag-5'>分析</b>

    多級(jí)寬帶放大器各級(jí)之間pcb獨(dú)立分開,信號(hào)線用sma線相接,電源線用普通銅線導(dǎo)線,有助于抗干擾嗎?

    請(qǐng)問(wèn),多級(jí)寬帶放大器各級(jí)之間pcb獨(dú)立分開,信號(hào)線用sma線相接,電源線用普通銅線導(dǎo)線,有助于抗干擾么?
    發(fā)表于 09-05 06:35

    關(guān)于一些有助于優(yōu)化電源設(shè)計(jì)的新型材料

    眾所周知,人們對(duì)更高電源效率的追求正在推動(dòng)性能的全方位提升。材料科學(xué)的進(jìn)步對(duì)于優(yōu)化電源設(shè)計(jì)和開發(fā)更高效、更緊湊和更可靠的解決方案發(fā)揮著關(guān)鍵作用。下文列出了一些有助于優(yōu)化電源設(shè)計(jì)的新材料。
    的頭像 發(fā)表于 08-29 15:26 ?316次閱讀

    MSPM0-高級(jí)控制計(jì)時(shí)器有助于實(shí)現(xiàn)更好的控制和更好的數(shù)字輸出

    電子發(fā)燒友網(wǎng)站提供《MSPM0-高級(jí)控制計(jì)時(shí)器有助于實(shí)現(xiàn)更好的控制和更好的數(shù)字輸出.pdf》資料免費(fèi)下載
    發(fā)表于 08-28 11:30 ?0次下載
    MSPM0-高級(jí)控制計(jì)時(shí)器<b class='flag-5'>有助于</b>實(shí)現(xiàn)更好的控制和更好的數(shù)字輸出

    恒訊科技分析:香港站群服務(wù)器為什么要做偽靜態(tài)處理呢?

    提高搜索引擎優(yōu)化(SEO)效果:偽靜態(tài)處理可以使得動(dòng)態(tài)網(wǎng)頁(yè)URL看起來(lái)像是靜態(tài)網(wǎng)頁(yè)的URL,這有助于搜索引擎更好地索引網(wǎng)站內(nèi)容。搜索引擎通常偏好靜態(tài)網(wǎng)頁(yè),因?yàn)樗鼈冋J(rèn)為
    的頭像 發(fā)表于 07-31 12:49 ?193次閱讀

    有助于提高網(wǎng)絡(luò)設(shè)備性能的FRAM SF25C20(MB85RS2MT)

    有助于提高網(wǎng)絡(luò)設(shè)備性能的FRAM SF25C20(MB85RS2MT)
    的頭像 發(fā)表于 07-25 09:49 ?235次閱讀
    <b class='flag-5'>有助于</b>提高網(wǎng)絡(luò)設(shè)備性能的FRAM SF25C20(MB85RS2MT)

    國(guó)內(nèi)低代碼平臺(tái)推薦--萬(wàn)界星空科技低代碼平臺(tái)

    代碼平臺(tái)是一種應(yīng)用程序,它為編程提供圖形用戶界面,從而以極快的速度開發(fā)代碼,減少傳統(tǒng)編程工作。 這些工具有助于快速開發(fā)代碼,最大限度地減少手工編碼的工作量。這些平臺(tái)不僅
    的頭像 發(fā)表于 07-18 15:39 ?248次閱讀
    國(guó)內(nèi)低<b class='flag-5'>代碼</b>平臺(tái)推薦--萬(wàn)界星空科技低<b class='flag-5'>代碼</b>平臺(tái)

    愛普生的高精度傳感技術(shù)有助于監(jiān)控自動(dòng)化

    Epson、JREast和NaganoKeiki聯(lián)合開發(fā)了一種適用于鐵路運(yùn)營(yíng)商的實(shí)用撓度監(jiān)測(cè)設(shè)備-愛普生的高精度傳感技術(shù)有助于監(jiān)控自動(dòng)化-SeikoEpsonCorporation(TSE:6724
    的頭像 發(fā)表于 06-27 10:53 ?288次閱讀
    愛普生的高精度傳感技術(shù)<b class='flag-5'>有助于</b>監(jiān)控自動(dòng)化

    基于MM32F5270的Ethernet實(shí)現(xiàn)LwIP協(xié)議棧移植

    LwIP是輕量化的TCP/IP協(xié)議,由瑞典計(jì)算機(jī)科學(xué)院(SICS)的Adam Dunkels 開發(fā)的一個(gè)小型開源的TCP/IP協(xié)議棧。LwIP具有高度可移植性、代碼開源,提供了三種編程接口(API):RAW API、NETCONN API 和 Socket API,用于與
    的頭像 發(fā)表于 06-21 10:28 ?1064次閱讀
    基于MM32F5270的Ethernet實(shí)現(xiàn)LwIP協(xié)議棧<b class='flag-5'>移植</b>

    FPGA的IP軟核使用技巧

    夠與所使用的FPGA平臺(tái)和開發(fā)工具無(wú)縫集成。 閱讀和理解IP軟核的文檔 : 在使用IP軟核之前,務(wù)必仔細(xì)閱讀和理解其提供的文檔,包括用戶手冊(cè)、技術(shù)參考手冊(cè)、示例代碼等。這將有助于您更好地理解IP軟核
    發(fā)表于 05-27 16:13

    在微芯片上使用3D反射器堆棧有助于加快6G通信的發(fā)展

    一項(xiàng)新的研究發(fā)現(xiàn),在微芯片上使用3D反射器堆棧可以使無(wú)線鏈路的數(shù)據(jù)速率提高三倍,從而有助于加快6G通信的發(fā)展。
    的頭像 發(fā)表于 03-13 16:31 ?618次閱讀

    混合云策略的五個(gè)關(guān)鍵要素

    列舉了有助于企業(yè)混合云策略取得成功的五個(gè)關(guān)鍵要素,包括更低的成本、廣泛的可移植性、工作負(fù)載管理、工作負(fù)載整合和數(shù)據(jù)安全。
    的頭像 發(fā)表于 01-23 14:44 ?613次閱讀

    嵌入式開發(fā)為什么需要輸出調(diào)試信息?

    、變量值、函數(shù)調(diào)用堆棧等信息,有助于快速定位和解決問(wèn)題。2.實(shí)時(shí)反饋 在開發(fā)過(guò)程中逐步增加新功能或者修改現(xiàn)有功能時(shí),輸出調(diào)試信息可以提供實(shí)時(shí)反饋。這使得可以快速地檢查修改的效果。 3.代碼驗(yàn)證和邏輯分析
    發(fā)表于 11-28 16:46

    ADI全新集成電路有助于監(jiān)測(cè)心率

    電子發(fā)燒友網(wǎng)站提供《ADI全新集成電路有助于監(jiān)測(cè)心率.pdf》資料免費(fèi)下載
    發(fā)表于 11-24 10:38 ?0次下載
    ADI全新集成電路<b class='flag-5'>有助于</b>監(jiān)測(cè)心率

    多層pcb生產(chǎn),更有助于高精度布線

    多層pcb生產(chǎn),更有助于高精度布線
    的頭像 發(fā)表于 11-15 11:02 ?499次閱讀