Ошибка шины в коде, который включает complex.h

Я пытаюсь бежать splint на источнике C, который включает в себя complex.h из стандартной библиотеки C для поддержки сложной арифметики.

К несчастью, splint терпит неудачу со следующей ошибкой.

Шина 3.1.2 --- 03 мая 2009

/usr/include/bits/cmathcalls.h:54:31: Ошибка разбора: Объявление не функции: _Complex: extern double. (Для получения справки об ошибках разбора см. Splint -help parseerrors.) *** Невозможно продолжить.

В результате поиска этой проблемы в списке рассылки разделенного обсуждения появилось только это сообщение (оставшееся без ответа).

Есть идеи?

Обновить

Вот очень простой пример неисправного источника:

#include <complex.h>

int main() {
  complex x = 2 + 8i;
  x = x + 1;
}

Попытки переопределить неподдерживаемые _Complex C99 Ключевое слово приводит к ошибке с мнимой частью комплексного числа (что, я полагаю, неудивительно).

lsc@deepthought:~$ splint-D_Complex=double temp.c  
Splint 3.1.2 --- 03 May 2009

 temp.c:4:20: Parse Error. (For help on
 parse errors, see splint -help
                parseerrors.)
*** Cannot continue.

3 ответа

Решение

Я в конце концов решил это путем временного переопределения complex.h с пустышкой при звонке splint,

[lsc@home]$ ls /opt/qa_tools/utils/splint_includes/
complex.h

[lsc@home]$ splint -I/opt/qa_tools/utils/splint_includes test.c
Splint 3.1.1 --- 15 Jun 2004

Finished checking --- no warnings

Манекен complex.h Файл подавляет соответствующие ключевые слова и заменяет константы / функции на фиктивные. Эти ключевые слова / константы / функции были взяты из спецификации

Копия этого файла доступна здесь: https://gist.github.com/1316366

Я не пользуюсь шиномонтажем, так что возьмите следующее с недоверием...

_Complex Ключевое слово было добавлено с C99, и часто задаваемые вопросы по шинам имеют такое же значение для C99 ( http://www.splint.org/faq.html):

Тем не менее, Splint еще не поддерживает все расширения C99, поэтому есть некоторые законные программы на C, которые необходимо изменить.

Я предполагаю, что _Complex покрыто этим предостережением.

Возможно, вы сможете обойти очевидное отсутствие поддержки шины _Complex используя технику, описанную в FAQ ( http://www.splint.org/faq.html), но я был бы удивлен, если бы вы получили очень далеко помогать шине разбираться с кодом C99, используя _Complex:

Если вы просто хотите игнорировать ключевое слово, вы можете добавить -Dnonstandardkeyword= заставить препроцессор исключить ключевое слово, где nonstandardkeyword это имя ключевого слова.

Я изо всех сил пытался заставить шину игнорировать заголовки и не находил подходящих ответов где-либо в Интернете. Наконец-то я воспользовался встроенной справкой splint и обнаружил:

#ifndef S_SPLINT_S

#endif

Если вы поместите эту пару вокруг кода, который вы хотите игнорировать splint, он проигнорирует его! Ничто другое не работает для системных заголовочных файлов, по крайней мере, я нашел.

Другие вопросы по тегам