首页 > 解决方案 > 如何使用代码注释禁用覆盖检查?

问题描述

有一个问题,覆盖率在语义上不会出现此问题的代码位置发现错误(潜在的 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;
}

标签: ccode-analysisstatic-code-analysiscoverity

解决方案


要使用源代码注释抑制隐蔽发现,请在表单报告发现的位置之前的行中添加注释,// 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而不是直接抑制。


推荐阅读