这个问题问我一个可以代替HUH的可能号码? ,这样它就可以打印问候世界,然后终止而没有任何错误。
我试图找出主函数中x的地址,并在doit函数中的局部变量x和主函数中x的地址之间使用了十六进制的减法,但无济于事。我有办法访问主函数中x的内容并将其值更改为0吗?
这样做会导致while循环停止运行并打印出“ Hello World”。
这是可行的方法吗?
void doit(void) {
int x[1];
x[HUH ? ] = 0;
}
int main(void)
{
int x = 1;
while (x > 0)
{
doit();
}
printf("hello world");
}
答案 0 :(得分:2)
不。 x
中唯一有效的索引是0
。其他任何事件都将通过越界访问来触发undefined behaviour,否则将不使用x
,因此您不会受到任何副作用。
例如,Clang 7 on Godbolt会完全忽略访问,并在所有情况下将doit
优化为简单的ret
。
当然,除非您将副作用塞入索引表达式:
x[std::printf("hello world"), std::exit(0), 0] = 0;