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



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

typedef struct A
{
    uint8_t mem[10];
} A;
size_t offset = offsetof(A, mem); // This line raises the error.

确切的覆盖率描述是"identifier mem is undefined"。

我试过用mem[0], mem[]代替mem,从结构体A中删除了类型定义-但似乎没有解决它。如果有人能告诉我什么会让人不安,那就太好了。

[更新#1]:我正在使用ubuntu 16.04(内核- 4.4.0-38-generic), gcc/g++ 5.4.0, coverity 7.5.1

[更新#2]:使用此结构和以下命令行选项的独立test.c可以使coverity满意:

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_emit, TYPE_IDENTIFIER_NOT_ALLOWED.

使用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展开到什么位置,然后将预处理后的代码片段与编译器的命令行一起发布到这里。

相关内容

  • 没有找到相关文章

最新更新