为什么在将它分配给C中的同一个枚举变量类型时必须强制转换枚举元素?

时间:2015-07-30 16:50:57

标签: casting enums compiler-errors misra

我有以下内容:

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希望我在所有代码中抛出强制转换,这太过分了。

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

问候。

1 个答案:

答案 0 :(得分:6)

(Hi, this is a new account so I cannot use the comments section yet to ask for further clarification, so, my answer may be broader than needed)

Based on the text of the warning message I assume you are talking about MISRA-C:2012 (the latest standard) which is a great improvement over the prior ones in that much more effort in stating the rationale along with many more compliant and non-compliant examples have been added. This being Rule 10.3, the rationale is: since C permits assignments between different arithmetic types to be performed automatically, the use of these implicit conversions can lead to unintended results, with the potential for loss of value, sign or precision.

Thus MISRA-C:2012 requires the use of stronger typing, as enforced by its essential type model, which reduces the likelihood of these problems occurring.

Unfortunately many tools have not properly implemented the rules and the type model. In this case, your tool is incorrect, this is not a violation of essential type rules because ProgramStatus and FLS_PROG_SUCCESS are both the same essential type. In fact a similar example is shown in the standard itself, under the rule’s list of compliant examples:

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

If your tool vendor disagrees you can post your question on the "official" MISRA forum to get the official answer and forward that to the vendor.