源程式靜態分析

源程式靜態分析

源程式靜態分析是指利用靜態分析技術對源程式進行靜態分析,從而是的源程式方便使用者閱讀和使用的技術。

基本介紹

  • 中文名:源程式靜態分析
  • 外文名:source program static analysis
  • 定義:對源程式進行靜態分析的技術
  • 分析方法:生產引用表、靜態錯誤分析
  • 套用:程式理解、檢測等
  • 涉及領域:軟體技術
相關概念,原理,方法,生成各種引用表,靜態錯誤分析,

相關概念

源程式:是指未經編譯的,按照一定的程式設計語言規範書寫的,人類可讀的文本檔案。通常由高級語言編寫。源程式可以是以書籍或者磁帶或者其他載體的形式出現,但最為常用的格式是文本檔案,這種典型格式的目的是為了編譯出計算機可執行的程式。將人類可讀的程式代碼文本翻譯成為計算機可以執行的二進制指令,這種過程叫做編譯,由各種編譯器來完成。一般用高級語言編寫的程式稱為“源程式”
靜態分析技術:是指不執行被測軟體,可對需求分析說明書、軟體設計說明書、源程式做結構檢查、流程分析、符號執行來找出軟體錯誤。

原理

程式的結構形式是白盒測試的主要依據。在軟體系統中,代碼以文本格式被寫入多個檔案中,很難閱讀理解,需要其他一些東西來幫助人們閱讀理解,如各種圖表等,靜態結構分析滿足了這樣的需求。
在靜態結構分析中,測試者通過使用測試工具分析程式原始碼的系統結構、數據結構、數據接口、內部控制邏輯等內部結構,生成函式調用關係圖、模組控制流圖、內部檔案調用關係圖、子程式表、宏和函式參數表等各類圖形圖表,可以清晰地標識整個軟體系統的組成結構,使其便於閱讀與理解,然後可以通過分析這些圖表,檢查軟體有沒有存在缺陷或錯誤。
其中函式調用關係圖通過應用程式中各函式之間的調用關係展開了系統的結構。通過查看函式調用關係圖,可以檢查函式之間的調用關係是否符合要求、是否存在遞歸調用、函式的調用層次是否過深、有沒有存在孤立的沒有被調用的函式。從而可以發現系統是否存在結構缺陷,發現哪些函式是重要的、哪些是次要的、需要使用什麼級別的覆蓋要求等。

方法

通常採用以下一些方法進行源程式的靜態分析。

生成各種引用表

1)直接從表中查出說明/使用錯誤等。如,循環層次表、變數交叉引用表、標號交叉引用表等。
2)為用戶提供輔助信息。如,子程式(宏、函式)引用表、等價(變數、標號)表、常數表等。
3)用來做錯誤預測和程式複雜度計算。如,操作符和運算元的統計表等。
標號交叉引用表:列出在各模組中出現的全部標號。其順序可以是按標號出現的先後次序,也可以是字典順序。在表中標出標號的屬性:已說明、未說明、已使用、未使用。表中還包括在模組以外的全局標號、計算標號等。
變數交叉引用表:即變數定義與引用表。在表中,變數的順序可以按它在程式中出現的先後次序,也可以按字典順序,還可以按它們的類型排序。表中應標明各變數的屬性:已說明、未說明、隱式說明,以及類型及使用情況。進一步,還可區分是否出現在賦值語句的右邊,是否屬於COMMON變數、全局變數或特權變數等。
子程式、宏和函式表:在表中列出各個子程式、宏和函式的屬性:已定義、未定義、定義類型;以及參數表、輸入參數的個數、順序、類型,輸出參數的個數、順序、類型;已引用、未引用、引用次數等等。
等價表:表中列出在等價語句或等值語句中出現的全部變數和標號。
常數表:表中列出全部數字常數和字元常數,並指出它們在哪些語句中首先被定義,即首先出現在哪些賦值語句的左部或哪些數據語句或參數語句中。

靜態錯誤分析

靜態錯誤分析主要用於確定在源程式中是否有某類錯誤或“危險”結構。
1)類型和單位分析:為了強化對源程式數據類型的檢查,發現在數據類型上的錯誤和單位上的不一致性,在程式設計語言中擴充了一些結構。如單位分析要求使用一種預處理器,它能夠通過使用一般的組合/消去規則,確定表達式的單位。
2)引用分析:在靜態錯誤分析中,最廣泛使用的技術就是發現引用異常。如果沿著程式的控制路徑,變數在賦值以前被引用,或變數在賦值以後未被引用,這時就發生了引用異常。
為了檢測引用異常,需要檢查通過程式的每一條路徑。通常採用類似深度優先的方法遍歷程式流圖的每一條路徑。也可以建立引用異常的探測工具。這種工具包括兩個表:定義表和未引用表。每張表中都包含一組變數名。未引用表中包括已被賦值,但還未被引用的一些變數。
當掃描抵達一個出度大於1的節點V時,深度優先探測算法要求先檢查最左分支的那一部分程式流圖,然後再檢查其他分支。在遍歷最左分支之前,應把定義表與未引用表的當前內容用一個棧暫時存儲起來,當最左分支檢查完之後,算法控制返回到該節點V,應從棧中恢復該節點的定義表和未引用表的老的付本,然後再去遍歷該節點的下一個分支。這個過程要繼續到檢查完全部分支為止。
3)表達式分析:對表達式進行分析,以發現和糾正在表達式中出現的錯誤。包括:在表達式中不正確地使用了括弧造成錯誤,數組下標越界造成錯誤,除式為零造成錯誤,對負數開平方,或對π求正切值造成錯誤,以及對浮點數計算的誤差進行檢查。具體包括:
①在表達式中不正確地使用了括弧造成的錯誤。
②數組下標越界造成的錯誤。如果數組維數是常量,而數組下標引用也是常量,則檢查越界很容易;如果數組的維數是常量,而數組下標引用是變數,例如用循環控制變數做數組下標,則要對這個變數的變化做分析。
③除式為零造成的錯誤。為了檢查這類錯誤,必須能夠從表達式反向追蹤到需求,確認使除式為零的輸入變數不屬於輸入空間。
④對負數開平方,或對π求正切值造成的錯誤。可用類似於零除式的方式進行處理。
⑤最複雜的一類表達式分析是對浮點數計算的誤差進行檢查。由於使用二進制數不精確地表示十進制浮點數,常常使計算結果出乎意料之外。
4)接口分析:關於接口的靜態錯誤分析主要檢查過程、函式過程之間接口的一致性。因此要檢查形參與實參在類型、數量、維數、順序、使用上的一致性;檢查全局變數和公共數據區在使用上的一致性。
①接口一致性的設計分析檢查模組之間接口的一致性和模組與外部資料庫之間接口的一致性。
②程式關於接口的靜態錯誤分析檢查過程、函式過程之間接口的一致性。因此,要檢查形參與實參在類型、數量、維數、順序、使用上的一致性;檢查全局變數和公共數據區在使用上的一致性。

相關詞條

熱門詞條

聯絡我們