嵌入式系統(tǒng)開發(fā)中的靜態(tài)分析由于嵌入式系統(tǒng)行業(yè)的快速增長,嵌入式設(shè)備的代碼質(zhì)量成為首要關(guān)注的問題之一。考慮到嵌入式系統(tǒng)開發(fā)的特殊性(調(diào)試?yán)щy、出錯(cuò)成本高等),開發(fā)人員需要使用專用工具來提升代碼質(zhì)量。 靜態(tài)代碼分析器就是這些工具之一。本文介紹了靜態(tài)分析及其在嵌入式系統(tǒng)中的優(yōu)勢。 靜態(tài)代碼分析 首先,讓我們弄清楚靜態(tài)代碼分析器是什么以及它們可以執(zhí)行哪些功能。 靜態(tài)代碼分析器是一種無需實(shí)際執(zhí)行即可分析程序的軟件。靜態(tài)分析工具對源代碼執(zhí)行比編譯器更深入的檢查。通常,編譯器只會發(fā)現(xiàn)語法錯(cuò)誤。 靜態(tài)分析工具的工作原理: 分析器的輸入數(shù)據(jù)是源代碼(最好是可編譯的) 分析器將源代碼轉(zhuǎn)化為特殊模型進(jìn)行進(jìn)一步分析(AST、語義模型等); 分析器通過將一組診斷規(guī)則應(yīng)用于模型來搜索缺陷。診斷規(guī)則基于各種方法; 分析器以您方便的格式保存所有發(fā)出的警告; 開發(fā)人員只需研究報(bào)告并修復(fù)所有缺陷; 利潤! 靜態(tài)分析器可以執(zhí)行廣泛的任務(wù)。讓我們介紹一下分析器最常見的任務(wù): 程序代碼中的錯(cuò)誤檢測。在這種情況下,靜態(tài)分析極大地補(bǔ)充了代碼審查。它允許您在您和您的同事開始進(jìn)行令人厭煩的代碼審查之前發(fā)現(xiàn)并修復(fù)許多問題; 廣義上的代碼質(zhì)量增強(qiáng)。代碼質(zhì)量可以包括可讀性、可維護(hù)性、代碼復(fù)雜性、內(nèi)聚度以及其他可以直接或間接影響錯(cuò)誤數(shù)量的方面。因此,靜態(tài)分析器有助于遵循編碼標(biāo)準(zhǔn)(公司內(nèi)部接受和普遍接受); 代碼分析作為 CI/CD 中質(zhì)量門機(jī)制的一部分。分析器不僅可以警告代碼中的潛在錯(cuò)誤,還可以作為一種保護(hù)機(jī)制。如果代碼質(zhì)量水平不符合規(guī)定的要求,他們將停止持續(xù)交付。此類代碼分析器會擴(kuò)展編譯器行為并在檢測到不符合標(biāo)準(zhǔn)的錯(cuò)誤或代碼片段時(shí)阻止構(gòu)建; 項(xiàng)目指標(biāo)的收集、統(tǒng)計(jì)數(shù)據(jù)的收集、反映項(xiàng)目“總體健康狀況”的圖形和圖表結(jié)構(gòu)。 實(shí)施的好處 靜態(tài)分析器已被證明對嵌入式軟件非常有用。讓我們看看靜態(tài)分析最明顯的積極方面。 首先,靜態(tài)分析的使用降低了對已經(jīng)發(fā)布的設(shè)備降低了故障的可能性。 嵌入式系統(tǒng)軟件中的錯(cuò)誤非常麻煩。問題是一旦開始大規(guī)模生產(chǎn),錯(cuò)誤就不可能或幾乎不可能糾正。假設(shè)一家公司已經(jīng)生產(chǎn)并交付了數(shù)千臺洗衣機(jī)。然而,事實(shí)證明機(jī)器在某種模式下無法正常工作。公司應(yīng)該怎么做?一般來說,這個(gè)問題是修辭性的,有兩種實(shí)際選擇: 順其自然,在各種網(wǎng)站上收到負(fù)面的客戶反饋,并破壞聲譽(yù)。當(dāng)然,公司可以發(fā)布并發(fā)送手冊添加說“不要這樣做”。然而,這是一個(gè)“弱”的選擇; 停止銷售機(jī)器并開始更新固件。這是一個(gè)昂貴的選擇。 發(fā)布了多少設(shè)備并不重要。修復(fù)錯(cuò)誤可能有問題,甚至為時(shí)已晚。火箭墜毀- 檢測到錯(cuò)誤,但為時(shí)已晚。患者死亡- 檢測到錯(cuò)誤,但不會讓人回來。導(dǎo)彈防御系統(tǒng)有瞄準(zhǔn)精度損失- 檢測到錯(cuò)誤,但損壞已經(jīng)造成。汽車中斷不起作用- 檢測到錯(cuò)誤,但這對車禍?zhǔn)芎φ邿o濟(jì)于事。編程錯(cuò)誤的代價(jià)是可怕的,不是嗎? 結(jié)論很簡單:應(yīng)盡可能徹底地測試嵌入式設(shè)備的代碼。特別是如果錯(cuò)誤可能導(dǎo)致人員傷亡或巨大的經(jīng)濟(jì)損失。 靜態(tài)代碼分析是檢測錯(cuò)誤的過程,但并不能保證它會找到代碼中的所有錯(cuò)誤。但是,開發(fā)人員應(yīng)該利用任何機(jī)會額外檢查代碼的正確性。靜態(tài)分析器可以指出即使經(jīng)過多次代碼審查后仍然存在的各種錯(cuò)誤。 如果靜態(tài)分析可以幫助減少設(shè)備代碼中的錯(cuò)誤數(shù)量,那就太棒了。也許發(fā)現(xiàn)這些特定的錯(cuò)誤會阻止生命的損失。或者,也許公司不會浪費(fèi)很多錢,也不會因?yàn)榭蛻敉对V而失去良好的聲譽(yù)。 其次,靜態(tài)代碼分析器顯著降低了軟件測試和調(diào)試過程的成本。 靜態(tài)分析允許您在編碼期間或夜間構(gòu)建期間發(fā)現(xiàn)錯(cuò)誤。因此,搜索和修復(fù)大多數(shù)錯(cuò)誤的成本要低得多。 可能每個(gè)開發(fā)人員都曾嘗試“刷新”設(shè)備,但未成功。例如,在此過程中,設(shè)備未設(shè)置為適當(dāng)?shù)碾妷夯蛲耆珶龤А0l(fā)生了什么,您在哪里查找問題?畢竟,不僅僅是軟件錯(cuò)誤可能是問題的根源。也可能是硬件本身或布局質(zhì)量差的錯(cuò)誤。因此,查找錯(cuò)誤的過程可能需要很長時(shí)間。 最悲傷的場景: 開發(fā)人員 100% 確定他正確編寫了代碼; 電路工程師和其他負(fù)責(zé)硬件的同事正在從事該項(xiàng)目; 尋找問題的過程緩慢而費(fèi)力; 開發(fā)者再次查看代碼,突然發(fā)現(xiàn)——一個(gè)錯(cuò)字; 超低效浪費(fèi)隊(duì)友的精力和時(shí)間; 這是令人尷尬和不愉快的。 由于以下原因,可能會彈出此類錯(cuò)誤。在正在進(jìn)行的項(xiàng)目中,開發(fā)人員使用了他的舊做法,他至少需要對項(xiàng)目進(jìn)行調(diào)整。例如,他可以編寫以下代碼片段: 飛行 Arr [3]; .... for (uchar idx = 0; idx != 4; idx++) 平均 += Arr[idx]; 平均/= 3; 而這個(gè)錯(cuò)誤的背景如下。開發(fā)者以他之前的開發(fā)為基礎(chǔ),代碼主要是使用Copy-Paste方法編寫的。他沒注意,忘了把4換成3排成一行。結(jié)果,他在訪問位于數(shù)組邊界之外的索引時(shí)出現(xiàn)了未定義的行為。這樣的代碼可能是陰險(xiǎn)的。程序在調(diào)試過程中可以正常工作。但是,在實(shí)際情況下,當(dāng)客戶端多次運(yùn)行它時(shí),它可能會崩潰。如果靜態(tài)分析器發(fā)現(xiàn)這樣的錯(cuò)誤,那就太好了。 因此,為了避免曲折和費(fèi)力的調(diào)試過程,在對設(shè)備進(jìn)行刷機(jī)之前檢測盡可能多的缺陷位置非常重要。 第三,靜態(tài)分析的使用確保了沒有太多經(jīng)驗(yàn)的開發(fā)人員。 程序錯(cuò)誤可以形象地分為兩種類型。開發(fā)人員知道第一種類型的錯(cuò)誤。由于疏忽,這些錯(cuò)誤出現(xiàn)在代碼中。第二種錯(cuò)誤出現(xiàn)在開發(fā)人員根本不知道以這種方式編寫代碼是不可能的情況下。換句話說,他們可以隨心所欲地查看這些代碼,但仍然找不到錯(cuò)誤。 靜態(tài)分析器包含有關(guān)各種代碼模式的知識庫。在某些情況下,這些模式會導(dǎo)致錯(cuò)誤。因此,他們可以指出開發(fā)人員自己不會發(fā)現(xiàn)的錯(cuò)誤。一個(gè)例子是使用 32 位 time_t 類型,這可能導(dǎo)致2038之后設(shè)備的錯(cuò)誤工作。 另一個(gè)例子是程序的未定義行為,這是由于移位運(yùn)算符<</>> 的不當(dāng)使用而發(fā)生的。這些運(yùn)算符在微控制器的代碼中使用非常廣泛。不幸的是,開發(fā)人員經(jīng)常非常粗心地使用這些運(yùn)算符。這使得程序不可靠并且依賴于編譯器的特定版本和設(shè)置。同時(shí),程序可以運(yùn)行,但這不是因?yàn)樗拇a寫得正確,而是因?yàn)殚_發(fā)人員很幸運(yùn)。 使用靜態(tài)分析器,開發(fā)人員可以避免許多此類令人不快的情況。此外,您可以使用分析器來控制整體代碼質(zhì)量。當(dāng)項(xiàng)目團(tuán)隊(duì)成長或變化時(shí),這一點(diǎn)很重要。換句話說,分析器有助于跟蹤初學(xué)者是否開始編寫錯(cuò)誤代碼。 第四,現(xiàn)代靜態(tài)分析器不僅可以發(fā)現(xiàn)代碼錯(cuò)誤和漏洞,還支持嵌入式系統(tǒng)的編碼標(biāo)準(zhǔn)。這些標(biāo)準(zhǔn)提高了程序的安全性、可移植性和可靠性。 C 和 C++ 被稱為嵌入式系統(tǒng)的流行編程語言。MISRA C、MISRA C++ 和 AUTOSAR C++ 等標(biāo)準(zhǔn)是為這些語言開發(fā)的。每個(gè)標(biāo)準(zhǔn)都有相當(dāng)多的規(guī)則和建議(MISRA C:143,MISRA C++:228,AUTOSAR C++:超過 350)。在沒有靜態(tài)代碼分析器的情況下進(jìn)行編碼時(shí),根本不可能遵守如此多的規(guī)則和建議。這些規(guī)則是開發(fā)人員需要避免的編碼模式,從而降低出錯(cuò)的可能性。 結(jié)論 靜態(tài)分析的使用將幫助您:減少查找和修復(fù)錯(cuò)誤所需的時(shí)間;減少發(fā)生嚴(yán)重錯(cuò)誤的可能性;減少固件更新的需要;監(jiān)控整體代碼質(zhì)量;監(jiān)控新團(tuán)隊(duì)成員的表現(xiàn);嚴(yán)格遵守一定的軟件開發(fā)標(biāo)準(zhǔn);監(jiān)控第三方模塊/庫的代碼質(zhì)量。
|