Оповещения Polyspace о невыполнении объявления main () - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть куча исполняемых файлов, написанных на C, которые статически анализируются с помощью Polyspace Code Prover и Bug Finder.Оба инструмента помечают мои main() функции за нарушение Руководства 8.4 MISRA со следующим сообщением:

"Совместимое объявление должно быть видно, когда определен объект или функция с внешней связью. Функция 'main'не имеет видимого совместимого прототипа при определении. "

Кажется, это решает прямое объявление main(), но это очень" странно "для меня и создает проблемы при документировании проекта с помощью Doxygen.

Вот функция:

int main(int argument_counter, char const *arg_vector[])

также, как вы можете видеть, мы не могли использовать традиционные имена параметров argc и argv[], потому что они были слишком похожи на некоторые переменные, которые были найденына внешних заголовках, что, на мой взгляд, тоже странно.

Это проблема кода или что-то не так с конфигурацией инструментов?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

main() является исключением из многих правил, как внутри MISRA, так и без него ...

Во избежание сомнений, MISRA C: 2012 Техническое исправление 1 добавляет явное исключениек правилу 8.4 для main():

Функция main не должна иметь отдельного объявления.

0 голосов
/ 27 ноября 2018

Вы часто получаете ложные срабатывания такого рода от статических анализаторов относительно main, когда используете форму, определяемую реализацией.Но, в частности, строго соответствующая размещенная программа должна использовать эту форму:

int main(int argc, char *argv[])

Имя параметров не имеет значения, но их типы имеют значение.char* [] отличается от типа const char* [].const в вашем коде обозначает не фактические массивы символов как const, а массив указателей на них.Что немного странно, я не понимаю, почему кто-то попытался бы перезаписать их.

Также примечательно, что argc и argv должны быть доступными для записи в строго соответствующей программе, C17 5.1.2.2.1 §2:

параметры argc и argv и строки, на которые указывает массив argv, должны изменяться программой и сохранять свои последние сохраненные значения между запуском программы и завершением программы

в идеале следует просто изменить типы на типы, которые требуются для строго соответствующей программы.

Однако многие программы на C не являются строго соответствующими размещенными программами, поэтому статический анализатор должен иметь возможность проглатывать определяемые реализацией формы main тоже.На самом деле, нет никакого вреда и в прямом объявлении main - и вы можете с уверенностью предположить, что компилятор этого не делает (C17 5.1.2.2.1 §1 «Реализация не объявляет прототип для этой функции.»).

Предположим, у вас есть форма, определяемая реализацией void main (void).Чтобы заставить инструмент замолчать, вы можете просто написать:

void main (void);
void main (void)
{ ...

Я сильно подозреваю, что причина предупреждения инструмента в том, что он слишком туп, чтобы признать, что main - особый случай.Точно так же вы можете получать предупреждения об использовании int в качестве возвращаемого значения от main вместо int32_t - что является ложным срабатыванием, поскольку MISRA-C имеет явное исключение для возвращаемого типа main.

...