为什么当前指令在其他基本块中使用了,就算是逃逸变量了呢?
注意看fixstack函数的源码,只有在判断指令类型是AllocaInst的情况下才会修复:https://github.com/bluesadi/Pluto-Obfuscator/blob/3c332857429162015aef94d875eafc95a60112f8/llvm/lib/Transforms/Obfuscation/Utils.cpp#L30
在fixStack里只会处理AllocaInst指令,所以这里的I的类型是AllocaInst,可以看作是C语言里的定义变量操作。I.isUsedOutsideOfBlock(&BB)也就是判断AllocaInst对应的变量有没有在当前基本块以外被使用。
假设原程序在一个基本块中定义了变量a,在这个基本块的下一个基本块中使用了变量a。这时候编译这个程序不会出问题,因为编译器知道变量a在被使用之前一定在前一个基本块被定义了。
然而平坦化之后基本块之间的顺序被打乱了,编译器也无法知道变量a在使用之前会不会被定义,所以会在编译时直接报错。解决这个问题的方法是把所有a变量的定义提前到函数的入口块,这个过程就叫做修复逃逸变量。更具体的解释可以看我在看雪上发的文章:https://bbs.kanxue.com/thread-268789.htm
if (!(isa<AllocaInst>(&I) && I.getParent() == &entryBB) &&
isa<AllocaInst>(&I)&&I.isUsedOutsideOfBlock(&BB))