在TIE: Principled Reverse Engineering of Types in Binary Programs 中,Lee J. 等人声称解决了类型重构带来的 C 代码反编译过程中的大部分挑战。
虽然生成一个void *可能适合a 的复杂类型绝对不是微不足道的,但我只是在考虑可能的类型恢复歧义,因为它只涉及类型intor的变量int *。
int foo(int *a, int sz) {
int res = 0;
for (int *q = a; q < &a[sz]; q++)
res += *q;
return res;
}
在 32 位体系结构中,上面的代码显示了 variable 的这种歧义的示例res,因为int和int *都与 32 位寄存器兼容,反汇编代码是相同的。如果res是一个指针,它会被不正确地使用,因为我们将返回一个自动变量的地址(并且会导致未定义的行为)。
那么这个例子真的可以考虑吗(是一个有效的例子)吗?你能举出一个例子,说明这两种类型产生歧义但正确使用吗?我们是否可以得出结论,如果一个变量只是被取消引用,就可以推断出它是一个指针吗?