最近在调试别人写的代码。被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下有一个指针为空的话,下面用指针的时候执行就会报错的。
文章评论(0条评论)
登录后参与讨论