【问题标题】:Coverity scan error RW.UNDEFINED_IDENTIFIER when offsetof() is used使用 offsetof() 时的覆盖率扫描错误 RW.UNDEFINED_IDENTIFIER
【发布时间】:2017-03-11 19:57:54
【问题描述】:

Coverity 在尝试计算结构中成员的偏移量时检测到未定义的标识符。

typedef struct A
{
    uint8_t mem[10];
} A;

size_t offset = offsetof(A, mem); // This line raises the error.

确切的覆盖描述是“标识符mem未定义”。

我尝试用 mem[0]、mem[] 替换 mem,从 struct A 中删除 typedef - 但似乎没有任何解决办法。如果有人指出可能会扰乱隐蔽性,那就太好了。

[Update#1]:我使用的是 ubuntu 16.04 (kernel - 4.4.0-38-generic),gcc/g++ 5.4.0,coverity 7.5.1

[Update#2]:具有这种结构和以下命令行选项的独立 test.c 可以保持覆盖率:

cov-build --dir . cc -c test.c -o test -Werror -march=corei7 -g -fstrict-aliasing -fstack-protector -fstrict-overflow -Wall -Wextra -Wshadow -Wmissing-prototypes -Wstrict-prototypes -O3 -fomit-frame-pointer -fPIE.

有趣的是,当我编译整个项目时,它会导致同一行出现一堆错误:UNDEFINED_IDENTIFIER、ROUTINE_NOT_EMITTED、TYPE_IDENTIFIER_NOT_ALLOWED。

【问题讨论】:

  • 能否提供您的操作系统、编译器和版本?
  • 我使用的是 ubuntu 16.04 (kernel - 4.4.0-38-generic),gcc/g++ 5.4.0,coverity 7.5.1

标签: cc coverity offsetof


【解决方案1】:

使用 Coverity 8.0.0.9 和 8.5.0.5 以及 GCC 4.6.3 和 5.2.0,我无法重现此问题。我的复制器是:

#include <stdint.h>
#include <stddef.h>

typedef struct A
{
  uint8_t mem[10];
} A;

size_t offset = offsetof(A, mem); // This line raises the error.

因为你的没有完全用 GCC 编译。我使用gcc -c test.c 作为我的命令行。

由于offsetof 是由系统标头定义的宏,因此无论您的宏扩展为什么,似乎最有可能给 Coverity 带来困难(而且它与我的扩展不一样) - 或者您的命令行上的某些东西正在将 Coverity 置于一种模式,使其拒绝这一点。一个好的下一步是预处理您的源文件以查看 offsetof 扩展的内容,并在此处发布预处理后的 sn-p,以及编译器的命令行。

【讨论】:

  • 你是对的。一个独立的测试文件让 Coverity 很开心。所以它不是宏定义。我已经用完整的命令行选项更新了我的原始帖子。
  • 这可能是命名空间或条件编译问题吗?鉴于独立的测试用例有效并且 Coverity 抱怨无法找到标识符 mem,这表明它没有看到该符号。如果没有该问题的复制器,我只能推测,但最可能的罪魁祸首是您的编译器有一个宏定义,而 Coverity 没有。结构是包装在#if 块还是命名空间中?
  • 即使我也有这种感觉。感谢您提供有关#ifdef 块的指针。让我检查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 2016-04-14
  • 2020-12-29
  • 1970-01-01
  • 2022-11-08
  • 2012-09-27
  • 2019-05-23
相关资源
最近更新 更多