哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

集成錯(cuò)誤檢測(cè)技術(shù)以發(fā)現(xiàn)嵌入式C軟件中的更多錯(cuò)誤

星星科技指導(dǎo)員 ? 來源:嵌入式計(jì)算設(shè)計(jì) ? 作者:Parasoft SA ,Miros? ? 2022-06-19 09:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

諸如基于模式的靜態(tài)代碼分析、運(yùn)行時(shí)內(nèi)存監(jiān)控、單元測(cè)試和流分析等自動(dòng)化技術(shù)可以一起用于查找嵌入式 C 應(yīng)用程序中的錯(cuò)誤。以下討論將使用 Parasoft C/C++test 演示這些技術(shù),Parasoft C/C++test 是一種集成解決方案,用于自動(dòng)化廣泛的最佳實(shí)踐,以提高 C 和 C++ 軟件開發(fā)團(tuán)隊(duì)的生產(chǎn)力和軟件質(zhì)量。

示例傳感器應(yīng)用

可以在 ARM Cortex-M3 板上運(yùn)行的簡(jiǎn)單傳感器應(yīng)用程序的上下文中探索推薦的錯(cuò)誤發(fā)現(xiàn)策略。應(yīng)用程序已創(chuàng)建并上傳到開發(fā)板,但在運(yùn)行時(shí),它不會(huì)在 LCD 屏幕上呈現(xiàn)預(yù)期的輸出。

它不起作用,原因尚不清楚。在目標(biāo)板上進(jìn)行調(diào)試既費(fèi)時(shí)又乏味,因?yàn)樾枰謩?dòng)分析調(diào)試器結(jié)果以嘗試確定真正的問題?;蛘撸梢詰?yīng)用某些工具或技術(shù)來自動(dòng)查明錯(cuò)誤。

此時(shí),兩個(gè)選項(xiàng)是使用調(diào)試器調(diào)試應(yīng)用程序或應(yīng)用自動(dòng)化測(cè)試策略從代碼中剝離錯(cuò)誤。如果應(yīng)用自動(dòng)化技術(shù)后應(yīng)用程序仍然無法工作,調(diào)試器可以作為最后的手段。

基于模式的靜態(tài)代碼分析

應(yīng)用了基于模式的靜態(tài)分析,而不是調(diào)試,它快速、易于使用并且?guī)缀蹩梢詰?yīng)用于每次代碼 更改。通過執(zhí)行靜態(tài)分析確定了一個(gè)問題(參見圖 1)。

圖 1:靜態(tài)代碼分析識(shí)別 MISRA 編碼標(biāo)準(zhǔn)違規(guī)。

pYYBAGKugNCAKz00AAKeNT6_DJg677.png

這違反了 MISRA 規(guī)則,即在布爾表達(dá)式中使用賦值運(yùn)算符可能會(huì)有風(fēng)險(xiǎn)。目的不是使用賦值運(yùn)算符,而是使用比較運(yùn)算符。所以這個(gè)問題得到解決,程序重新運(yùn)行。

由于一些輸出顯示在 LCD 上,因此有所改進(jìn)。但是,應(yīng)用程序因訪問沖突而崩潰。再一次,有一個(gè)選擇:使用調(diào)試器或繼續(xù)應(yīng)用自動(dòng)錯(cuò)誤檢測(cè)技術(shù)。鑒于自動(dòng)錯(cuò)誤檢測(cè)在發(fā)現(xiàn)此類內(nèi)存損壞方面非常有效,因此執(zhí)行運(yùn)行時(shí)內(nèi)存監(jiān)控是最佳選擇。

整個(gè)應(yīng)用程序的運(yùn)行時(shí)內(nèi)存監(jiān)控

可以通過應(yīng)用適合在目標(biāo)板上運(yùn)行的輕量級(jí)儀器來執(zhí)行運(yùn)行時(shí)內(nèi)存監(jiān)控。上傳并運(yùn)行檢測(cè)的應(yīng)用程序并下載結(jié)果后,會(huì)報(bào)告錯(cuò)誤(參見圖 2)。

圖 2:運(yùn)行時(shí)內(nèi)存監(jiān)控報(bào)告讀取超出范圍的數(shù)組。

poYBAGKugOyASgfwAALXAj_X3z4239.png

這表明在第 48 行讀取了一個(gè)超出范圍的數(shù)組。顯然,msgIndex變量的值一定超出了數(shù)組的范圍。向上堆棧跟蹤顯示,這個(gè)具有超出范圍值的打印消息是由于在調(diào)用函數(shù)printMessage()之前為其設(shè)置了不正確的條件而導(dǎo)致的。這可以通過放松if語句中的值范圍控制并去掉不必要的條件(value 《= 20)來解決。

