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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:41:03