c - 如何使用代码注释禁用覆盖检查?
问题描述
有一个问题,覆盖率在语义上不会出现此问题的代码位置发现错误(潜在的 OoB)。由于静态分析器的消息,我不想在蓝图中对这个地方进行额外的检查。是否可以使用代码注释来抑制此警告?
static struct rule *Rule_sort(struct rule *rp){
int i;
struct rule *pNext;
struct rule *x[32];
memset(x, 0, sizeof(x));
while( rp ){
pNext = rp->next;
rp->next = 0;
for(i=0; i<sizeof(x)/sizeof(x[0]) && x[i]; i++){
rp = Rule_merge(x[i], rp);
x[i] = 0;
}
// potential OoB
x[i] = rp;
rp = pNext;
}
rp = 0;
for(i=0; i<sizeof(x)/sizeof(x[0]); i++){
rp = Rule_merge(x[i], rp);
}
return rp;
}
解决方案
要使用源代码注释抑制隐蔽发现,请在表单报告发现的位置之前的行中添加注释,// coverity[event_tag]
或者/* coverity[event_tag] */
,其中event_tag
是事件的“标记”。标签是一个类似标识符的词,表示该事件的一般形式。有关更多详细信息,请参阅博客文章Coverity:使用代码注释抑制误报。
您尚未显示 Coverity 发现,但我怀疑它是 anOVERRUN
并且标签是overrun-local
. 假设是这样,您可以像这样压制它:
for(i=0; i<sizeof(x)/sizeof(x[0]) && x[i]; i++){
rp = Rule_merge(x[i], rp);
x[i] = 0;
}
/* coverity[overrun-local] */
x[i] = rp;
rp = pNext;
使用此注释,下次运行分析并将其结果提交到数据库时,该发现将自动标记为“有意的”,因此它不会出现在默认的发现列表或其他常见报告中。
在解释了如何压制这一发现之后,在这种特殊情况下,我建议不要这样做。我认为问题中引用的代码不安全,因为内部for
循环条件i<sizeof(x)/sizeof(x[0])
似乎是错误的。相当于i < 32
这里。如果该条件可能为假,则意味着i
等于 32,因此循环将以 终止i==32
,从而使数组超出一个元素。
换句话说,如果你进入内部for
循环 while i==31
,数组将被溢出,因为i
它将始终递增到 32 并x[i]
写入。
即使代码本身没有问题,我仍然会犹豫是否简单地压制这一发现。将静态分析结果想象成同事提出的问题:即使该问题并不表示存在错误,也可以借此机会提高代码的清晰度和健壮性。在这种情况下,如果代码正确但 Coverity 抱怨,我会倾向于添加assert
而不是直接抑制。
推荐阅读
- c++ - 具有常量类成员的赋值运算符
- git - 如何创建填充文件夹并将其添加到本地 git 分支
- bash - 如何使用 sed 将纪元转换为人类可读的日期时间
- android - 即使我离线,我也可以使用 firebase 发送通知吗
- datetime - 雪花 - 将字符串转换为日期时间
- amazon-web-services - 当 AWS 中的用户创建具有入口 0.0.0/0 的安全组时如何通过 SNS 获得通知
- flask - Flask中如何根据Parent访问子表记录
- next.js - NextJS 按需条目返回 404
- python - sphinx 代码块的 readthedocs.io 上的语法高亮显示
- c# - 错误 CS5001:程序“main.exe”不包含适合入口点的静态“Main”方法