簡體   English   中英

靜態和動態代碼分析

[英]static and dynamic code analysis

我發現了關於這個主題的幾個問題,並且所有這些問題都有很多參考,但我仍然沒有清楚的想法,因為大多數參考文獻都是關於具體工具而不是關於分析的一般概念。 因此我有一些問題:

關於靜態分析:1。我想有一個參考,或者總結哪些技術是成功的,並且現在更具相關性。 2.他們真正可以做些什么來發現錯誤,我們可以做一個摘要,還是取決於工具?

關於符號執行:1。哪里可以包含符號執行? 我想根據方法,我想知道它們是動態分析,還是靜態和動態分析的組合,如果可以確定的話。

我發現了在工具中區分兩種不同技術的問題,即使我認為我知道理論上的差異。

我實際上是在提前與C合作

我想簡單回答一下:

靜態分析着眼於代碼的語法結構,並得出關於程序行為的結論。 這些結論必須始終不正確。

靜態分析的典型示例是數據流分析,您可以在其中計算每個語句的usedreadwrite等集合。 這將有助於找到例如未初始化的值。

您還可以分析有關代碼模式的代碼。 這樣,這些工具可用於檢查您是否符合特定的編碼標准。 一個突出的編碼標准示例是MISRA。 此編碼標准用於安全關鍵系統,並避免使用C語言中存在問題的結構。這樣,您就已經可以說很多關於應用程序對內存泄漏,懸空指針等的健壯性。

動態分析不僅僅考慮語法,而是考慮狀態信息。 在符號執行中,您將向語句添加有關所有變量的可能值的假設。

最昂貴和最強大的動態分析方法是模型檢查,您可以在其中查看系統的所有可能的執行狀態。 您可以將模型檢查系統視為以100%覆蓋率進行測試的系統 - 但是當然存在許多阻止以這種方式檢查實際系統的實際問題。

這些方法非常強大,您可以從靜態代碼分析工具中獲得很多,特別是與良好的編碼標准相結合時。

我的軟件團隊發現的一個功能非常令人印象深刻,例如它會在C ++中告訴您何時使用虛方法的類沒有虛擬析構函數。 事實很容易檢查,但真的很有幫助。

商業工具非常昂貴,但是一旦你學會了如何使用它們就值錢。 一開始的典型問題是你會得到很多誤報,並且不知道在哪里尋找真正的問題。

請注意,現在g ++已經內置了一些這樣的東西,你可以使用免費的pclint之類的東西。

對不起 - 這已經很久了...希望它很有趣。

術語“靜態分析”意味着分析實際上不運行代碼。 另一方面,“動態分析”運行代碼並且還需要某些類型的實際測試輸入。 這就是定義。 而已。

靜態分析采用各種形式方法,如抽象解釋,模型檢查和符號執行。 通常,抽象解釋或模型檢查適用於軟件驗證。 符號執行更適合於查找錯誤的目的。

象征性的執行分為靜態分析。 但是,有一種稱為concolic execution的混合方法,它使用符號執行和動態測試。

為Zane的評論添加:

也許我的解釋有點混亂。

軟件驗證和錯誤發現之間的區別在於分析是否合理。 例如,當我們說緩沖區溢出分析儀是聲音時,這意味着分析儀必須報告所有可能的緩沖區溢出。 如果分析器沒有報告任何內容,則證明目標程序中沒有緩沖區溢出。 因為模型檢查是保證健全性的方法,所以它主要用於軟件驗證。

另一方面,當今最商業化的靜態分析儀主動使用的符號執行並不能保證穩健性,因為聲音分析固有地發布了大量的誤報。 為了發現錯誤,即使某些真陽性也丟失,減少誤報也更為重要。

綜上所述,

  • 健全:沒有假陰性

  • 完整性:沒有誤報

  • 軟件驗證:健全性比完整性更重要

  • 發現錯誤:完整性比健全更重要

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM