複製鏈接
請複製以下鏈接發送給好友

靜態程序分析

鎖定
靜態程序分析(英語:Static programanalysis)是指在不運行計算機程序的條件下,進行程序分析的方法。
中文名
靜態程序分析
外文名
Static programanalysis
目    的
進行程序分析
領    域
計算機

靜態程序分析簡介

有些程序分析需要在程序運行時才能進行,這種程序分析稱為動態程序分析。部份的靜態程序分析的對象是針對特定版本的源代碼,也有些靜態程序分析的對象是目標代碼。靜態程序分析一詞多半是指配合靜態程序分析工具進行的分析,人工進行的分析一般稱為程序理解(英語:programcomprehension)或代碼審查。
靜態程序分析的複雜程度依所使用的工具而異,簡單的只考慮個別敍述及聲明的行為,複雜的可以分析程序的完整源代碼。不同靜態程序分析產生的信息也有所不同,簡單的可以是標示可能的代碼錯誤(如lint編程工具(英語:lintprogrammingtool)),複雜的可以是形式化方法,也就是用數學的方式證明程序的某些行為符合其設計規格。
軟件度量和反向工程可以視為一種靜態程序分析的方式。在實務上,在定義所謂的軟件品質指針(softwarequalityobjectives)後,軟件度量的推導及程序分析常一起進行,在開發嵌入式系統時常會用這種方式進行。 [1] 

靜態程序分析用途

靜態程序分析的商業用途可以用來驗證安全關鍵計算機系統中的軟件,並指出可能有計算機安全隱患的代碼,這類的應用越來越多。例如以下的產業已確定用靜態程序分析作為提升複雜軟件品質的方法:
醫療軟件:美國的美國食品藥品監督管理局確定在醫療設備上使用靜態程序分析。
核能軟件:英國的健康與安全委員會(英語:HealthandSafetyExecutive)建議針對堆保護系統(英語:ReactorProtectiveSystem)的軟件進行靜態程序分析中。
在信息安全的領域中,靜態程序分析會稱為靜態應用程序安全檢測(StaticApplicationSecurityTesting,簡稱SAST)。 [2] 

靜態程序分析形式化方法

形式化方法是一種利用純粹數學的方式分析軟件的方法,應用到的數學技巧包括指稱語義公理語義操作語義學抽象釋義等計算機科學中的方法。
針對任何圖靈完全的編程語言,不可能存在一算法可以找出任意程序在運行期間的所有錯誤,也沒有數學方法可以得到一程序是否會有運行期間的錯誤的結果。上述的結論是由庫爾特·哥德爾阿隆佐·邱奇及阿蘭·圖靈在1930年代研究停機問題所得的結果。不過如同許多不可判定問題一様,在實務仍會設法找到有用的近似解。
以下是一些形式化靜態分析的實現方式:
  • 模型檢查針對有有限狀態或是可以用抽象化簡化為有限狀態的系統。
  • 數據流分析可以收集有關程序在不同點計算所得的可能數值。
  • 抽象釋義可以被看作對計算機程序的部分執行,獲取關於它的語義信息(比如,控制結構信息流)而不進行所有計算。Frama-c及Polyspace等工具主要是以抽象釋義為基礎。
  • 在代碼中加入斷言,此方法最早是由霍爾邏輯提出。有些編程語言有對應的支持工具,例如SPARKAda編程語言的子集)、Java 建模語言(其中使用ESC/Java及ESC/Java2)及針對C語言的Frama-cWP 插件(最弱初始條件),此插件需配合延伸至ACSL(ANSI/ISO C Specification Language)的C語言。 [2] 
參考資料
  • 1.    FDA. Infusion Pump Software Safety Research at FDA. Food and Drug Administration. 2010-09-08
  • 2.    Industrial Perspective on Static Analysis. Software Engineering Journal Mar. 1995: 69-75Wichmann, B. A., A. A. Canning, D. L. Clutterbuck, L. A. Winsbarrow, N. J. Ward, and D. W. R. Marsh.