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