0

在以下几行中,我收到了来自 Parasoft C/C++ 测试静态分析工具和 IAR Embedded Workbench MISRA 检查器报告的不同问题:

[1] static unsigned int array_a[30] = {0U};
[2] static float array_b[20] = {0.0f};

Parasoft 静态分析 说:

Not all elements of variable ‘array_a’ are initialized.
Not all elements of variable ‘array_b’ are initialized.

IAR Embedded Workbench 对上述语句没有任何问题(并且其 MISRA 检查器已打开)。

我可以使变量“array_b”的消息消失:

[3] static float array_b[20] = {0};

但是,同样的技巧不适用于“array_a”:

[4] static unsigned int array_a[30] = {0};

现在 IAR Embedded Workbench MISRA 检查器正在抱怨,因为有符号整数常量 0 被分配给无符号整数:

Error[Pm127]: a 'U' suffix shall be applied to all constants of 'unsigned' type (MISRA C 2004 rule 10.6)

Parasoft 静态分析未显示上述第 4 行的任何问题。

我相信这归结为 MISRA 规则 9.2 对“零”的解释:
例外

"All the elements of arrays or structures can be initialized (to zero or NULL)
by giving an explicit initializer for the first element only. If this method
of initialization is chosen then the first element should be initialized
to zero (or NULL), and nested braces need not be used."

哪个检查器是正确的?

4

3 回答 3

2

Parasoft 静态分析 说:

并非变量“array_a”的所有元素都已初始化。

这是不正确的。所有元素都已初始化,并且代码不违反 MISRA-C 9.2,它明确允许零初始化,仅将数组的一项设置为零。

静态浮点数组_b[20] = {0};

严格来说,这不符合 MISRA,因为所有整数文字都必须是无符号的,就像它们在您的第一个代码中一样。更改为0uor0U或确实0.0f(后者最有意义)。

静态无符号整数 array_a[30] = {0};

同样在这里,不符合 MISRA。

Parasoft 静态分析未显示上述第 4 行的任何问题。

在所有提到的情况下,Parasoft 似乎都是不正确的。您应该在他们的 MISRA 检查器中将此报告为错误。

在所有提到的情况下,IAR 似乎都是正确的。

于 2014-01-30T07:45:30.510 回答
0

我认为您已经发现这两条 MISRA 规则有明显的冲突。我不知道其中一个是否比另一个更重要,但主要是您应该考虑,如果您的代码在所有可能的平台上都正确执行,您将使用它,以及是否可以针对这种情况停用警告。据我所知,如果您故意做某事,则可以忽略 MISRA 警告。(不要忘记将忽略规则的原因写到代码中!)
回答您的问题:两个检查器都是正确的 IMO

但除此之外,您是否尝试过:

static unsigned int array_a[30] = {(unsigned int) 0};
static float array_b[20] = {(float) 0};

于 2014-01-30T04:57:04.050 回答
0

C 标准允许{0}作为聚合初始化器

上述 MISRA C 规则 9.2 豁免的目的是允许{0}用于任何允许的类型。

于 2021-09-18T07:18:35.573 回答