控制流分析

控制流分析

控制流分析(Control flow analysis)簡稱CFA,是一種確認程序控制流程的靜態代碼分析技術。控制流程會以控制流圖來表示。對於函數編程語言及面向對象程式設計,CFA都是指計算控制流程的演演算法。控制流分析一詞最早是由Neil D. Jones及Olin Shivers開始使用。抽象釋義、約束補償及型別系統都可以用來進行控制流分析。

簡介


程序代碼的靜態分析就是通過檢查程序的源代碼來推測程序運行時的行為信息。靜態分析出了能夠檢查指定程序中存在的錯誤和安全漏洞以外,同時還能夠將其思想加入到代碼編譯器中,用於程序的優化。那麼以何種方式才能夠將靜態分析用於優化,最關鍵的技術點就是流分析技術。流分析技術是比較傳統的編譯器優化技術,流分析能夠保證程序內容真實性的狀態下,確定一個指定程序節點的相對路徑的事實。流分析技術從大體上分類,分為控制流分析和數據流分析。
控制流分析是一類用於分析程序控制流結構的靜態分析技術,目的在於生成程序的控制流圖,在編譯器設計、程序分析、程序理解等領域都有重要應用。對程序的控制流分析是對源程序或者源程序的中間表示形式的直接操作,形成控制流圖;數據流分析是在控制流分析后得出的控制流圖的基礎上,將程序中的包含數據的變數沿著控制流圖的路徑,進行賦值和傳遞,直至程序完成,變數回收或者未被回收。那麼從邏輯關係而言,控制流分析是先於數據流分析的,控制流分析對數據流分析有著先導性和支持性的作用。

類別


控制流分析在從程序的特點上說明,可以將其看作兩個大類:過程內的控制流分析和過程間的控制流分析。過程內的控制流分析可以簡單的理解為是對一個函數內部的程序執行流程的分析,而過程間的控制流分析一般情況下指的是函數的調用關係的分析。從控制流分析的特點上看,主要的分析還是基於過程內的控制流分析,針對過程內的控制流分析,有兩種主要的方法:一種方法是利用某些程序執行過程中的必經點,查找程序中的環,根據程序優化的需求,對這些環增加特定的註釋,這種方法最理想的使用是迭代數據流優化器;另一種方法是區間分析,這裡定義的區間包含了子程序整體結構的分析和嵌套區域的分析,由分析可以對源程序進行控制樹的構造,控制數即在源程序的基礎上將程序按照執行的邏輯順序,構造一顆與源程序對應的樹形數據結構,控制樹可以在數據流分析階段發揮關鍵的作用,當然,不是所有的控制流分析都是簡單的,較為複雜的控制流分析是基於複雜區間的結構分析,這樣的分析可以分析齣子程序塊中所有的控制流結構。但無論上述哪種方法的控制流分析,都需要先確定子程序的基本塊,再根據基本塊,進行程序控制流圖的構造。

靜態分析


對於程序的靜態分析,指的是在代碼不運行的方式下,對程序的源代碼通過詞法分析、語法分析以及針對程序執行邏輯的控制流的分析,來預測代碼執行的結果,以判斷執行結果是否滿足安全性、可靠性的用戶需求。因此,針對靜態分析的執行特點,需要用戶提供需要分析的目標源代碼,而且靜態分析往往需要結合人為的干預。通常,靜態分析具有以下幾個特點:不實際執行程序,執行速度快,誤報率加高。對於前兩個特點,都較好理解,符合靜態分析的執行過程,第三個特點也是靜態分析中不可避免的,因為靜態分析的人為干預因素較多,在靜態分析的過程中,人為因素佔據著分析結果中的較大成分,也正是人為干預所不能保證 100%的正確率,這就不可避免的增加了結果錯誤分析的幾率。

控制流圖


控制流圖(Control Flow Graph, CFG)也叫控制流程圖,是一個過程或程序的抽象表現,是用在編譯器中的一個抽象數據結構,由編譯器在內部維護,代表了一個程序執行過程中會遍歷到的所有路徑。它用圖的形式表示一個過程內所有基本塊執行的可能流向, 也能反映一個過程的實時執行過程。控制流圖中每個在圖形中的節點代表一個基本塊,例如,沒有任何跳躍或跳躍目標的直線代碼塊;跳躍目標以一個塊開始,和以一個塊結束。定向邊緣被用於代表在控制流中的跳躍。在那裡,在大部分介紹中,兩個特定的設計塊:項目塊,通過它控制到流圖的輸入,和編輯塊,通過它全面控制流輸出。