Ошибка шины в коде, который включает 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, он проигнорирует его! Ничто другое не работает для системных заголовочных файлов, по крайней мере, я нашел.