void handleSensorValue(int value)

{

initialize();

int index = -1;

if (value 》= 0 && value 《= 10) {

index = VALUE_LOW;

} else if ((value 》 10) && (value 《= 20)) {

index = VALUE_HIGH;

}

printMessage(index, value);

}

現(xiàn)在,當(dāng)重新運(yùn)行應(yīng)用程序時(shí),不會(huì)報(bào)告內(nèi)存錯(cuò)誤。應(yīng)用程序上傳到板后,它似乎按預(yù)期工作。然而,一些擔(dān)憂仍然存在。

在執(zhí)行的代碼路徑中發(fā)現(xiàn)了一個(gè)內(nèi)存覆蓋實(shí)例,但這是否意味著未執(zhí)行的代碼中沒有內(nèi)存覆蓋?覆蓋分析表明,有些代碼根本沒有被執(zhí)行。reportSensorFailure() 函數(shù)沒有被覆蓋,并且調(diào)用reportSensorFailure的mainLoop函數(shù)內(nèi)部的一個(gè)分支根本沒有被執(zhí)行(再次參見圖 2)。測(cè)試此代碼的一種方法是創(chuàng)建一個(gè)單元測(cè)試(用于mainLoop函數(shù))和一個(gè)用戶存根(用于readSensor函數(shù)),以模擬在功能測(cè)試期間難以重現(xiàn)的條件。

帶有運(yùn)行時(shí)內(nèi)存監(jiān)控的單元測(cè)試

創(chuàng)建一個(gè)測(cè)試用例骨架,然后用測(cè)試代碼填充。 此外,為readSensor函數(shù)添加了一個(gè)存根以模擬讀取錯(cuò)誤。運(yùn)行測(cè)試用例——只執(zhí)行這個(gè)以前未測(cè)試的功能——啟用運(yùn)行時(shí)內(nèi)存監(jiān)控。結(jié)果顯示該函數(shù)現(xiàn)在已被覆蓋,但報(bào)告了新的錯(cuò)誤(參見圖 3)。

圖 3:?jiǎn)⒂眠\(yùn)行時(shí)內(nèi)存監(jiān)控的單元測(cè)試會(huì)暴露內(nèi)存錯(cuò)誤。

poYBAGKugPiANVkRAALMdClGdXM371.png

測(cè)試用例發(fā)現(xiàn)了更多與內(nèi)存相關(guān)的錯(cuò)誤。調(diào)用失敗處理程序時(shí),內(nèi)存初始化(空指針)存在明顯問題。進(jìn)一步分析表明,reportSensorValue()中混合了調(diào)用順序,因此finalize()在printMessage()被調(diào)用之前被調(diào)用,但finalize()實(shí)際上釋放了printMessage()使用的內(nèi)存。

void finalize()

{

if (messages) {

free(messages[0]);

free(messages[1]);

free(messages[2]);

}

free(messages);

}

void printMessage(int msgIndex, int value)

{

const char* msg = messages[msgIndex];

printf(“Value: %d, State: %s\n”, value, msg);

fflush(stdout);

}

void reportSensorFailure()

{

finalize();

printMessage(ERROR_MSG, 0);

}

這個(gè)順序是固定的,測(cè)試用例會(huì)重新運(yùn)行一次。

這解決了報(bào)告的錯(cuò)誤之一。下一步是解決報(bào)告的第二個(gè)問題:打印消息中的 AccessViolationException。這是因?yàn)檫@些表消息未初始化。為了解決這個(gè)問題,在打印消息之前調(diào)用initialize()函數(shù)。修復(fù)后的功能如下:

void reportSensorFailure()

{

initialize();

printMessage(ERROR, 0);

finalize();

}

重新運(yùn)行測(cè)試時(shí),只報(bào)告一個(gè)任務(wù):一個(gè)無效的單元測(cè)試用例,這并不是真正的錯(cuò)誤。必須驗(yàn)證結(jié)果才能將此測(cè)試轉(zhuǎn)換為回歸測(cè)試(參見圖 4)。

圖 4:必須為回歸測(cè)試配置測(cè)試。

poYBAGKugQmAPZF6AALbv8XkLNU703.png

接下來,再次運(yùn)行整個(gè)應(yīng)用程序。覆蓋率分析顯示幾乎整個(gè)應(yīng)用程序都被覆蓋了,結(jié)果表明沒有出現(xiàn)內(nèi)存錯(cuò)誤問題。

