-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Open
Description
当入口块(insert)的后继块不等于origBB的第一个元素时,会导致控制流出错,demo:
extern "C" __attribute((__annotate__(("fla")))) void func(){
//人类不太会这样写,但是一些生成代码比方说unity的il2cpp时会出现这样的代码
printf("block1\n");
int a = 0;
goto label2;
label:
printf("block2\n");
a = 1;
label2:
{
printf("block3\n");
if(a % 2 == 0){
goto label;
}
}
label3:
{
printf("block4\n");
printf("%d\n",a);
return;
}
}
可以在预处理第一个块的时候只要有后继就split,这样就保证了origBB的第一个元素一定是入口块的后继:
原代码
// Flattening.cpp : bool Flattening::flatten(Function *f)
if ((br != NULL && br->isConditional()) ||
insert->getTerminator()->getNumSuccessors() > 1) {
...
修复代码:
// Flattening.cpp : bool Flattening::flatten(Function *f)
if ((br != NULL && br->isConditional()) ||
insert->getTerminator()->getNumSuccessors() >= 1) {
....
Metadata
Metadata
Assignees
Labels
No labels