【问题标题】:How can I disable coverity checking using code annotation?如何使用代码注释禁用覆盖检查?
【发布时间】:2021-10-16 13:50:47
【问题描述】:

有一个问题,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;
}

【问题讨论】:

  • 在语义上不会出现这个问题你怎么这么确定?
  • @AndrewHenle,是的,我确定。使用的数组中的单元数与输入列表的大小成对数关系。要使数组溢出,您需要一个包含 2 ^ 33 个元素的列表。之前的代码有一个限制,无法创建这样的列表。我想禁用此功能的检查。
  • 所用数组中的单元格数量与输入列表的大小成对数关系。 哦。而且您确定代码没有错误并且永远没有错误?
  • @AndrewHenle,是的,我只是找不到 CWE-119 验证标签来使用代码注释将其标记为故意
  • 与修复代码以确保没有溢出并返回或记录错误以提醒所有人存在相比,您在尝试避免修复潜在的缓冲区溢出方面付出了更多的努力一个错误,万一发生了。这似乎……被误导了。您依赖于一种毫无根据的信念,即某个特定错误“永远不会发生”(这是一个可笑的断言......),并且该代码将来永远不会以它会发生的方式使用。

标签: c code-analysis static-code-analysis coverity


【解决方案1】:

要使用源代码注释抑制隐蔽发现,请在报告发现的行之前添加注释,格式为// coverity[event_tag]/* coverity[event_tag] */,其中event_tag 是事件的“标签” .标签是一个类似标识符的词,表示该事件的一般形式。有关更多详细信息,请参阅博客文章 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&lt;sizeof(x)/sizeof(x[0]) 似乎是错误的。相当于这里的i &lt; 32。如果该条件可能为假,则意味着 i 等于 32,因此循环将以 i==32 终止,从而使数组超出一个元素。

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


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

【讨论】:

  • 谢谢。请告诉我 ARRAY_VS_SINGLETON 问题的标签。我在哪里可以看到问题的标签列表?
  • 标签名称显示在基于 Web 的 GUI 的事件列表中,用于每个单独的发现。如果我没记错的话,它们也列在检查器参考文档中(可从 GUI 访问)。
猜你喜欢
  • 1970-01-01
  • 2013-05-04
  • 2022-12-03
  • 2017-07-12
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2021-03-26
相关资源
最近更新 更多