如何解决使用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
相关产品推荐
相关产品推荐

