Xcode C代码,简称;除零“;分析器问题

Xcode C代码,简称;除零“;分析器问题,c,xcode,clang,static-analysis,C,Xcode,Clang,Static Analysis,我有一个C文件,其中包含函数中的以下代码片段: assert( pCache->nHash>0 && pCache->apHash ); ... if( pPage ){ unsigned int h = iKey % pCache->nHash; ... 当我运行Analyze时,Xcode在包含模运算的最后一行抛出一个逻辑错误-除以零 如果我向If like so添加额外检查,则错误消失: if( pPage && pCac

我有一个C文件,其中包含函数中的以下代码片段:

assert( pCache->nHash>0 && pCache->apHash );
...
if( pPage ){
    unsigned int h = iKey % pCache->nHash; 
...
当我运行Analyze时,Xcode在包含模运算的最后一行抛出一个逻辑错误-除以零

如果我向If like so添加额外检查,则错误消失:

if( pPage && pCache->nHash>0 ){

包含
pCache->nHash>0的断言不应该避免被零除吗?

断言通常只在开发过程中使用。构建最终版本时,禁用断言

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


这就解释了为什么仍然必须添加一个if语句来检查变量是否大于0。您的分析器分析您的代码,很可能会忽略断言,因为您希望在最终生成过程中删除它们。

在代码段中的
过程中,是否有任何方式可以更改该值?这可能只是分析仪的误报——这种情况经常发生。我考虑到了这一点,所以我将断言更改为错误上方的一行,这对有趣的测试没有任何影响,谢谢@Cubia。我是希望在最终构建期间实际删除它们,还是我的设备会自己忽略任何断言调用?作为旁注,在我的例子中,这是一个库,人们可以通过源代码或CocoaPods添加到他们的项目中。@heitorschenget您不一定需要在最终构建期间删除它们。但是资产应该只在开发周期中使用。您的设备不会忽略断言,但如果断言失败,人们会期望该断言被实际检查(if语句等)所取代。此外,在使用断言时通常会有性能损失,因此删除它们确实会提高程序的性能。