Splint не удается в код, который включает в себя COMPOREC.H
-
01-10-2019 - |
Вопрос
Я пытаюсь бежать splint
на источник C, который включает в себя complex.h
Из стандартной библиотеки C для поддержки сложной арифметики.
К сожалению, splint
Не удается со следующей ошибкой.
Sprint 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.
Другие советы
Я не пользователь Splint, поэтому сделайте следующее с зерном соли ...
То _Complex
Ключевое слово было добавлено с C99, и FAQ Splint, который можно сказать о C99 (http://www.splint.org/faq.html#quest15.):
Однако Splint еще не поддерживает все расширения C99, поэтому есть некоторые законные программы C, которые необходимо будет изменено.
Я думаю, что это _Complex
покрывается этим предостережением.
Вы можете работать вокруг очевидной недостаточной поддержки Splint _Complex
Использование методики, описанной в FAQ (http://www.splint.org/faq.html#quest14.) _Complex
:
Если вы просто хотите игнорировать ключевое слово, вы можете добавить
-Dnonstandardkeyword=
Чтобы сделать препроцессор устранить ключевое слово, гдеnonstandardkeyword
это имя ключевого слова.
Я изо всех сил пытался получить шин, чтобы игнорировать заголовки и не найти подходящие ответы в любом месте в сети. Я наконец использовал встроенную справку Splint и обнаружил это:
#ifndef s_splint_s #endif.
Если вы поместите эту пару вокруг кода, вы хотите, чтобы разбиться игнорировать, он будет игнорировать его! Ни одно из других вещей не работает для файлов заголовка системы, по крайней мере, я нашел.