Типы возврата нестандартных функций: Исправление ошибки разбора шины
Я использую встроенный компилятор XC8 C (для микропроцессоров PIC). Допускается следующее:
bit foo(){
//...
}
но будучи нестандартным C, статический анализатор Splint выдает следующую ошибку:
Ошибка разбора: объявление не функции: bit: "--------------------------------------" внутр.
И файл / строка ошибки - это прототип функции в соответствующем файле.h.
Как я могу это исправить, чтобы Splint мог анализировать остальные файлы? Я думаю, что может быть два пути:
Я думаю, что помню флаг, который может быть передан в Splint через CLI, который говорит ему заменить заданный нестандартный тип стандартным типом (например, bit на unsigned char), но сейчас я не могу его найти вообще!
Также, возможно, существует альтернативный способ написания кода на языке c, который удовлетворяет требованиям ANSI-C, но при этом позволяет XC8 интерпретировать возвращаемый тип как
bit
?
Прогресс:
На форуме я нашел следующее, но не могу найти информацию о том, как использовать флаг -D в руководстве:
Чтобы игнорировать ключевое слово, добавьте -Dnonstandardkeyword =, чтобы препроцессор удалил его
А также
используйте -Dspecialtype = int, чтобы пользовательский тип анализировал как int.
2 ответа
Если у программы анализа нет возможности выполнить замену, вы, конечно, можете сделать это с помощью препроцессора.
Есть что-то вроде:
#if defined RUNNING_SPLINT
#define bit unsigned char
#endif
например, заголовок, который вы убедитесь, включен везде, enter code here
и убедитесь, что вы определили символ препроцессора RUNNING_SPLINT
когда сплинт видит код Оно имеет -D
флаг для этого.
Это было в FAQ:
http://www.splint.org/faq.html
Процитирую это:
16. Я разрабатываю код для встроенной системы с помощью компилятора, который использует нестандартные ключевые слова и типы данных. Я хотел бы запустить Splint для моего кода, но эти нестандартные ключевые слова вызывают ошибки синтаксического анализа. Что я должен делать?
Вы можете часто использовать -D для решения этой проблемы.
Если вы просто хотите игнорировать ключевое слово, вы можете добавить -Dnonstandardkeyword=, чтобы препроцессор исключил ключевое слово, где nonstandardkeyword - это имя ключевого слова. Точно так же вы можете использовать -Dspecialtype=int, чтобы пользовательский тип анализировал как int.