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