簡介
程式代碼的靜態分析就是通過檢查程式的原始碼來推測程式運行時的行為信息。靜態分析出了能夠檢查指定程式中存在的錯誤和安全漏洞以外,同時還能夠將其思想加入到代碼編譯器中,用於程式的最佳化。那么以何種方式才能夠將靜態分析用於最佳化,最關鍵的技術點就是流分析技術。流分析技術是比較傳統的編譯器最佳化技術,流分析能夠保證程式內容真實性的狀態下,確定一個指定程式節點的相對路徑的事實。 流分析技術從大體上分類,分為控制流分析和數據流分析。
控制流分析是一類用於分析程式控制流結構的靜態分析技術,目的在於生成程式的控制流圖,在編譯器設計、程式分析、程式理解等領域都有重要套用。對程式的控制流分析是對源程式或者源程式的中間表示形式的直接操作,形成控制流圖;數據流分析是在控制流分析後得出的控制流圖的基礎上,將程式中的包含數據的變數沿著控制流圖的路徑,進行賦值和傳遞,直至程式完成,變數回收或者未被回收。那么從邏輯關係而言,控制流分析是先於數據流分析的,控制流分析對數據流分析有著先導性和支持性的作用。
類別
控制流分析在從程式的特點上說明,可以將其看作兩個大類:過程內的控制流分析和過程間的控制流分析。過程內的控制流分析可以簡單的理解為是對一個函式內部的程式執行流程的分析,而過程間的控制流分析一般情況下指的是函式的調用關係的分析。從控制流分析的特點上看,主要的分析還是基於過程內的控制流分析,針對過程內的控制流分析,有兩種主要的方法:一種方法是利用某些程式執行過程中的必經點,查找程式中的環,根據程式最佳化的需求,對這些環增加特定的注釋,這種方法最理想的使用是疊代數據流最佳化器;另一種方法是區間分析,這裡定義的區間包含了子程式整體結構的分析和嵌套區域的分析,由分析可以對源程式進行控制樹的構造,控制數即在源程式的基礎上將程式按照執行的邏輯順序,構造一顆與源程式對應的樹形數據結構,控制樹可以在數據流分析階段發揮關鍵的作用,當然,不是所有的控制流分析都是簡單的,較為複雜的控制流分析是基於複雜區間的結構分析,這樣的分析可以分析出子程式塊中所有的控制流結構。但無論上述哪種方法的控制流分析,都需要先確定子程式的基本塊,再根據基本塊,進行程式控制流圖的構造 。
靜態分析
對於程式的靜態分析,指的是在代碼不運行的方式下,對程式的原始碼通過詞法分析、語法分析以及針對程式執行邏輯的控制流的分析,來預測代碼執行的結果,以判斷執行結果是否滿足安全性、可靠性的用戶需求。因此,針對靜態分析的執行特點,需要用戶提供需要分析的目標原始碼,而且靜態分析往往需要結合人為的干預。 通常,靜態分析具有以下幾個特點:不實際執行程式,執行速度快,誤報率加高。對於前兩個特點,都較好理解,符合靜態分析的執行過程,第三個特點也是靜態分析中不可避免的,因為靜態分析的人為干預因素較多,在靜態分析的過程中,人為因素占據著分析結果中的較大成分,也正是人為干預所不能保證 100%的正確率,這就不可避免的增加了結果錯誤分析的幾率。
控制流圖
控制流圖(Control Flow Graph, CFG)也叫控制流程圖,是一個過程或程式的抽象表現,是用在編譯器中的一個抽象數據結構,由編譯器在內部維護,代表了一個程式執行過程中會遍歷到的所有路徑。它用圖的形式表示一個過程內所有基本塊執行的可能流向, 也能反映一個過程的實時執行過程。控制流圖中每個在圖形中的節點代表一個基本塊,例如,沒有任何跳躍或跳躍目標的直線代碼塊;跳躍目標以一個塊開始,和以一個塊結束。定向邊緣被用於代表在控制流中的跳躍。在那裡,在大部分介紹中,兩個特定的設計塊:項目塊,通過它控制到流圖的輸入,和編輯塊,通過它全面控制流輸出。