原创 assert()在release中没有任何作用(转)

2011-10-8 11:50 4593 10 10 分类: 工程师职场
最近在调试别人写的代码。被assert()狠狠的涮了一把。现在将涮我的代码片段摘录如下:

  else if( m_radarLevel > c_maxRadarLevel )
  {
//可以在预计正常情况下程序不会到达的地方放置断言 :assert false
   ASSERT( false );

   m_radarLevel = c_maxRadarLevel;
  }
【注】c_maxRadarLevel是一个全局变量,出错前的值为16。
因为m_radarLevel 值得范围是0--32,所有当m_radarLevel > c_maxRadarLevel 时会执行这段代码
而我的程序恰巧是release版本的,所有这里的 ASSERT( false )就被忽略了,本来m_radarLevel 应该是大于16的,但是由于执行了这个代码段,最终m_radarLevel 的值不可能大于16。
由于ASSERT()函数在release版本上不起作用,导致想用assert()在release版本的程序中捕捉逻辑错误是不可能的。

 

在csdn上看到了一段对话,比较好,现摘录如下:

问:
1) assert 对Debug 版起作用, 对 Release 版不起作用. 
  可不可以这样理解,当assert在Debug版不出问题时,在Release 版也不出问题. 

2) 以下二代段码有什么不同,请解释一下.(是不是在Release版,有代码二的代码量比代码一的代码量大的问题) 

代码一: 
void *memcpy(void *pvTo, const void *pvFrom) 
    assert((pvTo != NULL) && (pvFrom != NULL));  //assert的参数为假中止, 为真继续执行 
    byte *pbTo = (byte *)pvTo; 
    ....... 
    return pvTo; 

代码二: 
void *memcpy(void *pvTo, const void *pvFrom) 
    if ((pvTo != NULL) && (pvFrom != NULL)) 
    { 
      byte *pbTo = (byte *)pvTo; 
      ....... 

      return pvTo; 
    } 
    else 
    { 
      return NULL; 
    } 
}

答:
assert宏有预编译条件#ifdef _Debug 
所以只对debug版本有效,对于release版本没效的 

这个宏主要是调试的时候提醒一下,这里出错了 
一般是判断如果错误下面的执行就无效了就用这个断言,为了的调试阶段消除错误。 
在release下这句在编译的时候就跳过了.

所以真正安全的是代码二的写法。这样避免出错。 
如果代码一在release下有一个指针为空的话,下面用指针的时候执行就会报错的。
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
10
关闭 站长推荐上一条 /3 下一条