assert()在release中没有任何作用(转) 发布时间:2011-10-08 11:51:02
技术类别:自由话题  
 
最近在调试别人写的代码。被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下有一个指针为空的话,下面用指针的时候执行就会报错的。
posted on 2013-02-27 22:58  侠骨豪情  阅读(369)  评论(2编辑  收藏  举报