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

How can I disable coverity checking using code annotation?

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

要抑制带有源代码注释的 Coverty 调查结果,请在报告调查结果之前的行中添加注释,格式为 // coverity[event_tag]/* coverity[event_tag] */,其中 event_tag是事件的“标签”。标签是一个类似标识符的词,表示该事件的一般形式。有关详细信息,请参阅博客 post Coverity: Suppressing false positives with code annotations

你没有显示 Coverity 的发现,但我怀疑它是一个 OVERRUN 并且标签是 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 终止,因此超出数组一个元素。

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


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