chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

星星科技指導(dǎo)員 ? 來源:嵌入式計算設(shè)計 ? 作者:Chris Tapp ? 2022-06-28 11:56 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

C 代碼特別容易受到移植問題的影響,特別是因為不能期望編譯器檢測到它們,因為代碼將符合語言規(guī)范(假設(shè)沒有使用語言擴展)。因此,開發(fā)人員必須使用靜態(tài)分析工具來確認移植將按計劃進行。靜態(tài)分析工具可以通過多種方式幫助解決此問題。

int 大小引起的可移植性問題

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

typedef 無符號字符 U8;

typedef unsigned int U16;

typedef unsigned long U32;

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

typedef 無符號字符 U8;

typedef 無符號短 U16;

typedef unsigned int U32;

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

編譯器不會報告任何這些問題,因為代碼對于目標環(huán)境完全有效,即使它的行為可能不符合預(yù)期。

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

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

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

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

編譯器不需要檢測實現(xiàn)定義的、未指定的或未定義的行為的使用,因為代碼是完全有效的。

編碼標準

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

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

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

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

整數(shù)提升是保值的(意味著保留大小和符號),但對象的符號可能會改變。此外,表達式將以比操作數(shù)類型更寬的類型進行計算。考慮以下示例:

U8 u8a = 200U;

U8 u8b = 100U;

U8 u8r = u8a + u8b;

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

但是,當(dāng)整數(shù)提升與隱式擴展轉(zhuǎn)換同時發(fā)生時,可能會造成混淆。考慮以下:

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)換為有符號整數(shù),結(jié)果將在賦值時隱式轉(zhuǎn)換為無符號整數(shù),最終值為 0x10000。開發(fā)人員可以(也許有理由)依靠發(fā)生的整數(shù)提升來確保加法不會像使用 16 位算術(shù)時那樣換行。

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

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

u32r = (u32) u16a + u16b;

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

圖 1: LDRA 工具套件等靜態(tài)分析工具可以突出顯示有效 C 代碼中的問題,這些問題在移植時可能導(dǎo)致功能錯誤。因為代碼是有效的 C,編譯器不會檢測到這些問題。

poYBAGK6fCGAQ1o2AAH-WXrqZfA267.png

整數(shù)提升也會影響其他操作。考慮以下:

u16a = 0x1234U;

u16r = ~u16a 》》 8;

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

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

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

u16r = ( U16 )~u16a 》》 8;

評估代碼適用性

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

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

pYYBAGK6fCqAaVH9AAKRnPFNo9U070.png

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

