【发布时间】:2014-02-18 00:57:58
【问题描述】:
在下面的代码中,*(long*)0=0; 与 if 子句一起使用,但它的用途是什么?
if(r.wid*r.ht < tot)
*(long*)0=0;
【问题讨论】:
-
该语句应该是一个具有描述性名称的宏。 (这是宏的少数好理由之一。您希望崩溃发生在正确的函数中,因此堆栈帧是有意义的)
-
C++ 还是 C?我没有看到任何 C++ 功能,但标准可能不同。
-
你真的试过这个吗?上次我这样做时,我的编译器只是简单地将整个语句排除在外。根据 C 标准完全合法。
-
现代编译器可能会删除整段代码。
then部分是未定义的行为,因此编译器可以假定它无法访问。假设if表达式没有副作用,则可以删除整个if语句。 -
Redis 使用类似的技巧来模拟 seg 错误,然后您可以在调试器中从那里获取,请参阅What does “((char)-1) = 'x';” code mean?。正如我在对链接问题的回答中所说,这是未定义的行为,如果在某些情况下对其进行了优化,我不会感到惊讶。上一个线程What is the simplest standard conform way to produce a Segfault in C? 也很合适。