關于這一節zcc的筆記已經夠完美了,我就直接在他基礎上記錄了。
目錄:
- 迭代算法-另一個角度
- 偏序(Partial Order)
- 上下界(Upper and Lower Bounds)
- 格(Lattice),半格(Semilattice),全格和格點積(Complete and Product Lattice)
- 數據流分析框架(via Lattice)
- 單調性與不動點定理(Monotonicity and Fixed Point Theorem)
- 迭代算法轉化為不動點理論
- 從lattice的角度看may/must分析
- 分配性(Distributivity)和MOP
- 常量傳播
- Worklist算法
重點:
上節課是介紹了3種數據流分析迭代算法,本節課將從數學理論的角度來討論數據流分析,加深對數據流分析算法的理解。
1.迭代算法-另一個角度
本質:常見的數據流迭代算法,目的是通過迭代計算,最終得到一個穩定的不變的解。
(1)理論
定義1:給定有k個節點(基本塊)的CFG,迭代算法就是在每次迭代時,更新每個節點n的OUT[n]。
定義2:設數據流分析的值域是V,可定義一個k-元組: (OUT[n1], OUT[n2], ... , OUT[nk])。是集合 (V1 V2 ...
Vk) (冪集,記為Vk)的一個元素,表示每次迭代后k個節點整體的值。
定義3:每一次迭代可看作是Vk映射到新的Vk,通過轉換規則和控制流來映射,記作函數F:Vk Vk。
迭代算法本質:通過不斷迭代,直到相鄰兩次迭代的k-元組值一樣,算法結束。
(2)圖示
不動點:當Xi = F(Xi)時,就是不動點。
問題:
- 迭代算法是否一定會停止(到達不動點)?
- 迭代算法如果會終止,會得到幾個解(幾個不動點)?
- 迭代幾次會得到解(到達不動點)?
2.偏序(Partial Order)
定義:給定偏序集(P, ),
是集合P上的二元關系,若滿足以下性質則為偏序集:
- ?x∈P,x?x 自反性Reflexivity
- ?x,y∈P, x?y∧y?x ? x=y 對稱性Antisymmetry
- ?x,y∈P, x?y∧y?z ? x?z 傳遞性Transitivity
例子:
- P是整數集,
表示
,是偏序集;若
表示<,則顯然不是偏序集。
- P是英文單詞集合,
表示子串關系(可以存在兩個元素不具有偏序關系,不可比性),是偏序集。
3.上下界(Upper and Lower Bounds)
(1)定義
定義:給定偏序集(P, ),且有P的子集S?P:
- ?x∈S, x?u, 其中u∈P,則u是子集S的上界 (注意,u并不一定屬于S集)
- ?x∈S, l?x, 其中l∈P,則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。
(3)特性
- 并非每個偏序集都有上下確界。
-
如果存在上下確界,則是唯一的。
利用傳遞性和反證法即可證明。
4.格(Lattice),(半格)Semilattice,全格,格點積(Complete and Product Lattice)
都是基于上下確界來定義的。
(1)格
定義:給定一個偏序集(P,?),?a,b∈P,如果存在a?b和a?b,那么就稱該偏序集為格。偏序集中的任意兩個元素構成的集合均存在最小上界和最大下界,那么該偏序集就是格。
例子:
- (S, ?)中S是整數子集,
是
,是格點;
- (S, ?)中S是英文單詞集,
表示子串關系,不是格點,因為單詞pin和sin就沒有上確界;
- (S, ?)中S是{a, b, c}的冪集,
表示
子集,是格點。
(2)半格
定義:給定一個偏序集(P,?),?a,b∈P:
當且僅當a?b存在(上確界),該偏序集叫做 join semilatice;
當且僅當a?b存在(下確界),該偏序集叫做 meet semilatice
(3)全格
定義:對于格點 (S, ) (前提是格點)的任意子集S,?S上確界和?S下確界都存在,則為全格complete lattice。
例子:
- P是整數集,
是
,不是全格,因為P的子集正整數集沒有上確界。
- (S, ?)中S是{a, b, c}的冪集,
表示
子集,是全格。
符號: =
P ,叫做top;
=
P,叫做bottom。
性質:有窮的格點必然是complete lattice。全格一定有窮嗎? 不一定,如實數界[0, 1]。
(4)格點積
定義:給定一組格,L1=(P1, 1),L2=(P2,
2),... ,Ln=(Pn,
n),都有上確界
i和下確界
i,則定義格點積 Ln = (P,
):
- P = P1
...
Pn
- (x1, ... xn)
(y1, ... yn)
(x1
y1)
...
(xn
yn)
- (x1, ... xn)
(y1, ... yn) = (x1
y1, ..., xn
yn)
- (x1, ... xn)
(y1, ... yn) = (x1
y1, ..., xn
yn)
性質:格點積也是格點;格點都是全格,則格點積也是全格。
5.數據流分析框架(via Lattice)
數據流分析框架(D, L, F) :
- D—方向
- L—格點(值域V,meet
或 join
操作)
- F—轉換規則V
V。
數據流分析可以看做是迭代算法對格點 利用轉換規則和 meet/join操作。
6.單調性與不動點定理(Monotonicity and Fixed Point Theorem)
目標問題:迭代算法一定會停止(到達不動點)嗎?
(1)單調性
定義:函數f: L 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, ),是有限的,單調的。
(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 / meet
操作,分叉是拷貝操作)。
- 轉換函數:BB的gen、kill是固定的,值域一旦變成1,就不會變回0,顯然單調。
- join/meet操作:L × L → L 。證明:?x,y,z∈L,且有x?y需要證明x?z?y?z。
總結:迭代算法是完全lattice,且是有限、單調的,所以一定有解、有最優解。
(4)算法何時到達不動點?
定義:lattice高度—從lattice的top到bottom之間最長的路徑。
最壞情況迭代次數:設有n個塊,每次迭代只有1個BB的OUT/IN值的其中1位發生變化(則從top→bottom這1位都變化),則最多迭 (n × h) 次。
8.從lattice的角度看may/must分析
說明:may 和 must 分析算法都是從不安全到安全(是否安全取決于safe-aprroximate過程),從準確到不準確。
(1)may分析
以 Reaching Definitions分析為例:
從
開始,
表示所有定義都不可達,是不安全的結果(因為這個分析的應用目的是為了查錯,查看變量是否需要初始化。首先在Entry中給每個變量一個假定義,標記所有變量為都為未初始化狀態,
表示所有的假定義都無法到達,說明所有變量在中間都進行了賦值,那就不需要對任何變量進行初始化,這是不安全的,可能導致未初始化錯誤)。
表示所有Entry中的假定義都可達,從查錯角度來說,需要對每個變量都進行初始化,非常安全!但是這句話沒有用,我都要初始化的話還做這個分析干嘛?
Truth:表明最準確的驗證結果,假設{a,c}是truth,那么包括其以上的都是safe的,以下的都是unsafe,就是上圖的陰影和非陰影。
- 從
到
,得到的最小不動點最準確,離Truth最近。上面還有多個不動點,越往上越不準。
(2)must分析
以available expressions分析為例:
- 從
開始,表示所有表達式可用。如果用在表達式計算優化中,那么有很多已經被重定義的表達式也被優化了(實際上不能被優化),那么該優化就是錯誤的,不安全!
-
表示沒有表達式可用,都不需要優化,很安全!但沒有用。
- 從
到
,就是從不安全到安全,存在一個Truth,代表準確的結果。
- 從
到
,達到一個最大不動點,離truth最近的最優解。
迭代算法轉化到lattice上,may/must分析分別初始化為最小值和最大值
,最后求最小上界/最大下界。
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操作。本質—求這些值的最小上界/最大下界。
MOP準確性:有些路徑不會被執行,所以不準確;若路徑包含循環,或者路徑爆炸,所以實操性不高,只能作為理論的一種衡量方式。
(2)MOP vs 迭代算法
對于以上的CFG,抽象出itter和MOP公式。
證明:
根據最小上界的定義,有x?x?y和 y?x?y。
由于轉換函數是單調的,則有F(x)?F(x?y)和F(y)?F(x?y),所以F(x?y)就是F(x)和F(y)的上界。
根據定義,F(x)?F(y)是F(x)和F(y)的最小上界。
所以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
變量值域:所有實數。must分析,所以是UNDEF未定義(unsafe),
是NAC非常量(safe)。
meet操作:must分析, 。在每個路徑匯聚點PC,對流入的所有變量進行meet操作,但并非常見的交和并,所以不滿足分配律。
- NAC
v = NAC
- UNDEF
v = v 未初始化的變量不是我們分析的目標。
- c
v = ? c
c = c c1
c2 =NAC
(3)F轉換函數
OUT[s] = gen U (IN[s] - {(x, _})
輸出 = BB中新被賦值的 U 輸入 - BB中相關變量值已經不是f常量的部分。
對所有的賦值語句進行分析(不是賦值語句則不管,用val(x)表示x指向的值):
(4)性質:不滿足分配律
可以發現,MOP更準確。F(XY)
F(X)
F(Y),但是是單調的。
11.Worklist算法
本質:對迭代算法進行優化,采用隊列來存儲需要處理的基本塊,減少大量的冗余的計算。