C / C ++是一个不是数字的int值?

时间:2009-07-18 21:42:16

标签: c++ c numbers int assert

这会发生吗? 3断言,其中一个应该激活。

int nr = perform_calc();
assert( nr == 0);
assert( nr > 0);
assert( nr < 0);

当程序没有激活g ++ 3.4.4上的断言时,会出现这种情况。

并且我没有可能更改代码以便在断言未激活的情况下打印出数字。

有什么想法吗?

编辑:在阅读了几条评论后,我被迫编辑。显示代码?你为什么要做这个蠢事?我不相信!在哪里使用? 从我的问题来看,显然我不会发布/更改代码,原因有几个:

  • 我是一个初学者,对代码感到羞耻(没有犯罪,如果我发布的话,肯定会更容易回答问题)
  • 我被要求只用很少的信息帮助一个朋友(不,我没有问他为什么不能检查返回的号码,或者为什么他不能只添加一个断点)。
  • 我在没有任何编译器的emacs中编写代码,并将其发送到编译它的远程服务器,运行它,只有在出现问题时才能返回失败的断言。

如果你认为我正在恶作剧或恶作剧你应该投票支持关闭线程。我会完全没问题。但是添加这样的不必要的评论只会让我想要一个“态度”标志来实现。

我要感谢其他人的意见和答案,他们实际上试图解释并回答了我的问题。

7 个答案:

答案 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 );