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

C语言传结构体指针给void*形参触发MISRA告警的解决方案

MISRA C:2004 指针传参告警合规处理方案

告警根因

触发的SonarQube告警对应MISRA C:2004 11.2、11.3规则,核心要求为:禁止不同类型指针之间的隐式转换,所有指针类型转换必须显式声明,避免无感知的类型错配导致内存访问风险。
虽然标准C语法支持结构体指针隐式转换为void*类型,但静态检测工具会将这类未显式标注的转换判定为潜在风险,触发告警。

方案有效性验证

你尝试的在&msgSPI前添加(void*)显式强转的写法,是完全合规的正确实现,不存在任何功能或合规问题,依据如下:

  • C语言标准明确规定,所有指向对象的指针都可以安全转换为void*类型,转换前后指针指向的内存地址完全一致,不会修改原结构体的内存布局、也不会改变传入参数的实际值,原有正常运行的业务逻辑不会受任何影响。
  • 显式添加(void*)强转,相当于向静态检测工具、后续代码维护者明确告知:此处的指针类型转换是有意为之,目的是匹配第三方函数的void*形参类型,不存在误转换的情况,完全满足MISRA规则对指针转换的显式标注要求,不属于规则禁止的"危险转换"。

最终合规调用示例

// 第二个参数使用无符号字面量0U,可同时避免额外的类型转换类告警
message((void*)&msgSPI, 0U);

MISRA规则禁止的危险指针转换,特指无显式标注的隐式转换、以及不兼容类型间的指针强转(比如把结构体指针转为其他不相关结构体指针、把指针转为整型值这类可能引发内存解析错误的操作),对象指针到void*的显式转换不在禁止范围内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:34:46