2016-10-28 3 views
0

Coverity обнаруживает неопределенный идентификатор при попытке вычисления смещения члена в структуре.Ошибка сканирования покрытия RW.UNDEFINED_IDENTIFIER при использовании offsetof()

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

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

Точное описание покрытия - «идентификатор mem undefined».

Я попытался заменить mem на mem [0], mem [], удалил typedef из struct A, но ничто, кажется, не решило его. Будет здорово, если у кого-то есть указатели на то, что может расстраивать покрытие.

[Update # 1]: Я использую Ubuntu 16.04 (ядро - 4.4.0-38-родовой), GCC/G ++ 5.4.0, 7.5.1 Coverity

[Update # 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_EMITTED, TYPE_IDENTIFIER_NOT_ALLOWED.

+0

Не могли бы вы предоставить свою операционную систему, компилятор и версию? –

+0

Я использую ubuntu 16.04 (ядро - 4.4.0-38-generic), gcc/g ++ 5.4.0, coverity 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

Смежные вопросы