使用offsetof()时,Coverity扫描错误RW.UNDEFINED_IDENTIFIER

时间:2016-10-28 21:15:47

标签: cc coverity offsetof

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,从结构A中删除了typedef - 但似乎没有解决它。如果有人指出可能令人不安的事情,那就太棒了。

[更新#1] :我使用的是ubuntu 16.04(内核 - 4.4.0-38-generic),gcc / g ++ 5.4.0,覆盖率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。

1 个答案:

答案 0 :(得分: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扩展到并发布预处理的代码段,以及编译器的命令行。