assert()函数未在反汇编中显示

时间:2012-07-24 17:37:03

标签: c++ compiler-construction

我的同事刚刚让我帮忙解决问题,他的代码中有几行

for (long counter = 0; counter < End; )
{
  ...
  assert(counter++ < MAX);
  ...
}

问题是,当我们使用Visual Studio逐行调试时,似乎一直跳过assert()行,并且counter永远不会增加,因此循环永远不会完成。

当我们使用VS查看反汇编时,此assert()函数没有装配线。我之前从未使用过assert(),所以我想知道这是正常的,他不应该将任何代码行为放入assert()或者调试器或其他地方出现错误?

感谢。

5 个答案:

答案 0 :(得分:6)

确保NDEBUG 定义,因为assert仅在调试版本中启用,即未定义NDEBUG时。

来自here

#ifdef NDEBUG
#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/
#endif

也就是说,当定义NDEBUG时,assert是no-op,这是你在汇编中观察到的。

答案 1 :(得分:4)

您应该仅将assert用于调试目的。

该行

assert(counter++ < MAX);

包含逻辑,它不应该。

在非调试版本中,它永远不会被执行。

答案 2 :(得分:3)

assert是一个宏,在发布版本中删除。因此,除非您正在查看调试版本,否则不要期望看到任何assert代码。

因为assert是一个宏,而不是一个函数,所以它不太可能看起来像一个函数调用。

答案 3 :(得分:1)

断言通常会从发布版本中删除,因此仅针对调试版本执行。在断言中,你不应该有任何影响程序逻辑的副作用。

答案 4 :(得分:1)

如果代码是在Release Mode下构建的,则不会包含assert语句。您的同事是否使用发布模式?

Visual Studio的优化设置也可能会删除断言语句。

您的同事难道不能将for循环更改为不使用assert语句吗?