3

我有以下内容:

typedef enum
{
   FLS_PROG_SUCCESS,
   FLS_PROG_FAIL,
   FLS_ERASE_SUCCESS2U,
   FLS_ERASE_FAIL,
   FLS_READ_SUCCESS,
   FLS_READ_FAIL,
   FLS_FORMAT_SUCCESS,
   FLS_FORMAT_FAIL
}FLS_JobResult_t;

void Foo(void)
{
   FLS_JobResult_t ProgramStatus;

   /* Then I try to initialize the variable value */
   ProgramStatus = FLS_PROG_SUCCESS;

   ...
}

无辜的呃,但是在编译 MISRA C 时会出现错误:

不应将表达式的值分配给具有较窄基本类型或不同基本类型类别的对象

我发现我应该编写如下初始化:

ProgramStatus = (FLS_JobResult_t)FLS_PROG_SUCCESS;

这对我来说看起来不太好,就像 MISRA 想要我在所有代码中进行强制转换,这太过分了。

你知道这是为什么吗?我不认为这应该是一个问题,但我已经尝试了所有想到的东西,这是摆脱这个错误的唯一方法,但它根本没有任何意义,不是吗?

问候。

4

1 回答 1

6

(嗨,这是一个新帐户,所以我不能使用评论部分要求进一步澄清,所以,我的回答可能比需要的更广泛)

根据警告消息的文本,我假设您正在谈论 MISRA-C:2012(最新标准),这比以前的标准有了很大的改进,因为在说明基本原理方面付出了更多努力,而且更多合规和非已添加合规示例。这是规则 10.3,其基本原理是:由于 C 允许自动执行不同算术类型之间的赋值,因此使用这些隐式转换可能会导致意外结果,可能会丢失值、符号或精度。

因此 MISRA-C:2012 需要使用更强的类型,正如其基本类型模型所强制执行的那样,这降低了这些问题发生的可能性。

不幸的是,许多工具没有正确地实现规则和类型模型。在这种情况下,您的工具不正确,这并不违反基本类型规则,因为ProgramStatusFLS_PROG_SUCCESS都是相同的基本类型。事实上,标准本身显示了一个类似的示例,在规则的兼容示例列表下:

enum enuma { A1, A2, A3   } ena;
ena  = A1;

如果您的工具供应商不同意,您可以在“官方”MISRA 论坛上发布您的问题以获得官方答案并将其转发给供应商。

于 2015-07-31T20:01:09.660 回答