Ошибка MISRA-C при инициализации массива структуры

Имею следующее:

typedef struct
{
   uint8_t BlockID;
   uint32_t Copies;
   uint16_t Size;
}NVMM_ConfigType;

const NVMM_ConfigType NvmmCnf_Layout[6] =
{
   {  1, 1,   4},
   {  2, 3,   4},
   {  5, 5,  16},
   { 10, 1,   4},
   { 11, 2,  32},
   { 13, 1, 100},
};

Мне это кажется нормальным, но MISRA-C выдает следующую ошибку:

Нарушение правила 10.3 MISRA C: 2012: [R] Значение выражения не должно присваиваться объекту с более узким существенным типом или другой категорией существенного типа

Я пытался понять, почему это происходит, но я просто это вижу. Также результаты сборки страдают от этих ошибок в аналогичных ситуациях, и я не знаю почему.

Кто-нибудь знает, что происходит?

РЕДАКТИРОВАТЬ: Я также пытался явно указать каждое значение, но по-прежнему получаю ту же ошибку:

const NVMM_ConfigType NvmmCnf_Layout[6] =
{
    {  (uint8_t)1, (uint32_t)1,   (uint16_t)4},
    {  (uint8_t)2, (uint32_t)3,   (uint16_t)4},
    {  (uint8_t)5, (uint32_t)5,  (uint16_t)16},
    { (uint8_t)10, (uint32_t)1,   (uint16_t)4},
    { (uint8_t)11, (uint32_t)2,  (uint16_t)32},
    { (uint8_t)13, (uint32_t)1, (uint16_t)100},
};

person m4l490n    schedule 30.07.2015    source источник
comment
Я не вижу здесь никаких проблем ... уж точно не по R10.3. Против какой строки идет ошибка?   -  person Andrew    schedule 06.08.2015
comment
Покажите свою версию кода с приведением типов, указанным в комментарии ниже. Я также пытался преобразовать каждое значение, но все равно получаю ту же ошибку.   -  person Doug Currie    schedule 06.08.2015
comment
@Andrew: Ошибка в открывающей скобке, сразу после =   -  person m4l490n    schedule 06.08.2015
comment
@ m4l490n Я заметил ваше последнее изменение: вы тратите время на то, чтобы заставить инструмент замолчать, когда знаете, что он не имеет смысла и делает код слишком подробным, что на самом деле несовместимо ;-)   -  person Veriloud    schedule 06.08.2015


Ответы (3)


(Привет, это новая учетная запись, поэтому я пока не могу использовать раздел комментариев, чтобы попросить дальнейших разъяснений, так что прошу прощения за длинный ответ)

Чтобы быть конкретным, это Правило 10.3 относится к MISRA-C: 2012 (последний стандарт), который является значительным улучшением по сравнению с предыдущими версиями, поскольку прилагается больше усилий для объяснения обоснования MISRA, а также многих других совместимых и несовместимых примеров.

Обоснование правила таково: поскольку C позволяет автоматически выполнять назначения между различными арифметическими типами, использование этих неявных преобразований может привести к непредвиденным результатам с возможностью потери значения, знака или точности. MISRA_C: 2012 имеет важную модель типов, которая помогает предупреждать, когда это может произойти.

Описания правил также включают исключения из правила. Для правила 10.3 одно исключение: Неотрицательное целочисленное постоянное выражение существенно знакового типа может быть присвоено объекту по существу беззнакового типа, если его значение может быть представлено в этом типе.

Непонятно, в какой именно строке и столбце ваш инструмент сообщает о нарушении (он должен). Лучший из инструментов также предоставит более подробную информацию о том, какая именно часть правила нарушается (например, если вместо 1 у вас было 128 в первом назначении 8-битному, инструмент должен быть очень точным об этом. ).

В любом случае я (и мой инструмент) не вижу здесь нарушения 10.3.

Поскольку это «разрешимое» правило, я был бы обеспокоен инструментом, если это критичный для безопасности код, помимо того факта, что он тратит ваше время.

Большинство инструментов позволяют подавить предупреждение и задокументировать причину (в данном случае это ошибка в инструменте).

Если поставщику вашего инструмента требуется дополнительная информация, вы можете опубликовать свой вопрос в дискуссионном форуме по адресу http://www.misra-c.com, чтобы получить официальный ответ и отправить его поставщику.

person Veriloud    schedule 31.07.2015
comment
Спасибо, и я сообщу поставщику, потому что я думаю, что у этого инструмента возникли проблемы с MISRA-C. Кстати, это TriCore Eclipse IDE v5.0r2 от Altium. - person m4l490n; 03.08.2015
comment
Как я уже сказал, MISRA-C: 2012 - большое улучшение, и в результате он стал базовым стандартом кодирования C для других критически важных для безопасности отраслей (помимо автомобилей). Однако организация MISRA не имеет программы сертификации или соответствия для инструментов, пользователи должны выяснить, какие из них лучше всего соответствуют их потребностям и лучше всего помогают им заполнить свою матрицу соответствия. - person Veriloud; 04.08.2015

