为什么这段代码中函数 b 和 f 被调用了两次?

问题描述 投票:0回答:1

我有一个非常奇怪的代码,据我所知,它替换了函数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();
}

我尝试通过汇编程序,但它没有给出任何特殊结果。

c++ assembly
1个回答
0
投票

什么编译器有什么选项?

编译时可见的 UB 使某些编译器假设执行路径无法访问并停止为其发出指令,包括省略函数末尾的

ret
,以便执行落入二进制文件中接下来的内容。

我猜您使用了带有

-O2
或更高版本的 Clang 或 GCC,因为这是 Clang 在实践中针对某些未定义行为所做的事情。

© www.soinside.com 2019 - 2024. All rights reserved.