審核編輯:郭婷

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

    關(guān)注

    22

    文章

    2120

    瀏覽量

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

    關(guān)注

    1

    文章

    1665

    瀏覽量

    50855
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    汽車軟件團隊必看:基于靜態(tài)代碼分析工具Perforce QAC的ISO 26262合規(guī)實踐

    ISO 26262合規(guī)指南,從ASIL分級到工具落地,手把手教你用靜態(tài)代碼分析(Perforce QAC)實現(xiàn)高效合規(guī)。
    的頭像 發(fā)表于 08-07 17:33 ?714次閱讀
    汽車軟件團隊必看:基于<b class='flag-5'>靜態(tài)</b><b class='flag-5'>代碼</b><b class='flag-5'>分析</b>工具Perforce QAC的ISO 26262合規(guī)實踐

    如何在恩智浦FRDM開發(fā)平臺上實現(xiàn)代碼的高效復(fù)用

    從零開始評估微控制器可能充滿挑戰(zhàn)。即使在編寫代碼之前,開發(fā)人員也需要深入了解想要使用的外設(shè)的特性。它們是否能夠在不同產(chǎn)品間以一致方式運行?這些所謂的可移植性究竟有多可靠?面對這些不確定性,創(chuàng)建真正可移植
    的頭像 發(fā)表于 05-27 14:35 ?631次閱讀
    如何在恩智浦FRDM開發(fā)平臺上實現(xiàn)<b class='flag-5'>代碼</b>的高效復(fù)用

    基本電路分析(經(jīng)典學(xué)習(xí)指導(dǎo)系列)

    對于電工技術(shù)、電氣工程方面的人士是個很好的借鑒,有助于電路分析。 從直流電阻電路分析開始,一直講到交流電路。 對于數(shù)學(xué)基礎(chǔ)方面,使用者不需要懂得微分或積分預(yù)算,用導(dǎo)數(shù)來說明電壓與電流
    發(fā)表于 05-13 15:29

    TPS7A44 50mA、65V、低 IQ、LDO 線性穩(wěn)壓器數(shù)據(jù)手冊

    電源),并可承受高達 85 V 的線路瞬態(tài)電壓。這些特性有助于現(xiàn)代應(yīng)用滿足日益嚴格的能源要求,并有助于延長便攜式電源解決方案的電池壽命。
    的頭像 發(fā)表于 02-27 16:12 ?945次閱讀
    TPS7A44 50mA、65V、低 IQ、LDO 線性穩(wěn)壓器數(shù)據(jù)手冊

    VirtualLab Fusion應(yīng)用:光波導(dǎo)的足跡和光柵分析

    有助于確定光導(dǎo)及其光柵區(qū)域充分布局的特性。 今天,我們轉(zhuǎn)向用于光導(dǎo)中光柵的最強大的系統(tǒng)設(shè)計工具之一:足跡和光柵分析工具。在它的許多功能中,不限于任何特定的布局,例如,它可以幫助可視化不同視場模式下
    發(fā)表于 02-11 09:45

    信號分析儀的原理和應(yīng)用場景

    快速定位和解決問題,提高通信系統(tǒng)的可靠和效率。 無線電頻譜監(jiān)測: 信號分析儀可以掃描和分析無線電頻譜,檢測和識別不同頻段的信號源。 這對于無線電頻譜管理、頻段規(guī)劃和干擾定位非常重要,有助于
    發(fā)表于 01-17 14:37

    Code Review:提升代碼質(zhì)量與團隊能力的利器

    降低軟件中的缺陷比例;其次,它促進了知識共享,通過評審的過程,團隊成員可以相互學(xué)習(xí),增強對系統(tǒng)的整體理解;最后,CR是一種預(yù)防措施,它有助于維護代碼的清晰和統(tǒng)一,減輕技術(shù)債務(wù),提升系統(tǒng)的穩(wěn)定性。 盡管CR有諸多好處,實際操作中卻面臨不少
    的頭像 發(fā)表于 01-17 09:52 ?692次閱讀

    如何提高嵌入式代碼質(zhì)量?

    的功能,有助于提高代碼的復(fù)用和可維護。 2. 清晰的文檔:包括設(shè)計文檔、接口文檔和代碼注釋,能夠幫助開發(fā)人員理解
    發(fā)表于 01-15 10:48

    電氣安規(guī)分析儀的原理和應(yīng)用

    相關(guān)的安全標準和規(guī)定。這有助于企業(yè)在新產(chǎn)品上市前及時發(fā)現(xiàn)并解決潛在的安全隱患。 在用設(shè)備的定期維護:對于在用的電氣設(shè)備,電氣安規(guī)分析儀可以用于定期維護和檢測。通過測試設(shè)備的各項參數(shù),可以及時發(fā)現(xiàn)設(shè)備
    發(fā)表于 12-24 14:13

    【「大模型啟示錄」閱讀體驗】營銷領(lǐng)域大模型的應(yīng)用

    今天跟隨「大模型啟示錄」這本書,學(xué)習(xí)在營銷領(lǐng)域應(yīng)用大模型。 大模型通過分析大量的消費者數(shù)據(jù),包括購買歷史、瀏覽記錄、社交媒體互動等,能夠識別消費者的偏好和行為模式。這種分析能力有助于企業(yè)更好地理
    發(fā)表于 12-24 12:48

    自動零件分析儀的原理和應(yīng)用

    。這有助于確保投入生產(chǎn)的原材料符合工藝要求,避免因原材料質(zhì)量問題導(dǎo)致后續(xù)產(chǎn)品性能不佳。 加工過程監(jiān)測:在金屬加工過程中,分析儀能夠持續(xù)監(jiān)測金屬的組織結(jié)構(gòu)變化。例如,在鍛造、軋制等熱加工工序中,它能實時
    發(fā)表于 12-23 15:22

    系統(tǒng)化課程體系——2天倒計時!

    包括:電磁兼容、信號完整和電氣安全。時域和頻域分析有助于優(yōu)化電磁問題。了解電流定律和電磁場原理有助于識別輻射源和傳導(dǎo)路徑。接地設(shè)計是減少
    的頭像 發(fā)表于 12-16 09:52 ?725次閱讀
    系統(tǒng)化課程體系——2天倒計時!

    紅外感應(yīng)單片機在智能衛(wèi)浴的抗干擾分析

    一、自身優(yōu)勢帶來的抗干擾潛力 自帶恒流驅(qū)動電路 :XD08M3232單片機自帶恒流驅(qū)動電路,這一特性可能有助于增強其在智能衛(wèi)浴環(huán)境中的抗干擾。因為恒流驅(qū)動電路可以使相關(guān)感應(yīng)部件的工作電流保持穩(wěn)定
    發(fā)表于 12-14 15:41

    XD08M3232紅外感應(yīng)單片機擁有哪些配置實現(xiàn)高性能處理能力

    。 內(nèi)置兩路軌到軌運算放大器 :能夠?qū)Φ头鹊妮斎胄盘栠M行有效放大。在不同場景下,通過放大傳感器信號,可以提高信號處理的效率和準確。這有助于在數(shù)據(jù)處理的前端就獲取更優(yōu)質(zhì)的信號,減少因為信號微弱而導(dǎo)致
    發(fā)表于 11-23 15:08

    魯棒分析方法及其應(yīng)用

    對輸出的影響,找出最敏感的輸入。這有助于識別哪些參數(shù)或輸入對系統(tǒng)或算法的性能影響最大,從而在設(shè)計時給予更多的關(guān)注。 壓力測試 :以超出正常范圍的輸入測試系統(tǒng),找出崩潰或產(chǎn)生不可接受輸出的臨界點。這種方法能夠模擬極端情況,評估
    的頭像 發(fā)表于 11-11 10:21 ?1w次閱讀