我有一个非常奇怪的代码,据我所知,它替换了函数b的返回地址,从而从它调用函数f。但我不太明白为什么在函数 f 运行后,执行返回到函数 main 并从那里再次调用 b 。 P.s.:该代码仅适用于 32 位系统
#include <iostream>
int f() {
std::cout << "Hello";
return 2;
}
int b() {
int *m[1];
m[3] = (int *)&f;
return 1;
}
int main() {
return b();
}
我尝试通过汇编程序,但它没有给出任何特殊结果。
什么编译器有什么选项?
编译时可见的 UB 使某些编译器假设执行路径无法访问并停止为其发出指令,包括省略函数末尾的
ret
,以便执行落入二进制文件中接下来的内容。
我猜您使用了带有
-O2
或更高版本的 Clang 或 GCC,因为这是 Clang 在实践中针对某些未定义行为所做的事情。