Вы часто получаете ложные срабатывания такого рода от статических анализаторов относительно 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
.