【課程筆記】南大軟件分析課程4——數據流分析基礎(課時5/6)

關于這一節zcc的筆記已經夠完美了,我就直接在他基礎上記錄了。

目錄:

  1. 迭代算法-另一個角度
  2. 偏序(Partial Order)
  3. 上下界(Upper and Lower Bounds)
  4. 格(Lattice),半格(Semilattice),全格和格點積(Complete and Product Lattice)
  5. 數據流分析框架(via Lattice)
  6. 單調性與不動點定理(Monotonicity and Fixed Point Theorem)
  7. 迭代算法轉化為不動點理論
  8. 從lattice的角度看may/must分析
  9. 分配性(Distributivity)和MOP
  10. 常量傳播
  11. Worklist算法

重點:

上節課是介紹了3種數據流分析迭代算法,本節課將從數學理論的角度來討論數據流分析,加深對數據流分析算法的理解。


1.迭代算法-另一個角度

本質:常見的數據流迭代算法,目的是通過迭代計算,最終得到一個穩定的不變的解。

(1)理論

定義1:給定有k個節點(基本塊)的CFG,迭代算法就是在每次迭代時,更新每個節點n的OUT[n]。

定義2:設數據流分析的值域是V,可定義一個k-元組: (OUT[n1], OUT[n2], ... , OUT[nk])。是集合 (V1 \times V2 ... \times Vk) (冪集,記為Vk)的一個元素,表示每次迭代后k個節點整體的值。

定義3:每一次迭代可看作是Vk映射到新的Vk,通過轉換規則和控制流來映射,記作函數F:Vk \rightarrow Vk

迭代算法本質:通過不斷迭代,直到相鄰兩次迭代的k-元組值一樣,算法結束。

(2)圖示

4-1-迭代算法數學化.png

不動點:當Xi = F(Xi)時,就是不動點。

問題

  • 迭代算法是否一定會停止(到達不動點)?
  • 迭代算法如果會終止,會得到幾個解(幾個不動點)?
  • 迭代幾次會得到解(到達不動點)?

2.偏序(Partial Order)

定義:給定偏序集(P, \sqsubseteq),\sqsubseteq是集合P上的二元關系,若滿足以下性質則為偏序集:

  • ?xP,x?x 自反性Reflexivity
  • ?x,yP, x?yy?x ? x=y 對稱性Antisymmetry
  • ?x,yP, x?yy?z ? x?z 傳遞性Transitivity

例子

  • P是整數集,\sqsubseteq表示\leq,是偏序集;若\sqsubseteq表示<,則顯然不是偏序集。
  • P是英文單詞集合,\sqsubseteq表示子串關系(可以存在兩個元素不具有偏序關系,不可比性),是偏序集。

3.上下界(Upper and Lower Bounds)

(1)定義

