如何使用代码注释禁用覆盖率检查?

有一个问题,coverity在语义上不可能出现此问题的代码位置发现错误(潜在OoB)。由于静态分析器的消息,我不想对蓝图中的这个位置进行额外检查。是否可以使用代码注释抑制此警告

静态结构规则*rule\u排序(结构规则*rp){
int i;
结构规则*pNext;
结构规则*x[32];
memset(x,0,sizeof(x));
while(rp){
pNext=rp->下一步;
rp->下一步=0;
对于(i=0;i<sizeof(x)/sizeof(x[0])&x[i];i++){
rp=规则合并(x[i],rp);
x[i]=0;
}
//潜在OoB
x[i]=rp;
rp=pNext;
}
rp=0;
对于(i=0;i<sizeof(x)/sizeof(x[0]);i++){
rp=规则合并(x[i],rp);
}
返回rp;
}

要抑制带有源代码注释的隐蔽查找,请在查找报告前一行添加注释,格式为//coverity[event_tag]/*coverity[event_tag]*/,其中event_tag是;标签"这件事的真相。标记是一个类似标识符的单词,表示该事件的一般形式。有关更多详细信息,请参阅博客文章Coverity:使用代码注释抑制误报

您尚未显示Coverity查找,但我怀疑这是一个溢出,标记是溢出本地。假设是这样,您可以这样抑制它:

(i=0;i<sizeof(x)/sizeof(x[0])&x[i];i++)的

{
rp=规则合并(x[i],rp);
x[i]=0;
}
/*覆盖率[超限本地]*/
x[i]=rp;
rp=pNext;

使用此注释,下次运行分析并将其结果提交到数据库时,发现将自动标记为;故意的;,因此,它不会出现在默认的调查结果列表或其他常见报告中


在解释了如何抑制这一发现后,在这种特殊情况下,我建议不要这样做。我认为问题中引用的代码不安全,因为内部用于循环条件I<sizeof(x)/sizeof(x[0])似乎是错误的。这相当于i<32这里。如果该条件为false,则意味着i等于32,因此循环将以i==32终止,从而使数组溢出一个元素

换句话说,如果您在i==31时进入内部for循环,数组将溢出,因为i将始终递增到32并写入x[i]


即使代码本身没有任何错误,我仍然会犹豫是否要简单地抑制这个发现。将一个静态分析结果想象成一个同事提出的问题:即使这个问题并不表示有bug,也要把它当作一个提高代码清晰度和健壮性的机会。在这样的情况下,如果代码是正确的,但Coverity抱怨,我会倾向于添加一个assert,而不是直接抑制

发表评论