我有一个C文件,该文件在函数内包含以下代码片段:

assert( pCache->nHash>0 && pCache->apHash );
...
if( pPage ){
    unsigned int h = iKey % pCache->nHash;
...

当我运行Analyze时,Xcode在包含模运算的最后一行上引发逻辑错误-除以零。

如果我在if上添加额外的检查,错误就会消失:
if( pPage && pCache->nHash>0 ){

包含pCache->nHash>0的断言是否应该避免除以零,而除以零又会导致除法?

最佳答案

断言最常仅在开发期间使用。构建最终版本时,将禁用断言。

话虽如此,断言在那里捕获了应该由开发人员纠正/检查的逻辑错误。它们不用作对程序逻辑的实际验证。

这就解释了为什么仍然必须添加if语句来检查变量是否大于0的原因。分析器会分析代码,并且很可能会忽略断言,因为您期望在最终构建过程中将其删除。

09-25 22:02