定義:給定偏序集(P, \sqsubseteq),且有P的子集S?P:

  • ?xS, x?u, 其中uP,則u是子集S的上界 (注意,u并不一定屬于S集
  • ?xS, l?x, 其中lP,則l是S的下界

最小上界:least upper bound(lub 或者稱為join),用?S表示。上確界?

定義:對于子集S的任何一個上界u,均有?S?u。

最大下界:greatest lower bound(glb 或者稱為meet),用?S表示。下確界?

定義:對于子集S的任何一個下界l,均有l??S。

(2)示例

若S只包含兩個元素,a、b(S = {a, b})那么上界可以表示為a?b,下界可以表示為a?b。

4-3-1-上下確界示例.png
(3)特性
  • 并非每個偏序集都有上下確界。
4-3-2-無下確界.png
  • 如果存在上下確界,則是唯一的。

    利用傳遞性和反證法即可證明。


4.格(Lattice),(半格)Semilattice,全格,格點積(Complete and Product Lattice)

都是基于上下確界來定義的。

(1)格

定義:給定一個偏序集(P,?),?a,b∈P,如果存在a?b和a?b,那么就稱該偏序集為格。偏序集中的任意兩個元素構成的集合均存在最小上界和最大下界,那么該偏序集就是格。

例子

  • (S, ?)中S是整數子集,\sqsubseteq\leq,是格點;
  • (S, ?)中S是英文單詞集,\sqsubseteq表示子串關系,不是格點,因為單詞pin和sin就沒有上確界;
  • (S, ?)中S是{a, b, c}的冪集,\sqsubseteq表示\subseteq子集,是格點。

(2)半格

定義:給定一個偏序集(P,?),?a,b∈P:
當且僅當a?b存在(上確界),該偏序集叫做 join semilatice;

當且僅當a?b存在(下確界),該偏序集叫做 meet semilatice

(3)全格

定義:對于格點 (S, \sqsubseteq) (前提是格點)的任意子集S,?S上確界和?S下確界都存在,則為全格complete lattice。

例子

  • P是整數集,\sqsubseteq\leq,不是全格,因為P的子集正整數集沒有上確界。
  • (S, ?)中S是{a, b, c}的冪集,\sqsubseteq表示\subseteq子集,是全格。

符號\top = \sqcupP ,叫做top;\perp = \sqcapP,叫做bottom。

性質:有窮的格點必然是complete lattice。全格一定有窮嗎? 不一定,如實數界[0, 1]。

(4)格點積

定義:給定一組格,L1=(P1, \sqsubseteq1),L2=(P2, \sqsubseteq2),... ,Ln=(Pn, \sqsubseteqn),都有上確界\sqcupi和下確界\sqcapi,則定義格點積 Ln = (P, \sqsubseteq):

  1. P = P1 \times ... \times Pn
  2. (x1, ... xn) \sqsubseteq (y1, ... yn) \Leftrightarrow (x1 \sqsubseteq y1) \wedge ... \wedge (xn \sqsubseteq yn)
  3. (x1, ... xn) \sqcup (y1, ... yn) = (x1 \sqcup y1, ..., xn \sqcup yn)
  4. (x1, ... xn) \sqcap (y1, ... yn) = (x1 \sqcap y1, ..., xn \sqcap yn)

性質:格點積也是格點;格點都是全格,則格點積也是全格。


5.數據流分析框架(via Lattice)

數據流分析框架(D, L, F) :

  • D—方向
  • L—格點(值域V,meet \sqcap 或 join \sqcup 操作)
  • F—轉換規則V \rightarrow V。

數據流分析可以看做是迭代算法格點 利用轉換規則meet/join操作


6.單調性與不動點定理(Monotonicity and Fixed Point Theorem)

目標問題:迭代算法一定會停止(到達不動點)嗎?

(1)單調性

定義:函數f: L \rightarrow L,滿足?x,y∈L,x?y?f(x)?f(y),則為單調的。

(2)不動點理論

定義:給定一個完全lattice(L,?),如果f:L→L是單調的,并且L有限

那么我們能得到最小不動點,通過迭代:f(⊥),f(f(⊥)),...,fk(⊥)直到找到最小的一個不動點。

同理 我們能得到最大不動點,通過迭代:f(?),f(f(?)),...,fk(?)直到找到最大的一個不動點。

(3)證明

不動點的存在性;

最小不動點證明。


7.迭代算法轉化為不動點理論

問題:我們如何在理論上證明迭代算法有解有最優解何時到達不動點?那就是將迭代算法轉化為不動點理論。因為不動點理論已經證明了,單調、有限的完全lattice,存在不動點,且從?開始能找到最大不動點,從⊥開始能找到最小不動點。

目標:證明迭代算法是一個完全lattice(L, \sqsubseteq),是有限的,單調的。

4-7-1-迭代算法.png

(1)完全lattice證明

根據第5小節,迭代算法每個節點(基本塊)的值域相當于一個lattice,每次迭代的k個基本塊的值域就是一個k-元組。k-元組可看作lattice積,根據格點積性質:若Lk中每一個lattice都是完全的,則Lk也是完全的。

(2)L是有限的

迭代算法中,值域是0/1,是有限的,則lattice有限,則Lk也有限。

(3)F是單調的

函數F:BB中轉換函數fi:L → L + BB分支之間的控制流影響(匯聚是join \sqcup / meet \sqcap 操作,分叉是拷貝操作)。

  1. 轉換函數:BB的gen、kill是固定的,值域一旦變成1,就不會變回0,顯然單調。
  2. join/meet操作:L × L → L 。證明:?x,y,z∈L,且有x?y需要證明x?z?y?z。

總結:迭代算法是完全lattice,且是有限、單調的,所以一定有解、有最優解。

(4)算法何時到達不動點?

定義lattice高度—從lattice的top到bottom之間最長的路徑。

4-7-3-lattice高度定義.png

最壞情況迭代次數:設有n個塊,每次迭代只有1個BB的OUT/IN值的其中1位發生變化(則從top→bottom這1位都變化),則最多迭 (n × h) 次。


8.從lattice的角度看may/must分析

說明:may 和 must 分析算法都是從不安全到安全(是否安全取決于safe-aprroximate過程),從準確到不準確。

4-8-1-must_may分析特點.png

(1)may分析

以 Reaching Definitions分析為例:

  1. \perp 開始,\perp 表示所有定義都不可達,是不安全的結果(因為這個分析的應用目的是為了查錯,查看變量是否需要初始化。首先在Entry中給每個變量一個假定義,標記所有變量為都為未初始化狀態,\perp表示所有的假定義都無法到達,說明所有變量在中間都進行了賦值,那就不需要對任何變量進行初始化,這是不安全的,可能導致未初始化錯誤)。

  2. \top表示所有Entry中的假定義都可達,從查錯角度來說,需要對每個變量都進行初始化,非常安全!但是這句話沒有用,我都要初始化的話還做這個分析干嘛?

  3. Truth:表明最準確的驗證結果,假設{a,c}是truth,那么包括其以上的都是safe的,以下的都是unsafe,就是上圖的陰影和非陰影。

4-8-2-Truth示例.png
  1. \perp\top ,得到的最小不動點最準確,離Truth最近。上面還有多個不動點,越往上越不準。

(2)must分析

以available expressions分析為例:

  1. \top開始,表示所有表達式可用。如果用在表達式計算優化中,那么有很多已經被重定義的表達式也被優化了(實際上不能被優化),那么該優化就是錯誤的,不安全
  2. \perp表示沒有表達式可用,都不需要優化,很安全!但沒有用。
  3. \top\perp,就是從不安全到安全,存在一個Truth,代表準確的結果。
  4. \top\perp,達到一個最大不動點,離truth最近的最優解。

迭代算法轉化到lattice上,may/must分析分別初始化為最小值\perp和最大值\top,最后求最小上界/最大下界。


9.分配性(Distributivity)和MOP

目的:MOP(meet-over-all-paths)衡量迭代算法的精度。

(1)概念

定義:最終將所有的路徑一起來進行join/meet操作。

路徑P = 在cfg圖上從entry到基本塊si的一條路徑(P = Entry → s1 → s2 → ... → s~i )。

路徑P上的轉移函數Fp:該路徑上所有語句的轉移函數的組合fs1,fs2,... ,fsi-1,從而構成FP

MOP:從entry到si所有路徑的FP的meet操作。本質—求這些值的最小上界/最大下界。

4-9-1-MOP公式.png

MOP準確性:有些路徑不會被執行,所以不準確;若路徑包含循環,或者路徑爆炸,所以實操性不高,只能作為理論的一種衡量方式。

(2)MOP vs 迭代算法

4-9-2-MOP與迭代算法比較.png

對于以上的CFG,抽象出itter和MOP公式。

證明

  1. 根據最小上界的定義,有x?x?y和 y?x?y。

  2. 由于轉換函數是單調的,則有F(x)?F(x?y)和F(y)?F(x?y),所以F(x?y)就是F(x)和F(y)的上界。

  3. 根據定義,F(x)?F(y)是F(x)和F(y)的最小上界。

  4. 所以F(x)?F(y)?F(x?y)

結論:所以,MOP更準確。若F滿足分配律,則迭代算法和MOP精確度一樣 F(x?y)=F(x)?F(y)。一般,對于控制流的join/meet,是進行集合的交或并操作,則滿足分配律。


10.常量傳播 (constant propagation)

問題描述:在程序點p處的變量x,判斷x是否一定指向常量值。

類別must分析,因為要考慮經過p點所有路徑上,x的值必須都一樣,才算作一定指向常量。

表示:CFG每個節點的OUT是pair(x, v)的集合,表示變量x是否指向常數v。

數據流分析框架(D, L, F)

(1)D:forward更直觀

(2)L:lattice

4-10-1-UNDEF_NAC.png

變量值域:所有實數。must分析,所以\top是UNDEF未定義(unsafe),\perp 是NAC非常量(safe)。

meet操作:must分析, \sqcap。在每個路徑匯聚點PC,對流入的所有變量進行meet操作,但并非常見的交和并,所以不滿足分配律

  • NAC \sqcap v = NAC
  • UNDEF \sqcap v = v 未初始化的變量不是我們分析的目標。
  • c \sqcap v = ? c \sqcap c = c c1 \sqcap c2 =NAC

(3)F轉換函數

OUT[s] = gen U (IN[s] - {(x, _})

輸出 = BB中新被賦值的 U 輸入 - BB中相關變量值已經不是f常量的部分。

對所有的賦值語句進行分析(不是賦值語句則不管,用val(x)表示x指向的值):

4-10-2-賦值語句操作.png

(4)性質:不滿足分配律

4-10-3-不滿足分配律.png

可以發現,MOP更準確。F(X\sqcapY) \sqsubseteq F(X) \sqcap F(Y),但是是單調的。


11.Worklist算法

本質:對迭代算法進行優化,采用隊列來存儲需要處理的基本塊,減少大量的冗余的計算。

4-11-worklist.png

參考

軟件分析——數據流分析2

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。