2014-01-29 86 views
0

在以下几行,我得到不同的问题来自Parasoft的C/C++测试静态分析工具,并从的IAR Embedded Workbench MISRA检查报告:MISRA 9.2初始化浮动和无符号阵列

[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嵌入式工作台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." 

哪些检查是正确的?

回答

2

Parasoft的静态分析说:

并非变量'array_a'的所有元素都被初始化。

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

static float array_b [20] = {0};

严格地说,这不是MISRA兼容,因为所有的整数文字有,因为他们是你的第一个代码是无符号。更改为0u0U或实际上0.0f(后者最有意义)。

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

同样在这里,不符合MISRA。

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

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

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

0

对不起使用答案功能,但评论需要50声望。
我想你已经发现了这两条MISRA规则的明显冲突。我不知道其中的一个比另一个更重要,但主要是您应该考虑一下,如果您的代码在所有可能的平台上正确执行,您将使用它,并且您可以禁用此情况下的警告。据我所知,如果你故意做事,可以忽略MISRA警告。 (不要忘了写,之所以无视规则到代码!)
要回答你的问题:两个跳棋是正确的IMO

但除此之外你尝试:

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

如果这是不对的,请不要downvote,我可以编辑了;)

+0

MISRA规则之间没有冲突。一个工具被打破,另一个是正确的。你的强制转换不会解决任何问题,实际上这些代码不符合MISRA标准,因为它对具有“U”后缀的整数文字很挑剔。 – Lundin

+0

如果您有理由并且每次实施MISRA的偏差程序都不同,那么您可能会偏离MISRA规则。一般来说,个别程序员不得在未经批准的情况下做出偏差,例如通过公司质量体系提出正式要求。就我个人而言,我认为这是实施MISRA的一种相当乏味的方式。相反,我会建议创建一个“全局”文档,其中只包含MISRA-C允许的偏差和基本原理。此文件应在需要时予以保留。 – Lundin