C 中用户定义数据类型的 const 说明符

标签 c embedded misra

我有用户定义的数据类型

typedef Unsigned int8  COMMAND_TYPE[6];

现在我有类似的功能

ConnectCommand(COMMAND_TYPE const command)
{
}

当尝试运行静态分析器检查时,我收到 Misra 警告“指针参数‘command’寻址的对象未被修改,因此指针可能是‘指向常量的指针’类型”
这违反了 Misra 规则 16.7

虽然使用了 const 说明符,但 misra 规则 checkin 工具似乎没有在此处看到它,为什么?

最佳答案

确定这是静态分析器检查问题。

下面做同样的事情,两者都应该通过你的检查。

ConnectCommand(COMMAND_TYPE const command)
ConnectCommand(const COMMAND_TYPE command)

虽然是合法的代码,但使用了typedef一个数组,混淆了你的检查器。 IMO,这是一种最好避免的设计风格。


制作此社区 wiki 以供引用。一旦出现好的答案,建议删除。

<罢工>

<罢工>

经过审查,我怀疑问题出在 Misra - 它给出了错误警告。 #2 和下面评论的#3 做同样的事情。 #4 与#2、#3 是多余的。

我将删除此答案或重新正确处理它。

建议尝试

typedef       Unsigned int8       COMMAND_TYPE[6];
typedef const Unsigned int8 CONST_COMMAND_TYPE[6];

void ConnectCommand(CONST_COMMAND_TYPE command) {
  ...
}

  COMMAND_TYPE c;
  ConnectCommand(c);

constConnectCommand(COMMAND_TYPE const command) { ...}指的是 const command . command是指向 COMMAND_TYPE 类型对象的指针. const command暗示指针不应在 ConnectCommand() 中更改函数体。

警告“... type pointer to const”中的“const”建议使用 const command 指向的对象类型 .这是因为command指向的数据没有改变。

//             add              could drop this const
//              |                   |
ConnectCommand(const COMMAND_TYPE const command)

<罢工>

关于C 中用户定义数据类型的 const 说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36481524/

相关文章:

c++ - 是否存在 LibC 操作系统?

c - sprintf 代码占用大量空间(嵌入式)

在 C 中将立体声 wav 转换为单声道

c - 使用 stringify 运算符 '#' MISRA Rule 20.10 (MISRA C :2012) . 实现 stringify 宏的替代方法是什么

c - 在 "C"程序中,如何将十六进制值存储在字符串变量中?

c - double 到 int 的转换在 c 中使用 math.h 函数不起作用

C类型无法被正确识别

c++ - 如何解决 "unresolved extenal symbol _DllMainCRTStartup@12"问题?

c - MISRA C2012 :10. 示例代码中存在 8 违规