gpt4 book ai didi

c++ - 有趣的程序行为

转载 作者:太空宇宙 更新时间:2023-11-04 15:02:34 27 4
gpt4 key购买 nike

所以我有一个小程序

#include <iostream>
using namespace std;

void lol() {
cout << "How did we get here?"<<std::endl;
}

int main()
{
long a, b, z[10];
cin >> a >> b;
z[a] = b;
}

您可以通过在线编译器运行它here

该程序没有任何目的,但它有一个错误或功能 - 我不知道它是什么。所以,如果你写这样的东西main 13 2015 你可能什么也得不到,但如果你输入两个魔数(Magic Number) 134196608 你会得到一个错误。此外,该程序执行函数 void lol() 并打印行 How did we get here?

我运行了 nm ./main 并找到了我的函数 void lol(),地址 0000000000400900 等于 4196608 (计数系统的基数是 10)。

这意味着程序出于某种原因“跳转”到该地址并执行函数void lol()。此外,如果我更改第一个数字,则不会发生任何事情。main 10 4196608, main 11 4196608, main 12 4196608, main 14 4196608, main 15 4196608 - 都一样,没有错误,但是只要我输入数字 13,我就会得到这个有趣的行为。

谁能解释一下这是怎么回事?

最佳答案

如果 a 的输入是大于 9(或负数)的数字,则您正在错误地访问 z[a](越界索引,buffer overflow)因为你声明了一个数组 long z[10]

这是典型的 undefined behavior (UB)。

UB 非常糟糕,参见this answer我的,或更多背景:

解释某些实际未定义行为的唯一方法是深入研究所有具体实现细节(编译器、优化、操作系统、机器代码、处理器等......)。你可以花很多年在这上面。 (也许在您的情况下,call stack 上的返回地址已被 lol 函数的地址覆盖)。

关于c++ - 有趣的程序行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28299760/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com