【发布时间】: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