Как исправить нарушение Misra 2012, операция присваивания в выражении

Я пытаюсь немного очистить 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?


person Priyadarshini Singh    schedule 24.06.2019    source источник
comment
Имея скобки вокруг расширения macto, оно стало выражением. Изменить на: VAR &= ~( BIT )   -  person Paul Ogilvie    schedule 24.06.2019
comment
Такое же нарушение есть.   -  person Priyadarshini Singh    schedule 24.06.2019
comment
Это выражение со скобками или без них. Каждое присвоение является выражением. Но я согласен с тем, что, вероятно, наличие круглых скобок заставляет валидатор помечать это.   -  person John Bollinger    schedule 24.06.2019
comment
Действительно ли так выглядит исходный код? Если нет, опубликуйте. Если да, пожалуйста, назовите используемый статический анализатор, чтобы мы могли пристыдить его перед интернет-публикой.   -  person Lundin    schedule 24.06.2019
comment
ОТ: Вокруг VAR тоже должны быть скобки.   -  person alk    schedule 24.06.2019
comment
Я пробовал с круглыми скобками и без них, даже приведение типов. Но все напрасно   -  person Priyadarshini Singh    schedule 24.06.2019
comment
Как выглядит код до и после вызова макроса? Вместо круглых скобок вы можете использовать do { … } while (0) для операторов макросов.   -  person starblue    schedule 24.06.2019
comment
Рекомендация убрать круглые скобки вокруг расширения макроса только для того, чтобы угодить инструменту анализа (который в любом случае, вероятно, содержит ошибки) — плохой совет. Лучше превратить макрос в оператор, как это предложил @starblue. Но пока это остается выражением, было бы плохой практикой удалять круглые скобки. Меня всегда нервирует то, что люди вмешиваются в свой код методом проб и ошибок, чтобы избавиться от того или иного предупреждения...   -  person Dirk Herrmann    schedule 05.07.2019


Ответы (2)


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

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

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

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

person Lundin    schedule 24.06.2019
comment
Я упомянул поток моего кода ниже: #define BIT_1 0x01u #define CLEAR_BIT( VAR, BIT ) VAR &= ~(BIT) volatile uint32 var2 = 0u uint32 VAR_1 = 0x00000000U; VAR_1 = переменная2 ; CLEAR_BIT(VAR_1, BIT_1); Вот как работает код. - person Priyadarshini Singh; 24.06.2019
comment
@PriyadarshiniSingh Хорошо, похоже, это ошибка в статическом анализаторе. Это не редкость, эти инструменты часто сильно ломаются. - person Lundin; 24.06.2019
comment
Спасибо за ваши предложения, проверим с набором инструментов. - person Priyadarshini Singh; 24.06.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))

person Priyadarshini Singh    schedule 08.07.2019