Как исправить нарушение Misra 2012, «Операция присваивания в выражении» - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь немного очистить 32-битную переменную с помощью макроса. например.

#define CLEAR_BIT( VAR, BIT )       ( VAR &= ~( BIT ) )

в функции я назвал макрос

CLEAR_BIT(variable, 0x01 );

В этом случае я получаю нарушение MISRA C - 2012 как «Операция назначения в выражении» «MISRA-C: 2012 R.13.1, R.13.2, R.13.4»

Если кто-то может дать мне знать, что я делаю неправильно согласно правилам MISRA C?

Ответы [ 2 ]

3 голосов
/ 24 июня 2019

Если вы действительно называете макрос как CLEAR_BIT(variable, 0x01 );, а не, например, if(CLEAR_BIT(variable, 0x01)) ..., тогда предупреждение неверно, и инструмент сломан.

Здесь применимо правило 13.4, в котором говорится, что вы не можете смешивать присваивание с другими выражениями (результат операции присваивания не должен использоваться). Из того, что мы можем судить по опубликованному коду, вы этого не делаете.

Кроме того, в этом коде нет непреднамеренных побочных эффектов, о чем говорят другие правила 13.1-13.2. Сложное присвоение оценивает левый операнд только один раз, поэтому не должно иметь значения, является ли оно volatile и т. Д.

У вас есть другие проблемы с этим кодом, такие как использование целочисленной константы со знаком 0x01 и, в зависимости от типа переменной, потенциально различных нарушений правил неявного продвижения, использование функциональных макросов. Но эти проблемы должны давать совершенно разные предупреждения.

0 голосов
/ 08 июля 2019

, если вышеупомянутый макрос переопределен как

определить CLEAR_BIT (VAR, BIT) (VAR) & = (~ (BIT))

Тогда код будет соответствовать правилам Misra.

Ошибка «Операция присваивания в выражении» «MISRA-C: 2012 R.13.1, R.13.2, R.13.4» произойдет, когда мы напишем расширение MACRO в скобках (). т.е. #define CLEAR_BIT (VAR, BIT) (VAR & = ~ (BIT))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...