MISRA 9.2 инициализация массивов с плавающей запятой и беззнаковых массивов

В следующих строках я получаю сообщения о различных проблемах из инструмента статического анализа Parasoft C / C ++ Test и из программы проверки MISRA IAR Embedded Workbench:

[1] static unsigned int array_a[30] = {0U};
[2] static float array_b[20] = {0.0f};

Статический анализ Parasoft говорит:

Not all elements of variable ‘array_a’ are initialized.
Not all elements of variable ‘array_b’ are initialized.

IAR Embedded Workbench не имеет проблем с приведенными выше утверждениями (и его средство проверки MISRA включено).

Я могу убрать сообщение для переменной array_b с помощью:

[3] static float array_b[20] = {0};

Однако тот же трюк не работает для array_a:

[4] static unsigned int array_a[30] = {0};

Теперь средство проверки MISRA Embedded Workbench IAR жалуется на то, что целочисленная константа со знаком, 0, присваивается целому числу без знака:

Error[Pm127]: a 'U' suffix shall be applied to all constants of 'unsigned' type (MISRA C 2004 rule 10.6)

Статический анализ Parasoft не показывает никаких проблем для строки 4 выше.

Я считаю, что это сводится к интерпретации «нуля» для правила 9.2 MISRA:
ИСКЛЮЧЕНИЯ

"All the elements of arrays or structures can be initialized (to zero or NULL)
by giving an explicit initializer for the first element only. If this method
of initialization is chosen then the first element should be initialized
to zero (or NULL), and nested braces need not be used."

Какой чекер правильный?


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


Ответы (2)


Статический анализ Parasoft говорит:

Не все элементы переменной array_a инициализируются.

Это не так. Все элементы инициализируются, и код не нарушает MISRA-C 9.2, который явно допускает нулевую инициализацию, когда только один элемент массива установлен в ноль.

статический массив с плавающей запятой array_b [20] = {0};

Строго говоря, это несовместимо с MISRA, поскольку все целочисленные литералы должны быть без знака, как в вашем первом коде. Измените на 0u или 0U или действительно на 0.0f (последнее имеет наибольший смысл).

статический беззнаковый int array_a [30] = {0};

То же самое здесь, не соответствует требованиям MISRA.

Статический анализ Parasoft не показывает никаких проблем для строки 4 выше.

Казалось бы, Parasoft ошибается во всех упомянутых случаях. Вы должны сообщать об этом как об ошибках в их программе проверки MISRA.

IAR кажется правильным во всех упомянутых случаях.

person Lundin    schedule 30.01.2014

Мне очень жаль, что я использую функцию ответа, но для комментирования требуется 50 репутации.
Я думаю, вы обнаружили явный конфликт этих двух правил MISRA. Я не знаю, является ли один из них более важным, чем другой, но в основном вам следует подумать, правильно ли выполняется ваш код на всех возможных платформах, вы будете его использовать, и можете ли вы отключить предупреждение для этого случая. Насколько я знаю, можно игнорировать предупреждения MISRA, если вы делаете что-то специально. (не забудьте указать причину игнорирования правила в коде!)
Чтобы ответить на ваш вопрос: обе проверки верны ИМО

Но помимо этого вы пробовали:

static unsigned int array_a[30] = {(unsigned int) 0};
static float array_b[20] = {(float) 0};

Если это не так, пожалуйста, не голосуйте против, я могу отредактировать это;)

person Micky    schedule 30.01.2014
comment
Между правилами MISRA нет противоречий. Один инструмент сломан, другой исправен. Ваши преобразования ничего не решат, и на самом деле этот код не совместим с MISRA, потому что он требователен к целочисленным литералам, имеющим суффикс U. - person Lundin; 30.01.2014
comment
Верно, что вы можете отклониться от правила MISRA, если у вас есть причины, а процедура отклонения отличается для каждой реализации MISRA. Как правило, отдельным программистам не разрешается делать отклонения без их утверждения, например, путем подачи официального запроса через систему качества компании. Лично я считаю, что это довольно утомительный способ реализовать MISRA. Вместо этого я бы рекомендовал создать глобальный документ, содержащий только разрешенные отклонения от MISRA-C и обоснование. Затем этот документ следует поддерживать в рабочем состоянии по мере необходимости. - person Lundin; 30.01.2014