Urw*_*ald 3 c++ stack undefined-behavior
想象一下下面的定义。
struct X {
double a[8] {0.0};
double b[8] {0.0};
}
int main() {
X x;
x.a[10] = 1.0;
}
Run Code Online (Sandbox Code Playgroud)
当我访问时程序的行为是否未定义x.a[10]?
Pet*_*etr 11
是的,这是未定义的行为,但不仅仅是因为编译器可能会改变X.
这是未定义的行为,因为标准是这么说的。因此,编译器可以对这段代码执行任何操作:编译器可以完全放弃赋值,可以赋值1.0给所有16 个元素,可以更改以前的代码正在执行的操作,可以使程序崩溃,格式化硬盘等。
一个更现实、经典的例子:以下函数
const int table[4] = {2, 4, 6, 8};
bool exists_in_table(int v)
{
for (int i = 0; i <= 4; i++) {
if (table[i] == v) return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
总是返回true,至少在现代 gcc 中是这样的-O3(https://godbolt.org/z/f9cbWMYzM)
| 归档时间: |
|
| 查看次数: |
388 次 |
| 最近记录: |