首页
社区
课程
招聘
逃逸变量的判断为什么是这样的I.isUsedOutsideOfBlock(&BB)

为什么当前指令在其他基本块中使用了,就算是逃逸变量了呢?

收藏
2条回答
34r7hm4n 2023-6-1

注意看fixstack函数的源码,只有在判断指令类型是AllocaInst的情况下才会修复:https://github.com/bluesadi/Pluto-Obfuscator/blob/3c332857429162015aef94d875eafc95a60112f8/llvm/lib/Transforms/Obfuscation/Utils.cpp#L30

回复 已采纳
ashLL: 那是不是应该这样写啊
  if  (!(isa<AllocaInst>(&I)  &&  I.getParent()  ==  &entryBB)  &&
                                        isa<AllocaInst>(&I)&&I.isUsedOutsideOfBlock(&BB))
回复 2023-6-2
34r7hm4n: @AshCrimson 抱歉,这里说错了。不是只处理AllocaInst指令,是除了在入口块的AllocaInst指令都要处理,包括Add指令,Load指令之类的。
回复 2023-6-3
34r7hm4n: @AshCrimson 就比如说`x  =  add  y,  z`指令在别的基本块被使用了,就说明那个基本块使用了x变量,这时候把x称为逃逸变量。
回复 2023-6-3
34r7hm4n 2023-6-1 2023-6-1编辑

在fixStack里只会处理AllocaInst指令,所以这里的I的类型是AllocaInst,可以看作是C语言里的定义变量操作。I.isUsedOutsideOfBlock(&BB)也就是判断AllocaInst对应的变量有没有在当前基本块以外被使用。

 

假设原程序在一个基本块中定义了变量a,在这个基本块的下一个基本块中使用了变量a。这时候编译这个程序不会出问题,因为编译器知道变量a在被使用之前一定在前一个基本块被定义了。

 

然而平坦化之后基本块之间的顺序被打乱了,编译器也无法知道变量a在使用之前会不会被定义,所以会在编译时直接报错。解决这个问题的方法是把所有a变量的定义提前到函数的入口块,这个过程就叫做修复逃逸变量。更具体的解释可以看我在看雪上发的文章:https://bbs.kanxue.com/thread-268789.htm

回复
LLVM与代码混淆技术
  参与学习     324 人
  提问次数     12 个
《LLVM与代码混淆技术》详解3种经典代码混淆方式+2种变体
我的问答 领取收益
0
我的提问
0
我的回答
0
学习收益