这会发生吗? 3断言,其中一个应该激活。
int nr = perform_calc();
assert( nr == 0);
assert( nr > 0);
assert( nr < 0);
当程序没有激活g ++ 3.4.4上的断言时,会出现这种情况。
并且我没有可能更改代码以便在断言未激活的情况下打印出数字。
有什么想法吗?
编辑:在阅读了几条评论后,我被迫编辑。显示代码?你为什么要做这个蠢事?我不相信!在哪里使用? 从我的问题来看,显然我不会发布/更改代码,原因有几个:
如果你认为我正在恶作剧或恶作剧你应该投票支持关闭线程。我会完全没问题。但是添加这样的不必要的评论只会让我想要一个“态度”标志来实现。
我要感谢其他人的意见和答案,他们实际上试图解释并回答了我的问题。
答案 0 :(得分:14)
assert
,则取消选中 NDEBUG
。编译此翻译单元时,请确保#undef NDEBUG
。
您可以使用-E
开关调用gcc,以验证您的断言语句是否仍在代码中。
答案 1 :(得分:13)
正如我在生活中看到过如此丑陋的事情,可以解释一下perform_calc()是否有缓冲区溢出会覆盖堆栈中的返回地址。当函数结束时,覆盖的地址从堆栈中恢复并设置为当前的PC,导致程序的另一个区域中的跳转,显然超过了断言调用。
虽然这是一个非常遥远的可能性,所以你正在展示它。
另一种可能性是有人做了一个丑陋的宏伎俩。检查你是否有像
这样的东西#define assert
当你在洗手间时,或者某位同事把这样的东西放在标题中
#define < ==
#define > ==
正如另一个答案中所建议的,请使用gcc -E查看实际编译的代码。
答案 2 :(得分:5)
首先看起来代码不正确。如果打开调试(设置了DEBUG和/或_DEBUG并且未设置NDEBUG):
assert( nr == 0);
如果nr!= 0,上面的行将调用exit()。因此,如果该行通过,则第二个断言将执行:
assert( nr > 0);
...并调用exit(),因为nr == 0和!(nr&gt; 0)。
assert( nr < 0);
这第三行根本不会运行。
这段代码究竟是什么意思?为什么,如果可以添加这些断言,你可以不添加printf()吗?
答案 3 :(得分:5)
此代码是多线程的吗?也许你有一个race condition。
答案 4 :(得分:4)
不,我没有可能 更改代码以打印 编号..
奇怪。你显然能够插入assert()语句,因为如果它们实际上是你无法触及的实际代码,那么代码就无法工作。那么为什么不能打印assert()调用test的值?
答案 5 :(得分:1)
我怀疑你在清理代码片段时意外地消除了这个问题。还有更多的代码(并且nr在断言之间发生了变化)或者它实际上看起来不是那样(或者,每个rlbond,你没有打开断言)。
尝试发布一个消毒程度较低的代码段,让我们看看我们是否无法解决这个问题。
答案 6 :(得分:-3)
可能是NaN吗?在这种情况下,以下断言将失败:
assert( nr == nr );