0

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 - 但似乎没有什么能解决它。如果有人指出可能会扰乱隐蔽性,那就太好了。

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

[更新#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。

4

1 回答 1

0

使用 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 扩展的内容,并在此处发布预处理的代码段以及编译器的命令行。

于 2016-10-29T00:50:46.590 回答