在功能安全工具中整合程式碼分析功能

作者 : IAR Systems供稿

本文將介紹為何在開發安全認證應用時,應該採用程式碼分析工具。

C-STAT靜態分析與C-RUN執行階段分析現已納入Renesas RX與Arm專屬功能安全版IAR Embedded Workbench的擴充功能(add-on)產品。本文將介紹為何在開發安全認證應用時,應該採用程式碼分析工具。

功能安全標準與程式碼分析

第三部分的IEC 61508 Edition 2.0 (Part 3 of IEC 61508 Edition 2.0)規範安全相關系統的軟體要求,強制使用良好的開發流程。舉例來說,像是第七部分《技巧與措施概述》C.4.2節 (part 7 Overview of techniques and measures, section C.4.2) 提及的語言子集仍繼續延用:

目標:減少出現程式錯失(programming fault)的機率,以及提高偵測出任何殘存錯失的機率。

敘述:審查程式語言(language)判斷其編寫(programming)結構是否容易出錯或難以分析,舉例來說,像是運用靜態分析方法。之後再定義排除這些結構的程式子集。

該文同一章節亦指出在沒有這類限制下運用C作為程式語言,在高於1的安全完整性等級(SIL)環境不建議採用。也就是說,如果你打算用C/C++軟體針對SIL 2-4認證系統開發產品,基本上需要用到靜態分析工具。

在執行階段分析(runtime analysis)方面也是類似的情況,在第七部分《技巧與措施概述》B.6.5節《動態分析與測試》中就有提到:

目標:藉由在完成狀態之前審視原型方案的動態行為,藉此偵測出規範失效(specification failure)。

敘述:安全相關系統的動態分析,執行對象是安全相關系統的幾近全功能(near-operational)原型,使其在典型運作環境中運轉,將蒐集到的數據做為輸入資料。如果安全相關系統觀察到的行為符合要求行為,這樣的分析就令人滿意。安全相關系統若出現任何失效(failure),就必須加以修正,之後再分析新製的可運行版本原型。

工具

C-RUN工具已整合到編譯器,以及C-SPY Debugger除錯器。它除了讓使用者觀察執行階段(run-time)的可執行碼,還能回報程式碼在執行時的違規行為(violation)。C-RUN會執行算術(arithmetic)檢查、邊界檢查,以及堆積(heap)檢查,而且很容易在IAR Embedded Workbench的專案設定介面中進行設定。

 

 

執行階段分析工具的偽陽性(false-positive)率通常較低,C-RUN也不例外。換言之,當C-RUN回報一個—bug——有很高的可能性它會是真正的bug,因為真實程式碼是在實際目標系統上執行與分析。C-RUN能看到應用程式狀態的所有資訊,並回報真實發生的bug。然而,也可以設定適當的C-SPY Message Rule 訊息規則,如下圖所示,藉以讓偵測到的錯誤通過篩檢。

 

 

不過執行階段分析也有一些缺點。首先,問題大多都是在軟體開發後期才會發現,因為採用這種方法作為分析工具,先決條件是要拿到可執行的程式碼。再者,分析本身僅覆蓋程式實際運作的一些部分。如果無法觸發所有刺激源(stimuli)藉以達到測試程式所需的全程式碼覆蓋率,最終得到的就是未完成測試的程式碼。不過,C-RUN仍為使用者提供極寶貴的回饋,再加上它與IAR Embedded Workbench的緊密整合,因此非常容易使用。

再來看C-STAT,這款靜態分析工具會執行一項或多項規則檢查,嘗試找出背離某些編碼規則的偏差(deviation)。它會檢查程式碼是否遵循MISRA C:2012、MISRA C++:2008,以及MISRA C:2004等標準定義的規則,加上檢視約250項對映到CWE 與CERT C/C++規範的問題。和C-RUN一樣,C-STAT也能在IAR Embedded Workbench中輕易調整專案設定。

 

 

不同於C-RUN,C-STAT工具在對程式碼審查瑕疵時不會真正執行程式。不論程式跑的是什麼執行線緒或用到哪些資料集,它都能找到錯誤。C-STAT能在軟體開發初期就辨識出bug與瑕疵,確切的說是展開研發的第一天就能找到錯誤,而且不會影響系統的運作效能。

市場上有多款獨立運作(free-standing)靜態分析工具供C/C++開發者選用,而C-STAT的優勢在於它不需要繁瑣的設定,能即裝即用(out of the box),當然它瞭解所有IAR System規範的C/C++語言結構,以及針對高效率嵌入式程式開發量身打造的規範。運用C-STAT納入日常工作的環結,可輕易檢查程式碼是否遵循重要規則。這種作法可節省在後續階段進行測試與除錯所耗費的時間與資源。

C-STAT已整合至IAR Embedded Workbench IDE,是一款簡單易用的正規組譯工具。

 

 

每項被偵測到的錯誤,只要按F1鍵就能叫出線上說明系統顯示說明,顯示規則解釋,以及程式碼範例,詳述如何修正錯誤。

 

 

可以建立HTML格式的報告,在文件中詳述測試結果。

 

 

總結

回到功能安全標準,來檢討工具如何協助你因應既定準則。像是第七部分《技巧與措施概述》C.4.2節提及的語言子集仍繼續延用:審視程式判斷程式開發結構是否容易出錯或難以分析,像是採用靜態分析方法。接著定義排除這些結構的程式子集(subset)。

在這方面,C-STAT會檢查程式是否符合汽車產業軟體可靠性協會(MISRA)定義的規則。如先前所述,如果你的目標是運用C/C++ 軟體開發SIL 2-4認證系統,就的確需要靜態分析工具。

再回到B.6.5節《動態分析與測試》:安全相關系統的動態分析,執行對象是安全相關系統的幾近全功能原型,使其在典型運作環境中運轉,將蒐集到的數據做為輸入資料。如果安全相關系統觀察到的行為符合要求行為,這樣的分析就令人滿意,安全相關系統若出現任何失效,就必須加以修正,之後再分析新製的可執行版本原型。

即使用C-RUN進行執行階段分析,也無法檢查整個安全相關系統各層面的動態行為,但它仍是一個很好的工具,至少能針對某些軟體部分找出實際發生,以及潛在的錯誤。必須牢記的是,安全觀念必須和系統的危險失效率(dangerous failure rate)掛勾,關注的目光不能只放在像軟體這些零件的失效率。

兩種類型的程式碼品質工具,執行階段分析的C-RUN,以及靜態分析的C-STAT,在開發安全相關軟體方面非常有用,兩者並非相互競爭的關係。靜態分析在某些領域較為擅長,而執行階段分析在其他領域的表現也較為出色,兩者各有優勢之處。因此C-RUN與C-STAT確實帶來互補的技術,設計用來融入日常開發工作流程。

 

 

 

 

 

加入我們官方帳號LINE@,最新消息一手掌握!

發表評論