如何解决MISRA C:2012 C代码规则13.2和13.3?
我有C源代码,我正在使它符合MISRA。我发现与MISRA 2012规则13.3和13.2相关的以下错误:如何解决MISRA C:2012 C代码规则13.2和13.3?,c,embedded,misra,C,Embedded,Misra,我有C源代码,我正在使它符合MISRA。我发现与MISRA 2012规则13.3和13.2相关的以下错误: 增量/减量操作与具有副作用的其他操作相结合[MISRA 2012规则13.3,建议]buf[count++]=U1RXREG 双方都有副作用[MISRA 2012规则1.3,必需],[MISRA 2012规则13.2,必需]buf[计数]=U1RXREG 问题1的源代码: void UART_call(void) { if(count < BUF_SIZE) {
void UART_call(void)
{
if(count < BUF_SIZE)
{
buf[count++] = U1RXREG;
Flag = 1;
}
else
{
count = 0;
Flag = 0;
}
}
void UART\u调用(void)
{
如果(计数
在解决了问题1代码中的13.3错误后,我得到了MISRA 1.3和13.2错误。问题2的源代码:
void UART_call(void)
{
if(count < BUF_SIZE)
{
buf[count] = U1RXREG;
count = count + 1U;
Flag = 1;
}
else
{
count = 0;
Flag = 0;
}
}
void UART\u调用(void)
{
如果(计数
buf[count] = U1RXREG;
count++;
这背后的基本原理是防止编写错误,例如buf[count++]=count代码>
双方都有副作用[MISRA 2012规则1.3,必需],[MISRA 2012规则13.2,必需]buf[计数]=U1RXREG李>
我认为这是一个假阳性。行buf[count]=U1RXREG代码>是无害的
发出警告的原因是,U1RXREG
显然是UART硬件的易失性合格rx寄存器,并且MISRA-C不喜欢将易失性访问与同一表达式中的其他内容混合,特别是不喜欢与另一个“副作用”混合,在这种情况下,计数的++
与分配给buf的。这是静态分析仪误报的常见来源,尽管有时他们确实会发现与此相关的真正错误,如您询问的&
案例
假设是32位寄存器,那么修复它的迂腐方法是使用一个临时变量:
uint32_t rxreg = U1RXREG
buf[count] = rxreg;
就机器代码和程序行为而言,这相当于原始代码。函数UART\u调用中显示的变量计数是一个全局变量。对计数的任何修改都会产生副作用。MISRA坚持认为这些副作用在安全关键软件中是有害的。如何定义buf
和count
呢?为什么使用全局变量而不是参数?我认为用count=count+1U
取代count++
没有任何意义。谢谢你的帮助。这看起来不像是假的对我来说是积极的buf[count++]=count
具有未定义的行为,因为读取和写入count
时没有插入序列点。但是MISRA 13.3的目的是禁止作者认为可能混淆的定义良好的代码,如<代码> Buf[Cuth++] =不相关的值< /代码>。@ KeththpPsPn,您从哪里得到代码> Buf[Cuth++]=计数< /代码>?这既不在问题中,也不在这个答案中。大多数情况下,13.3是合理的,没有太多合理的理由说明为什么人们会将++与赋值表达式混合使用。@Lundin:不,这不是问题所在。这只是一个未定义行为的例子。IMHObuf[count++]=某个值
可以,但MISRA不同意。@KeithThompson我想重点是(count=0;count)的