即使運(yùn)行了整個(gè)應(yīng)用程序并為未覆蓋的函數(shù)創(chuàng)建了單元測(cè)試,但仍有一些路徑未被覆蓋??梢岳^續(xù)使用單元測(cè)試創(chuàng)建,但需要一些時(shí)間才能覆蓋應(yīng)用程序中的所有路徑。相反,可以使用流量分析來模擬這些路徑。

流量分析

運(yùn)行流分析以模擬通過系統(tǒng)的不同路徑,并檢查這些路徑中是否存在潛在問題。報(bào)告了幾個(gè)問題(參見圖 5)。

圖 5:流分析發(fā)現(xiàn)路徑中的幾個(gè)問題。

pYYBAGKugRKAFdLPAAKJvZLif3o566.png

有一條潛在的路徑——一個(gè)未被覆蓋的路徑——在finalize()函數(shù)中可以有一個(gè)雙重釋放。reportSensorValue()函數(shù)調(diào)用finalize(),然后finalize ()調(diào)用free()。此外,在mainLoop()中再次調(diào)用finalize () 。這可以通過使finalize()更智能來解決:

void finalize()

{

if (messages) {

free(messages[0]);

free(messages[1]);

free(messages[2]);

free(messages);

messages = 0;

}

}

然后再運(yùn)行一次流量分析。僅報(bào)告了兩個(gè)問題(參見圖 6)。

圖 6:流量分析檢測(cè)到兩個(gè)剩余問題。

poYBAGKugRyAeJDWAAKcpBYS3ko035.png

此處可能正在訪問索引為-1的表。這是因?yàn)榉e分索引最初設(shè)置為 -1,并且在調(diào)用printMessage()之前,可能存在一條通過if語句未將此積分設(shè)置為正確值的路徑。運(yùn)行時(shí)分析并沒有導(dǎo)致這條路徑,并且這條路徑可能永遠(yuǎn)不會(huì)在現(xiàn)實(shí)生活中被采用。與實(shí)際運(yùn)行時(shí)內(nèi)存監(jiān)控相比,這是流分析的主要弱點(diǎn)。流分析顯示潛在路徑,不一定是在實(shí)際應(yīng)用程序執(zhí)行期間將采用的路徑。通過刪除不必要的條件(value 》= 0)可以輕松修復(fù)此潛在錯(cuò)誤。

void handleSensorValue(int value)

{

initialize();

int index = -1;

if (value 《= 10) {

index = VALUE_LOW;

} else {

index = VALUE_HIGH;

}

printMessage(index, value);

}

報(bào)告的最終錯(cuò)誤以類似的方式修復(fù)?,F(xiàn)在,重新運(yùn)行流分析時(shí),不會(huì)報(bào)告任何問題。

回歸測(cè)試

為確保一切正常,重新運(yùn)行整個(gè)分析。首先,應(yīng)用程序在運(yùn)行時(shí)內(nèi)存監(jiān)控下運(yùn)行,一切似乎都很好。然后使用內(nèi)存監(jiān)控運(yùn)行單元測(cè)試并報(bào)告一個(gè)任務(wù)(參見圖 7)。

圖 7:?jiǎn)卧獪y(cè)試發(fā)現(xiàn)回歸失敗。

pYYBAGKugSqAMO23AAJ8hf7fSs4642.png

單元測(cè)試檢測(cè)到reportSensorFailure()函數(shù)的行為發(fā)生了變化。這是由finalize()中的修改引起的,這是為了糾正先前報(bào)告的問題之一而進(jìn)行的更改。此任務(wù)引起對(duì)更改的注意,并指示必須審查測(cè)試用例。然后要么更正代碼,要么更新測(cè)試用例,以表明這個(gè)新行為實(shí)際上是預(yù)期的行為。看了下代碼,很明顯后者為真,并且更新了斷言的條件。

void sensor_tests_test_reportSensorFailure()

{

{

messages = 0 ;

}

{

reportSensorFailure();

CPPTEST_ASSERT(0 == ( messages ));

}

}

作為最后的健全性檢查,整個(gè)應(yīng)用程序獨(dú)立運(yùn)行,在集成開發(fā)環(huán)境中構(gòu)建它,無需任何運(yùn)行時(shí)內(nèi)存監(jiān)控。結(jié)果證實(shí)它按預(yù)期工作。

補(bǔ)充工具

