【问题标题】:Modeling to avoid leaked_storage false positive建模以避免leaked_storage 误报
【发布时间】:2020-05-06 08:23:49
【问题描述】:

我正在努力解决leaked_storage 误报问题。给定这个例子

struct string
{
  size_t len;
  data [1];
};

const char *string_new(const char *s, size_t n)
{
  struct string *st;

  st = malloc(offsetof(struct string, data) + n + 1);
  st->len = n;
  memcpy(st->data, s, len);
  st->data[len] = 0;
  return st->data;
}

void string_free(const char *s)
{
  struct string *st = (struct string *)(s - offsetof(struct string, data));
  free(st);
}

Coverity Scan 会报告

资源泄漏 (RESOURCE_LEAK)5。 leaked_storage:变量 st 超出范围会泄漏它指向的存储。

在这个例子中,它直接表明它没有泄漏。我可以做些什么来消除误报?

2020 年 5 月 7 日更新

建模不是正确的技术。 Coverity Scan 确实允许注释来解决这种特定情况。在我们的例子中,

const char *string_new(const char *s, size_t n)
{
  struct string *st;

  st = malloc(offsetof(struct string, data) + n + 1);
  st->len = n;
  memcpy(st->data, s, len);
  st->data[len] = 0;
  /* coverity[leaked_storage] */
  return st->data;
}

将使误报警告静音。

谢谢大家。

【问题讨论】:

  • st 是指针。您正在使用 (. operator) 访问其成员,您应该使用 -> 或 (*st).len 访问。这段代码通过编译了吗?
  • 还有一个问题,malloc 返回的 free() to st 指针在哪里??
  • 该代码没有机会实际编译,更不用说运行了。 st.<anything> 会吐出编译器,所以如果它也吐出覆盖率,我不会感到震惊。
  • @WhozCraig - 你选择了正确的词来描述这个糟糕的代码。 stackoverflow 应该阻止这类问题。
  • offset -> offsetof

标签: c static-analysis coverity


【解决方案1】:

建模不是正确的技术。 Coverity Scan 确实允许注释来解决这种特定情况。在我们的例子中,

const char *string_new(const char *s, size_t n)
{
  struct string *st;

  st = malloc(offsetof(struct string, data) + n + 1);
  st->len = n;
  memcpy(st->data, s, len);
  st->data[len] = 0;
  /* coverity[leaked_storage] */
  return st->data;
}

将使误报警告静音。

谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 2013-10-08
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    相关资源
    最近更新 更多