2016-10-28 3 views
0

구조의 구성원 오프셋을 계산할 때 Coverity에서 정의되지 않은 식별자를 감지합니다.offsetof()가 사용 된 경우 Coverity 검사 오류 RW.UNDEFINED_IDENTIFIER

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

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

정확한 커버리지 설명은 "식별자 mem is undefined"입니다.

mem을 mem [0], mem []으로 바꾸고 구조체 A에서 typedef를 제거했지만 아무 것도 해결되지 않은 것 같습니다. 가려움증을 뒤엎을 수있는 것에 대해 누군가가 조언 해 준다면 좋을 것입니다.

[업데이트 # 1] : - GCC/G ++ 5.4.0, 커버 리티 7.5.1

[업데이트 # 2, 나는 우분투를 16.04 (4.4.0-38-일반 커널)을 사용하고 있습니다 ]이 구조의 독립형 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

우분투 16.04 (kernel - 4.4.0-38-generic), gcc/g ++ 5.4.0, 커버 리티 7.5.1 – 0sn1s

답변

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를 ​​거부하는 모드에 넣습니다. 좋은 다음 단계는 원본 파일을 사전 처리하여 컴파일러의 명령 줄과 함께 사전 처리 된 스 니펫으로 확장 및 게시하는 오프셋을 확인하는 것입니다.

+0

맞아. 독립 실행 형 테스트 파일은 Coverity를 ​​행복하게 유지합니다. 매크로 정의가 아닙니다. 전체 명령 줄 옵션으로 원래 게시물을 업데이트했습니다. – 0sn1s

+0

이것은 네임 스페이스 또는 조건부 컴파일 문제 일 수 있습니까? 독립 실행 형 테스트 케이스가 작동하고 Coverity가 식별자 'mem'을 찾을 수 없다는 불만이 제기된다면 이는 해당 심볼을 보지 못했음을 의미합니다. 이 문제에 대한 재생산기가 없다면, 나는 추측 할 수 있지만, 가장 큰 문제는 컴파일러가 Coverity에서 가지고 있지 않은 매크로 정의가 있다는 것입니다. 구조체가 #if 블록이나 네임 스페이스에 싸여 있습니까? – Caleb

+0

심지어 나는 그 느낌을했습니다. #ifdef 블록에 대한 포인터를 보내 주셔서 감사합니다. 내가 확인 할게. – 0sn1s

관련 문제