结构数组初始化中的MISRA-C错误

m4l*_*90n 7 c misra array-initialization

我有以下内容:

typedef struct
{
   uint8_t BlockID;
   uint32_t Copies;
   uint16_t Size;
}NVMM_ConfigType;

const NVMM_ConfigType NvmmCnf_Layout[6] =
{
   {  1, 1,   4},
   {  2, 3,   4},
   {  5, 5,  16},
   { 10, 1,   4},
   { 11, 2,  32},
   { 13, 1, 100},
};
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很好,但是,MISRA-C给出了以下错误:

MISRA C:2012规则10.3违规:[R]表达式的值不得分配给具有较窄基本类型或不同基本类型类别的对象

我试图弄清楚为什么会这样,但我只能看到它.在类似的情况下,构建结果也会受到这种错误的困扰,我不知道为什么.

有人知道发生了什么吗?

编辑:我也尝试显式转换每个值仍然得到相同的错误:

const NVMM_ConfigType NvmmCnf_Layout[6] =
{
    {  (uint8_t)1, (uint32_t)1,   (uint16_t)4},
    {  (uint8_t)2, (uint32_t)3,   (uint16_t)4},
    {  (uint8_t)5, (uint32_t)5,  (uint16_t)16},
    { (uint8_t)10, (uint32_t)1,   (uint16_t)4},
    { (uint8_t)11, (uint32_t)2,  (uint16_t)32},
    { (uint8_t)13, (uint32_t)1, (uint16_t)100},
};
Run Code Online (Sandbox Code Playgroud)

Ver*_*oud 5

(嗨,这是一个新帐户,所以我还不能使用评论部分要求进一步说明,所以请原谅我的长回复)

具体而言,此规则 10.3 与 MISRA-C:2012(最新标准)有关,与之前的版本相比,这是一个很大的改进,因为在解释 MISRA 的基本原理方面做出了更多努力,以及更多合规和不合规示例。

该规则的基本原理是:由于 C 允许自动执行不同算术类型之间的赋值,因此使用这些隐式转换可能会导致意外结果,并有可能丢失值、符号或精度。MISRA_C:2012 有一个基本类型模型来帮助警告何时可能发生这种情况。

规则描述还包括规则的例外情况。对于规则 10.3,一个例外是: 一个本质上有符号类型的非负整数常量表达式可以分配给一个本质上无符号类型的对象,如果它的值可以用那种类型表示。

不清楚您的工具报告违规的确切行和列(应该)。更好的工具还将提供有关违反规则的确切部分的更详细信息(例如,如果您在第一次分配给 8 位时使用 128 而不是 1,则该工具应该非常明确地说明这一点)。

在任何情况下,我都没有(我的工具也没有)在这里看到任何违反 10.3 的行为。

由于这是一个“可判定”规则,如果这是安全关键代码,我会担心该工具,除了它浪费你的时间。

大多数工具允许您抑制警告并记录原因(在这种情况下,它是工具中的错误)。

如果您的工具供应商需要更多信息,您可以在http://www.misra-c.com的讨论论坛中发布您的问题,以获得官方答复并将其转发给供应商。


too*_*ite 1

嗯,该规则将使设置 8 位寄存器实际上变得不可能,因为算术运算的执行等于int或更大(通常的算术转换)。拒绝 MISRA 作为编码标准的又一个原因。

我假设您必须将初始化程序中的每个值转换为相应字段的类型。但正如规则所引用的那样,这仍然是一种违规行为。

  • @Olaf - 确实......这就是我们写这本书的前六章的原因。但太多人阅读了规则而忽略了其余部分! (2认同)