Инициализация массивов символов и ошибки MISRA

У меня есть следующая строка (сокращенная до минимальной демонстрации проблемы):

char version_text[64U] = {'\0'};

Эта строка генерирует следующую ошибку MISRA:

Error[Pm023]: missing elements - braces shall be used to indicate and match the structure in the non-zero initialization of arrays and structures (MISRA C 2004 rule 9.2).

Почему это ошибка?

Мой текущий обходной путь:

char version_text[64U] = {0};

что указывает на то, что тип char реализован моим компилятором (IAR EW) как signed char.

Насколько я понимаю, '\0' является символьным литералом и, следовательно, должен соответствовать типу char.


person Thomas Matthews    schedule 19.01.2013    source источник


Ответы (3)


В C целочисленные символьные константы имеют тип int, а не char. Так

char version_text[64U] = { '\0' };

и

char version_text[64U] = { 0 };

полностью эквивалентны (и это не зависит от знака char). Оба предоставляют константу int в качестве единственного инициализатора.

То, что чекер MISRA жалуется на первое, а не на второе - это просто несоответствие.

Однако это, вероятно, связано с тем, что нулевая инициализация обычно выполняется путем предоставления только одного 0, в то время как использование целочисленных символьных констант обычно выполняется только для ненулевых инициализаций, где MISRA ожидает инициализаторы для всех элементов, если я интерпретирую сообщение корректно, а чекер просто не заглядывает внутрь символьной константы.

person Daniel Fischer    schedule 19.01.2013

Правило гласит:

«Обратите также внимание, что все элементы массивов или структур могут быть инициализированы (нулем или NULL), задав явный инициализатор только для первого элемента. Если выбран этот метод инициализации, то первый элемент должен быть инициализирован нулем (или NULL). ), и вложенные фигурные скобки не нужно использовать."

В соответствии с этим только {0} и {NULL} совместимы с MISRA, а {'\0'} - нет (хотя компилятор обрабатывает их одинаково).

person Omri Barel    schedule 19.01.2013
comment
Или, в данном случае, "", что также соответствует требованиям. - person Lundin; 21.01.2013

Попробуйте следующее:

char version_text[64U] = { '\0', };

По сути, это инициализирует каждый элемент массива NULL, а не только первый. Обратите внимание на запятую!

person Vijay    schedule 14.02.2013