You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决使用volatile指针触发的MISRA规则13.2错误?

修复MISRA规则13.2的问题

问题根源

你代码里的buf[0u]表达式包含两个独立的volatile访问操作:

  • 读取volatile指针buf自身的值(这是一个持久副作用,因为buf的内存位置可能被外部代码修改)
  • 解引用该指针,读取指向的volatile uint32_t类型数据(另一个独立的持久副作用)

MISRA Rule 13.2要求表达式在所有允许的求值顺序下,结果和持久副作用必须保持一致。但C标准并未强制规定同一表达式中多个volatile操作的执行顺序,因此这种写法触发了规则违反。

修复方案

把两个volatile访问拆成独立语句,用一个非volatile的临时指针中转,确保每一步的副作用顺序明确且唯一:

volatile uint32_t * volatile buf;

void function1()
{
 uint32_t TmpSize;
 // 先读取volatile指针buf的值,存入非volatile临时指针
 uint32_t * const tmp_buf = buf;
 // 通过临时指针读取目标数据
 TmpSize = *tmp_buf;

 /*do something with TmpSize here*/
}

修改后,两个volatile操作被拆分为两个独立的表达式,每个表达式仅包含一个持久副作用,求值顺序完全确定,既符合MISRA Rule 13.2的要求,也保留了buf的volatile属性以应对其位置可能被外部修改的场景。

内容的提问来源于stack exchange,提问作者Jee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 18:54:58