- операция увеличения / уменьшения в сочетании с другой операцией с побочными эффектами [MISRA 2012, правило 13.3, рекомендация] buf [count ++] = U1RXREG;
Это, как вы, наверное, заметили, решается перемещением увеличения из выражения присваивания:
buf[count] = U1RXREG;
count++;
Основанием для этого является предотвращение написания ошибок, таких как buf[count++] = count;
- у обеих сторон есть побочные эффекты [MISRA 2012, правило 1.3, обязательно], [MISRA 2012, правило 13.2, обязательно] buf [count] = U1RXREG;
Я бы сказал, что это ложный позитив. Линия buf[count] = U1RXREG;
безвредна.
Причина предупреждения заключается в том, что U1RXREG
, очевидно, является регистром rx-регистра аппаратного обеспечения UART, и MISRA-C не любит смешивать энергозависимый доступ с другими вещами в одном и том же выражении, особенно не с другим ". «побочный эффект», в данном случае ++
отсчета вместе с присвоением buf
. Это общий источник ложных срабатываний статических анализаторов, хотя иногда они находят реальные ошибки, связанные с этим, как в случае &&
, о котором вы спрашивали о вчера .
Предполагая 32-разрядные регистры, педантичный способ исправить это - использовать временную переменную:
uint32_t rxreg = U1RXREG
buf[count] = rxreg;
Что касается машинного кода и поведения программы, то это эквивалентно исходному коду.