為什么當(dāng)前指令在其他基本塊中使用了,就算是逃逸變量了呢?
注意看fixstack函數(shù)的源碼,只有在判斷指令類型是AllocaInst的情況下才會修復(fù):https://github.com/bluesadi/Pluto-Obfuscator/blob/3c332857429162015aef94d875eafc95a60112f8/llvm/lib/Transforms/Obfuscation/Utils.cpp#L30
在fixStack里只會處理AllocaInst指令,所以這里的I的類型是AllocaInst,可以看作是C語言里的定義變量操作。I.isUsedOutsideOfBlock(&BB)也就是判斷AllocaInst對應(yīng)的變量有沒有在當(dāng)前基本塊以外被使用。
假設(shè)原程序在一個基本塊中定義了變量a,在這個基本塊的下一個基本塊中使用了變量a。這時候編譯這個程序不會出問題,因為編譯器知道變量a在被使用之前一定在前一個基本塊被定義了。
然而平坦化之后基本塊之間的順序被打亂了,編譯器也無法知道變量a在使用之前會不會被定義,所以會在編譯時直接報錯。解決這個問題的方法是把所有a變量的定義提前到函數(shù)的入口塊,這個過程就叫做修復(fù)逃逸變量。更具體的解釋可以看我在看雪上發(fā)的文章:https://bbs.kanxue.com/thread-268789.htm
if (!(isa<AllocaInst>(&I) && I.getParent() == &entryBB) &&
isa<AllocaInst>(&I)&&I.isUsedOutsideOfBlock(&BB))