當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式硬件

為了確保程序運(yùn)行一切正常,我們重新運(yùn)行整個(gè)分析過(guò)程。首先,我們開(kāi)啟運(yùn)行時(shí)內(nèi)存監(jiān)測(cè)并運(yùn)行應(yīng)用程序,一切表現(xiàn)正常。然后我們開(kāi)啟內(nèi)存監(jiān)測(cè)并運(yùn)行單元測(cè)試,一個(gè)任務(wù)被報(bào)告出來(lái):


  我們的單元測(cè)試檢測(cè)到reportSensorFailure()函數(shù)的行為已經(jīng)發(fā)生了改變。這是由于我們已經(jīng)對(duì)finalize()函數(shù)進(jìn)行了修改——為了糾正之前報(bào)告的一個(gè)問(wèn)題所做的修改。此處報(bào)告的任務(wù)是為了讓我們注意此修改,并提示我們應(yīng)該對(duì)測(cè)試用例進(jìn)行相應(yīng)的審查,并且確定是否應(yīng)該對(duì)代碼或者測(cè)試用例進(jìn)行相應(yīng)的修改,以表示這種新的行為實(shí)際上是我們所預(yù)期的行為。在檢查完代碼之后,我們發(fā)現(xiàn)后者(修改)是正確的并且應(yīng)該更新斷言的正確條件。

  /* CPPtest_TEST_CASE_BEGIN test_reportSensorFailure */

  /* CPPTEST_TEST_CASE_CONTEXT void reportSensorFailure(void) */

  void sensor_tests_test_reportSensorFailure()

  {

  /* Pre-condition initialization */

  /* Initializing global variable messages */

  {

  messages = 0 ;

  }

  {

  /* Tested function call */

  reportSensorFailure();

  /* Post-condition check */

  CPPTEST_ASSERT(0 == ( messages ));

  }

  }

  /* CPPTEST_TEST_CASE_END test_reportSensorFailure */

  作為最終的確認(rèn),我們需要獨(dú)立地運(yùn)行整個(gè)程序——在IDE中關(guān)閉掉運(yùn)行時(shí)內(nèi)存監(jiān)測(cè)來(lái)對(duì)程序進(jìn)行構(gòu)建。結(jié)果顯示一切如我們所預(yù)期一樣運(yùn)行。

  總結(jié)

  作為全文的結(jié)尾,讓我們一起對(duì)上述各個(gè)步驟進(jìn)行一個(gè)鳥(niǎo)瞰式的總結(jié)。

  首先,我們開(kāi)發(fā)的程序并未如我么所預(yù)期那樣運(yùn)行,我們不得不在兩種解決方法中選擇一種來(lái)查找程序中的錯(cuò)誤:通過(guò)運(yùn)行調(diào)試器或者使用自動(dòng)錯(cuò)誤檢測(cè)技術(shù)。

  如果我們使用調(diào)試器運(yùn)行代碼來(lái)查找錯(cuò)誤,我們將會(huì)看到一些很奇怪的現(xiàn)象:程序中的一些變量總是被賦予了相同的值?;谶@種現(xiàn)象我們不得不通過(guò)排除法來(lái)查找問(wèn)題的原因——即在應(yīng)該使用比較運(yùn)算符的地方我們錯(cuò)誤地使用了賦值運(yùn)算符。而靜態(tài)代碼分析則能為我們自動(dòng)地檢查出該邏輯錯(cuò)誤。運(yùn)行時(shí)內(nèi)存分析是不可能檢查出這種錯(cuò)誤的,因?yàn)檫@種錯(cuò)誤與內(nèi)存無(wú)關(guān)。數(shù)據(jù)流分析也很有可能找不到這類錯(cuò)誤因?yàn)閿?shù)據(jù)流分析僅僅是通過(guò)這些路徑而不會(huì)驗(yàn)證這些條件的正確性。

  當(dāng)我們解決了這個(gè)問(wèn)題后,程序可以運(yùn)行了,但是仍然還有內(nèi)存相關(guān)的問(wèn)題。內(nèi)存相關(guān)的問(wèn)題是很難被調(diào)試器發(fā)現(xiàn)的;當(dāng)用戶使用調(diào)試器調(diào)試程序時(shí),用戶并不知道內(nèi)存的實(shí)際大小。但是自動(dòng)錯(cuò)誤檢查工具能夠做到這點(diǎn)。因此,為了查找這些內(nèi)存問(wèn)題,我們將整個(gè)程序進(jìn)行插裝,并使用運(yùn)行時(shí)內(nèi)存分析工具來(lái)運(yùn)行程序。這樣我們就能知道到底是那一片內(nèi)存發(fā)生了寫(xiě)溢出錯(cuò)誤。

  盡管如此,在審查覆蓋率分析結(jié)果的時(shí)候,我們注意到在目標(biāo)板上測(cè)試的時(shí)候,并不是全部代碼都被覆蓋到了。通過(guò)自動(dòng)化的工具得到這樣的覆蓋率信息是簡(jiǎn)單的,因?yàn)楣ぞ邥?huì)自動(dòng)地

  跟蹤覆蓋率,但是,如果我們是通過(guò)調(diào)試器,就不得不判斷哪一部分程序經(jīng)過(guò)了驗(yàn)證。而這通常只能依靠我們?nèi)斯び涗浀姆绞絹?lái)實(shí)現(xiàn)。

  當(dāng)工具提醒我們一些代碼未被覆蓋到時(shí),我們決定改變單元測(cè)試來(lái)額外地增加我們測(cè)試執(zhí)行的覆蓋率。這就揭示了程序中另外一些問(wèn)題。在目標(biāo)系統(tǒng)的正常測(cè)試中,覆蓋所有函數(shù)也許是不可能完成的任務(wù),因?yàn)槠渲幸恍┖瘮?shù)可能是硬件的失敗處理函數(shù)或僅在某些小概率的特定情況下才會(huì)被調(diào)用的函數(shù)。而對(duì)這些函數(shù)的測(cè)試對(duì)于一些注重安全性的程序而言又是至關(guān)重要的。試想在飛機(jī)上用來(lái)處理速度傳感器問(wèn)題的程序中存在著代碼錯(cuò)誤:我們會(huì)有系統(tǒng)崩潰的危險(xiǎn),而不是導(dǎo)致某個(gè)設(shè)備為非工作狀態(tài)。因此,通過(guò)創(chuàng)建單元測(cè)試用例來(lái)覆蓋這類型的執(zhí)行路徑往往是對(duì)其進(jìn)行有效測(cè)試的唯一方法。

  接下來(lái),我們修復(fù)了工具檢查到的所有問(wèn)題,同時(shí)通過(guò)驗(yàn)證相應(yīng)的結(jié)果創(chuàng)建了一個(gè)回歸測(cè)試用例(作為報(bào)告的任務(wù)之一引導(dǎo)我們完成)。然后我們運(yùn)行數(shù)據(jù)流分析來(lái)覆蓋在目標(biāo)系統(tǒng)上即便使用單元測(cè)試也未執(zhí)行到的路徑。在此之前,我們幾乎已經(jīng)達(dá)到了100%的代碼行覆蓋率,但是我們的路徑覆蓋率卻未達(dá)到這個(gè)水平。BugDetective幫我們發(fā)現(xiàn)了這些方面的一些潛在問(wèn)題。這些問(wèn)題可能并沒(méi)有實(shí)際發(fā)生或者有可能永遠(yuǎn)不會(huì)發(fā)生。也許在實(shí)際運(yùn)行時(shí),這些問(wèn)題僅僅會(huì)在當(dāng)其條件滿足的情況下才會(huì)出現(xiàn),并且在現(xiàn)實(shí)生活中,這些條件可能永遠(yuǎn)不可能滿足。盡管如此,我們不能保證隨著代碼的升級(jí),應(yīng)用程序不會(huì)執(zhí)行到這些路徑。

  安全起見(jiàn),我們?nèi)匀恍薷牧怂鶊?bào)告的問(wèn)題以排除任何可能影響它的實(shí)際應(yīng)用執(zhí)行的風(fēng)險(xiǎn)。在修改代碼的同時(shí),我們同時(shí)也引入了回歸測(cè)試,當(dāng)我們?cè)俅芜\(yùn)行單元測(cè)試時(shí)立即被檢測(cè)到。在所有的自動(dòng)化錯(cuò)誤檢測(cè)方法中,回歸測(cè)試是唯一能夠幫助我們檢查到代碼是否發(fā)生了功能性的改變的方法,并且能驗(yàn)證出對(duì)代碼進(jìn)行的修改是否引入了功能性的錯(cuò)誤以及不可預(yù)知的副作用。最后,我們修改了回歸測(cè)試套件,并重新測(cè)試代碼,發(fā)現(xiàn)一切運(yùn)行正常。

  正如讀者所見(jiàn),我們使用的一切測(cè)試方法——基于模式的靜態(tài)代碼分析、內(nèi)存分析、單元測(cè)試、數(shù)據(jù)流分析以及回歸測(cè)試——并不是相互競(jìng)爭(zhēng)的關(guān)系,恰好相反,它們是一種互補(bǔ)的關(guān)系。將上述工具結(jié)合使用,它們就是一套具有強(qiáng)大作用的工具集,并為嵌入式C語(yǔ)言程序/軟件提供一個(gè)無(wú)可比擬的自動(dòng)化錯(cuò)誤檢測(cè)解決方案。

  總而言之,通過(guò)自動(dòng)地查找很多關(guān)于內(nèi)存和其它編碼的缺陷,我們成功地讓程序運(yùn)行起來(lái)了。盡管如此,值得注意的是,最危險(xiǎn)的缺陷卻是實(shí)際的功能性錯(cuò)誤:例如程序并未如所指定的要求運(yùn)行。而不幸的是,這些錯(cuò)誤往往是非常難以被發(fā)現(xiàn)的。

  查找這類缺陷的最好的一個(gè)方式就是通過(guò)同行代碼審查來(lái)實(shí)現(xiàn)。即另指派至少一人來(lái)檢查代碼并且審查代碼與需求內(nèi)容的一致性,這樣用戶就能對(duì)實(shí)際程序是否會(huì)如預(yù)期那樣運(yùn)行有一個(gè)很好的*估。

  另外一個(gè)十分有用的策略是圍繞代碼創(chuàng)建一個(gè)回歸測(cè)試套件,這能幫助用戶快捷地驗(yàn)證代碼與規(guī)范的一致性。在本文所描述的示例情景中,單元測(cè)試被用來(lái)強(qiáng)制執(zhí)行應(yīng)用程序級(jí)的運(yùn)行時(shí)內(nèi)存監(jiān)測(cè)所未覆蓋到的代碼:它能覆蓋到當(dāng)前程序的功能性,在此之后,我們對(duì)代碼做了一些修改,它能提醒我們代碼出現(xiàn)的相應(yīng)的功能性問(wèn)題。事實(shí)上,這種單元測(cè)試用例應(yīng)該被更早地創(chuàng)建起來(lái):理想情況下,當(dāng)用戶在實(shí)現(xiàn)程序的功能時(shí)就應(yīng)該被創(chuàng)建起來(lái)。這樣,用戶就能得到更高的覆蓋率并同時(shí)構(gòu)建起一個(gè)更強(qiáng)壯的“安全網(wǎng)”來(lái)捕捉關(guān)鍵的功能性改變。

  Parasoft的C++test能幫助用戶完成這兩個(gè)任務(wù):從自動(dòng)化到管理同行代碼審查流程,以及幫助團(tuán)隊(duì)創(chuàng)建,持續(xù)地運(yùn)行并維護(hù)一個(gè)高效的回歸測(cè)試套件。

  關(guān)于Parasoft C++test

  Parasoft C++test是一個(gè)經(jīng)廣泛的最佳實(shí)踐證明能提升軟件開(kāi)發(fā)團(tuán)隊(duì)開(kāi)發(fā)效率以及軟件質(zhì)量的自動(dòng)化集成解決方案。C++test能進(jìn)行諸如編碼策略增強(qiáng)、靜態(tài)代碼分析、運(yùn)行時(shí)內(nèi)存監(jiān)測(cè)、自動(dòng)同行代碼審查以及單元和組件測(cè)試,從而為軟件開(kāi)發(fā)團(tuán)隊(duì)提供一種更加實(shí)用的方法來(lái)確保其C以及C++程序能如所預(yù)期那樣工作。C++test可以用于在通用開(kāi)發(fā)IDE下的桌面平臺(tái)中,以及在回歸測(cè)試時(shí)通過(guò)命令行以批處理模式的方式運(yùn)行。同時(shí),C++test還集成了Parasoft的報(bào)告系統(tǒng),該系統(tǒng)能提供具有細(xì)分能力的基于Web 的儀表板,這使得開(kāi)發(fā)團(tuán)隊(duì)根據(jù)C++test的測(cè)試結(jié)果和其他的一些關(guān)鍵進(jìn)程指標(biāo)來(lái)更加方便地跟蹤項(xiàng)目的狀態(tài)和趨勢(shì)。

  通過(guò)在宿主機(jī)上進(jìn)行大量的測(cè)試以及在目標(biāo)系統(tǒng)中進(jìn)行的平滑的驗(yàn)證,C++test能夠幫助軟件開(kāi)發(fā)團(tuán)隊(duì)減少花在嵌入式系統(tǒng)開(kāi)發(fā)中的時(shí)間、精力以及成本。隨著代碼在宿主機(jī)上的構(gòu)建,C++test的自動(dòng)化框架使得開(kāi)發(fā)者能在目標(biāo)硬件系統(tǒng)尚未準(zhǔn)備好的情況下就開(kāi)始測(cè)試以提升代碼質(zhì)量。這大大地縮短了花在目標(biāo)系統(tǒng)上測(cè)試的時(shí)間。早期在宿主機(jī)上構(gòu)建的測(cè)試套件可以被重用來(lái)在仿真器或真實(shí)的目標(biāo)板上驗(yàn)證程序的功能性。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