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

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

示例傳感器應用

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

它不起作用,原因尚不清楚。在目標板上進行調(diào)試既費時又乏味,因為需要手動分析調(diào)試器結(jié)果以嘗試確定真正的問題?;蛘?,可以應用某些工具或技術來自動查明錯誤。

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

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

應用了基于模式的靜態(tài)分析,而不是調(diào)試,它快速、易于使用并且?guī)缀蹩梢詰糜诿看未a 更改。通過執(zhí)行靜態(tài)分析確定了一個問題(參見圖 1)。

圖 1:靜態(tài)代碼分析識別 MISRA 編碼標準違規(guī)。

pYYBAGKugNCAKz00AAKeNT6_DJg677.png

這違反了 MISRA 規(guī)則,即在布爾表達式中使用賦值運算符可能會有風險。目的不是使用賦值運算符,而是使用比較運算符。所以這個問題得到解決,程序重新運行。

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

整個應用程序的運行時內(nèi)存監(jiān)控

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

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

poYBAGKugOyASgfwAALXAj_X3z4239.png

這表明在第 48 行讀取了一個超出范圍的數(shù)組。顯然,msgIndex變量的值一定超出了數(shù)組的范圍。向上堆棧跟蹤顯示,這個具有超出范圍值的打印消息是由于在調(diào)用函數(shù)printMessage()之前為其設置了不正確的條件而導致的。這可以通過放松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)在,當重新運行應用程序時,不會報告內(nèi)存錯誤。應用程序上傳到板后,它似乎按預期工作。然而,一些擔憂仍然存在。

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

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

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

圖 3:啟用運行時內(nèi)存監(jiān)控的單元測試會暴露內(nèi)存錯誤。

poYBAGKugPiANVkRAALMdClGdXM371.png

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

}

這個順序是固定的,測試用例會重新運行一次。

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

void reportSensorFailure()

{

initialize();

printMessage(ERROR, 0);

finalize();

}

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

圖 4:必須為回歸測試配置測試。

poYBAGKugQmAPZF6AALbv8XkLNU703.png

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

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

流量分析

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

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

pYYBAGKugRKAFdLPAAKJvZLif3o566.png

有一條潛在的路徑——一個未被覆蓋的路徑——在finalize()函數(shù)中可以有一個雙重釋放。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;

}

}

然后再運行一次流量分析。僅報告了兩個問題(參見圖 6)。

圖 6:流量分析檢測到兩個剩余問題。

poYBAGKugRyAeJDWAAKcpBYS3ko035.png

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

void handleSensorValue(int value)

{

initialize();

int index = -1;

if (value 《= 10) {

index = VALUE_LOW;

} else {

index = VALUE_HIGH;

}

printMessage(index, value);

}

報告的最終錯誤以類似的方式修復。現(xiàn)在,重新運行流分析時,不會報告任何問題。

回歸測試

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

圖 7:單元測試發(fā)現(xiàn)回歸失敗。

pYYBAGKugSqAMO23AAJ8hf7fSs4642.png

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

void sensor_tests_test_reportSensorFailure()

{

{

messages = 0 ;

}

{

reportSensorFailure();

CPPTEST_ASSERT(0 == ( messages ));

}

}

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

補充工具

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

作者:Parasoft SA ,Miros?aw Zieli nski

審核編輯:郭婷

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

    關注

    2574

    文章

    54417

    瀏覽量

    786264
  • 嵌入式
    +關注

    關注

    5186

    文章

    20159

    瀏覽量

    328999
  • C++
    C++
    +關注

    關注

    22

    文章

    2122

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    ARM嵌入式這樣學

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

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

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

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

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

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

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

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

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

    入行嵌入式應該怎么準備?

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

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

    ? 在電商平臺開發(fā),API集成是連接系統(tǒng)、實現(xiàn)數(shù)據(jù)交換的核心環(huán)節(jié)。然而,許多開發(fā)者在集成過程中常遇到錯誤,導致項目延遲、數(shù)據(jù)丟失或用戶體驗下降。本文將逐步介紹常見
    的頭像 發(fā)表于 07-11 14:21 ?1804次閱讀
    電商API常見<b class='flag-5'>錯誤</b>排查指南:避免<b class='flag-5'>集成</b>陷阱

    如何成為一名嵌入式軟件工程師?

    如何成為一名嵌入式軟件工程師? 01明確崗位的角色與定位 嵌入式軟件工程師主要負責開發(fā)運行在特定硬件平臺上的軟件,這些
    發(fā)表于 04-15 14:37

    嵌入式軟件單元測試的必要性、核心方法及工具深度解析

    一、為什么嵌入式軟件必須重視單元測試? ?嵌入式系統(tǒng)的特殊性? 在汽車 ECU、醫(yī)療設備控制器等場景,軟件直接操控硬件,?單比特
    的頭像 發(fā)表于 03-21 14:53 ?979次閱讀

    Python在嵌入式系統(tǒng)的應用場景

    你想把你的職業(yè)生涯提升到一個新的水平?Python在嵌入式系統(tǒng)中正在成為一股不可缺少的新力量。盡管傳統(tǒng)上嵌入式開發(fā)更多地依賴于CC++語言
    的頭像 發(fā)表于 03-19 14:10 ?1204次閱讀

    嵌入式系統(tǒng)的代碼優(yōu)化與壓縮技術

    ,以便容納更多功能模塊或降低硬件存儲成本。智能手表為例,其內(nèi)部存儲容量有限,通過代碼壓縮技術,能在有限空間內(nèi)存儲更多應用程序和數(shù)據(jù),豐富手表的功能。 四、常見代碼壓縮
    發(fā)表于 02-26 15:00

    嵌入式機器學習的應用特性與軟件開發(fā)環(huán)境

    作者:DigiKey Editor 在許多嵌入式系統(tǒng),必須采用嵌入式機器學習(Embedded Machine Learning)技術,這是指將機器學習模型部署在資源受限的設備(如微
    的頭像 發(fā)表于 01-25 17:05 ?1220次閱讀
    <b class='flag-5'>嵌入式</b>機器學習的應用特性與<b class='flag-5'>軟件</b>開發(fā)環(huán)境

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

    技術 現(xiàn)代的嵌入式開發(fā)工具和測試技術可以極大地提升代碼質(zhì)量和開發(fā)效率: 1. 靜態(tài)分析工具:如Coverity、Lint等,能夠幫助發(fā)現(xiàn)潛在的代碼缺陷和安全漏洞。 2. 單元測試和
    發(fā)表于 01-15 10:48

    GPIO錯誤排查與解決

    嵌入式系統(tǒng)和微控制器編程,通用輸入輸出(GPIO)是最常見的接口之一。然而,在使用GPIO時,我們可能會遇到各種錯誤。 1. 理解GPIO GPIO是微控制器上的一組引腳,可以被配置為輸入或輸出
    的頭像 發(fā)表于 01-09 09:46 ?3726次閱讀

    RTOS錯誤檢查機制

    嵌入式應用,有可能發(fā)生各種各樣的錯誤,系統(tǒng)必須能夠檢測到這些錯誤并作出適當?shù)捻憫?。RTOS通常內(nèi)置了一些
    的頭像 發(fā)表于 01-03 14:44 ?1022次閱讀