所有應(yīng)用的測(cè)試方法——基于模式的靜態(tài)代碼分析、內(nèi)存分析、單元測(cè)試、流分析和回歸測(cè)試——不相互競(jìng)爭(zhēng),而是相互補(bǔ)充。一起使用,它們提供了一個(gè)非常強(qiáng)大的工具,可以為嵌入式 C 軟件提供無與倫比的自動(dòng)錯(cuò)誤檢測(cè)水平。

作者:Parasoft SA ,Miros?aw Zieli nski

審核編輯:郭婷

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

    關(guān)注

    2577

    文章

    55483

    瀏覽量

    793831
  • 嵌入式
    +關(guān)注

    關(guān)注

    5209

    文章

    20645

    瀏覽量

    336910
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2129

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    半導(dǎo)體嵌入式單元測(cè)試的核心技術(shù)、工具選型與落地全流程

    單元測(cè)試可以在代碼編寫階段就發(fā)現(xiàn)90%以上的邏輯錯(cuò)誤,顯著降低后期修復(fù)成本。在半導(dǎo)體嵌入式軟件,早期發(fā)
    發(fā)表于 03-06 14:55

    什么是嵌入式應(yīng)用開發(fā)?

    設(shè)計(jì)、實(shí)現(xiàn)和部署,還包括硬件選擇、軟件設(shè)計(jì)、測(cè)試、集成和維護(hù)等流程?。 定義和背景 嵌入式應(yīng)用開發(fā)是指將軟件部署到嵌入式系統(tǒng)
    發(fā)表于 01-12 16:13

    嵌入式軟件測(cè)試找bug的常見方法和秘訣

    嵌入式軟件開發(fā)過程中,一般來說,花在測(cè)試比花在編碼的時(shí)間要多很多,通常為3:1(甚至更多)。這個(gè)比例隨著你的編程和測(cè)試水平的提高而不斷下降,但不論怎樣,軟件測(cè)試對(duì)一般人來講很重要。
    發(fā)表于 01-12 07:07

    C語言單元測(cè)試在嵌入式軟件開發(fā)的作用及專業(yè)工具的應(yīng)用

    方面: ?早期缺陷發(fā)現(xiàn)****?:?jiǎn)卧獪y(cè)試可以在開發(fā)早期發(fā)現(xiàn)代碼的邏輯錯(cuò)誤和邊界條件問題,降低后期修復(fù)成本 ?硬件交互驗(yàn)證****?:嵌入式
    發(fā)表于 12-18 11:46

    系統(tǒng)嵌入式的學(xué)習(xí)路線

    到搞的很精通,我要學(xué)會(huì)抓住重點(diǎn),學(xué)會(huì)取舍,達(dá)到一通百通,事半功倍的學(xué)習(xí)效果。 首先嵌入式技術(shù)主要分為嵌入式軟件嵌入式硬件2大方向。
    發(fā)表于 12-16 07:49

    ARM嵌入式這樣學(xué)

    工程師的的終點(diǎn)只有一個(gè),就是真正的技術(shù)專家。 嵌入式技術(shù)大體上可分為編程語言,內(nèi)核技術(shù),操作系統(tǒng),總線接口,系統(tǒng)集成。其實(shí)細(xì)心的可以
    發(fā)表于 12-04 07:48

    CW32嵌入式軟件開發(fā)的必備知識(shí)

    設(shè)計(jì)的原則和方法,能夠設(shè)計(jì)出高效、可維護(hù)的軟件系統(tǒng)。 了解嵌入式系統(tǒng)的實(shí)時(shí)性要求,能夠設(shè)計(jì)出滿足實(shí)時(shí)性要求的軟件系統(tǒng)。 8、 測(cè)試與驗(yàn)證 掌握單元測(cè)試、集成測(cè)試和系統(tǒng)測(cè)試的方法和
    發(fā)表于 11-28 07:48

    C語言在嵌入式開發(fā)的應(yīng)用

    C 語言在汽車電子控制系統(tǒng)開發(fā)的主導(dǎo)地位。 2、設(shè)備驅(qū)動(dòng)程序 設(shè)備驅(qū)動(dòng)程序是嵌入式系統(tǒng)連接硬件和軟件的橋梁,它負(fù)責(zé)實(shí)現(xiàn)
    發(fā)表于 11-21 08:09

    嵌入式與FPGA的區(qū)別

    \"嵌入式開發(fā)門檻低、就業(yè)廣,適合轉(zhuǎn)行;FPGA技術(shù)深、薪資高,但要求學(xué)歷和數(shù)學(xué)功底。選哪個(gè)?看你的基礎(chǔ)和職業(yè)目標(biāo)。\" ?我們先來明白下兩者區(qū)別在哪? ?1、嵌入式:分兩部分
    發(fā)表于 11-20 07:12

    嵌入式和FPGA的區(qū)別

    。 在當(dāng)今智能化時(shí)代,嵌入式系統(tǒng)和FPGA技術(shù)都是電子系統(tǒng)設(shè)計(jì)的重要組成部分,但許多工程師和技術(shù)愛好者常常對(duì)兩者的區(qū)別和應(yīng)用場(chǎng)景感到困惑。本文將深入解析
    發(fā)表于 11-19 06:55

    C語言是否會(huì)阻礙嵌入式的發(fā)展?

    嵌入式系統(tǒng)這個(gè)領(lǐng)域一直都充滿魅力。它支撐著從家電到醫(yī)療設(shè)備、再到太空探索等幾乎所有類型的現(xiàn)代設(shè)備。但有意思的是,盡管技術(shù)一直在飛速進(jìn)步,我們卻發(fā)現(xiàn),真正歷經(jīng)數(shù)十年依然堅(jiān)挺、貫穿整個(gè)行業(yè)核心的,還是那
    的頭像 發(fā)表于 11-14 10:27 ?523次閱讀
    <b class='flag-5'>C</b>語言是否會(huì)阻礙<b class='flag-5'>嵌入式</b>的發(fā)展?

    嵌入式開發(fā)的關(guān)鍵點(diǎn)介紹

    嵌入式開發(fā)在現(xiàn)代科技扮演著非常重要的角色。隨著物聯(lián)網(wǎng)的發(fā)展,嵌入式系統(tǒng)的需求也越來越大。嵌入式開發(fā)不僅需要開發(fā)人員具備深入的硬件知識(shí)和編程經(jīng)驗(yàn),還需要不斷學(xué)習(xí)新的
    發(fā)表于 11-13 08:12

    嵌入式軟件測(cè)試與專業(yè)測(cè)試工具的必要性深度解析

    技術(shù)。 ?環(huán)境適應(yīng)性挑戰(zhàn)?:溫度、濕度、電磁干擾等環(huán)境因素會(huì)顯著影響硬件性能,導(dǎo)致系統(tǒng)不穩(wěn)定或故障,這類問題在測(cè)試往往超出預(yù)期范圍。 專業(yè)測(cè)試工具的核心價(jià)值專業(yè)測(cè)試工具針對(duì)嵌入式系統(tǒng)的特殊性提供了
    發(fā)表于 09-28 17:42

    入行嵌入式應(yīng)該怎么準(zhǔn)備?

    不同的領(lǐng)域,如汽車、醫(yī)療、工業(yè)控制等。對(duì)于特定領(lǐng)域的了解將使你更具競(jìng)爭(zhēng)力。因此,了解不同領(lǐng)域的特點(diǎn)和要求是非常有益的。 入行嵌入式需要掌握的技術(shù)能力遠(yuǎn)不止上述幾點(diǎn),但這些是入門的基礎(chǔ)。通過學(xué)習(xí)和實(shí)踐,方可逐漸提高自己的技術(shù)水平
    發(fā)表于 08-06 10:34

    電商API常見錯(cuò)誤排查指南:避免集成陷阱

    ? 在電商平臺(tái)開發(fā),API集成是連接系統(tǒng)、實(shí)現(xiàn)數(shù)據(jù)交換的核心環(huán)節(jié)。然而,許多開發(fā)者在集成過程中常遇到錯(cuò)誤,導(dǎo)致項(xiàng)目延遲、數(shù)據(jù)丟失或用戶體驗(yàn)下降。本文將逐步介紹常見
    的頭像 發(fā)表于 07-11 14:21 ?2293次閱讀
    電商API常見<b class='flag-5'>錯(cuò)誤</b>排查指南:避免<b class='flag-5'>集成</b>陷阱
    深州市| 清镇市| 麻城市| 铜梁县| 托克逊县| 荣昌县| 澄江县| 辽阳县| 黎城县| 横峰县| 龙川县| 称多县| 唐海县| 汉阴县| 吴川市| 黔东| 大田县| 连州市| 阳西县| 泗洪县| 阳西县| 淳安县| 秦安县| 昌图县| 中江县| 青岛市| 都兰县| 霍邱县| 溧水县| 玉龙| 恩平市| 泉州市| 白玉县| 葵青区| 沁水县| 灵宝市| 延寿县| 伊吾县| 马边| 长沙市| 嵊州市|