Хм, это правило сделает установку 8-битных регистров практически невозможной, поскольку арифметические операции выполняются как int или больше ( обычные арифметические преобразования). Еще одна причина отказаться от MISRA как стандарта кодирования.

Я предполагаю, что вам нужно привести каждое значение в инициализаторе к типу соответствующего поля. Но, как указывается в правилах, это все равно является нарушением.

person too honest for this site    schedule 30.07.2015
comment
Я также пробовал использовать каждое значение, но все равно получаю ту же ошибку - person m4l490n; 30.07.2015
comment
Можете ли вы объяснить, почему вы думаете, что это правило делает невозможной установку 8-битных регистров? - person Andrew; 06.08.2015
comment
@ Андрей: Я забыл про слепки. Как ни странно, gcc предупреждает примерно то же самое при использовании -Wconversions. Я все равно удалю ответ в ближайшее время, так как он, по-видимому, не помогает, и я не эксперт MISRA - я действительно думаю, что это хорошее чтение для новичков, чтобы узнать о ловушках, но не лучшая идея воспринимать его как религиозный. большинство его учеников так и поступают. Хороший компилятор с активированным большинством предупреждений намного лучше и дает некоторую гибкость для опытного программиста, не ограничивая его ;-). - person too honest for this site; 06.08.2015
comment
Никто не должен считать это религиозным, но должен изучить и понять причину, лежащую в основе руководящих принципов ... - person Andrew; 06.08.2015
comment
@ Андрей: с этим я полностью согласен. Но многие компании, по-видимому, считают, что MISRA делает плохого программиста, пишущего хороший код, а хороших программистов - еще лучше. И защищайте эту веру от всех обратных доказательств и доводов. - person too honest for this site; 06.08.2015
comment
@Olaf - действительно ... именно поэтому мы написали первые шесть глав книги. Но слишком многие люди читают Правила и игнорируют остальные! - person Andrew; 06.08.2015
comment
@ Андрей: только что заглянул в ваш профиль. На самом деле не знал, что вы один из участников. FWIW: Я думаю, что правила и объяснения действительно стоит прочитать, но на самом деле использование MISRA сделало бы мой код менее безопасным, поскольку я использую расширение gcc, которое избегает многих приведений, сохраняя при этом безопасность типов. Это мое главное беспокойство по поводу MISRA (а также код иногда может стать менее читаемым). Неважно! - person too honest for this site; 07.08.2015
comment
Может, нам стоит переместить это в чат ... Мне интересно услышать, почему вы так себя чувствуете :-) - person Andrew; 07.08.2015
comment
@Olaf - заходите в chat.stackoverflow.com/rooms/85390/misra-musings (любой другой тоже приветствуются) - person Andrew; 07.08.2015

Когда я использую PC-Lint для проверки правил Misra, мне часто приходится добавлять суффикс u к константам:

const NVMM_ConfigType NvmmCnf_Layout[6] =
{
   {  1u, 1u,   4u},
   {  2u, 3u,   4u},
   {  5u, 5u,  16u},
   { 10u, 1u,   4u},
   { 11u, 2u,  32u},
   { 13u, 1u, 100u},
};

Это исключает преобразование int в unsigned.

Если этого недостаточно, приводит:

const NVMM_ConfigType NvmmCnf_Layout[6] =
{
   { (uint8_t ) 1u, 1u, (uint16_t )  4u},
   { (uint8_t ) 2u, 3u, (uint16_t )  4u},
   { (uint8_t ) 5u, 5u, (uint16_t ) 16u},
   { (uint8_t )10u, 1u, (uint16_t )  4u},
   { (uint8_t )11u, 2u, (uint16_t ) 32u},
   { (uint8_t )13u, 1u, (uint16_t )100u},
};
person Doug Currie    schedule 06.08.2015
comment
Я также пробовал эти два варианта, но все еще не смог. Все приводит к выводу, что инструмент работает некорректно. - person m4l490n; 06.08.2015
comment
@Doug Это MISRA-C: 2012, а не MISRA-C: 2004. - person Veriloud; 06.08.2015
comment
@Veriloud, ваше утверждение верно, но я не понимаю, как оно соотносится с моим ответом. Вы хотите сказать, что использование PC-Lint для соответствия MISRA-C: 2012 не имеет этой проблемы? - person Doug Currie; 06.08.2015
comment
@Doug, да, это нарушение MISRA 2004, но это лишнее, и MISRA-C 2012 соглашается, а почему бы и нет? Я большой поклонник MISRA-C: 2012, и это одна из многих причин. - person Veriloud; 07.08.2015
comment
Если PC-Lint помечает это как проблему MISRA-C: 2012, это ошибка, но неудивительно, что это не лучший вариант в своем классе. - person Veriloud; 07.08.2015