如何从C函数合规返回const结构体成员地址以符合MISRA标准?
解决MISRA C.11.8规则冲突:结构体成员地址获取函数的合规方案
我有一个C函数,用于获取结构体成员的地址并以void*类型返回。为了避免函数内部修改结构体成员,我将第一个参数设为指向该结构体的const指针,但这触发了MISRA 2023规则C.11.8的告警——该规则明确禁止移除指针指向类型的const、volatile或_Atomic限定符。
结构体定义
typedef struct { uint16 ID; int16 *In; int16 Out; int16 V; int8 sfr; } GAIN_FIP16;
当前函数实现
void* Gain_FiP16_GetAddress(const GAIN_FIP16* block, uint16 elementId) { void* addr; switch (elementId) { case 1: addr = (void*)block->In; break; case 2: addr = (void*)&block->Out; break; default: addr = NULL; break; } return (addr); }
MISRA告警说明
MISRA检查工具针对代码中的(void*)&block->Out转换提出告警,违反的规则内容为:
转换不得移除指针指向类型的const、volatile或_Atomic限定符。
已知解决思路
- 移除第一个函数参数的const限定符,但会丢失参数的只读特性
- 申请MISRA规则偏差
问题
是否存在其他既能满足MISRA合规要求,又能保留参数只读特性的解决方案?
我曾尝试移除block参数的const限定符,确实解决了MISRA告警,但代价是失去了原本的只读保护特性。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

