m4l*_*90n 3 enums casting 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;
...
}
Run Code Online (Sandbox Code Playgroud)
无辜呃,但在编译MISRA C时会出错:
表达式的值不应分配给具有较窄基本类型或不同基本类型类别的对象
我发现我将按如下方式编写初始化:
ProgramStatus = (FLS_JobResult_t)FLS_PROG_SUCCESS;
Run Code Online (Sandbox Code Playgroud)
这对我来说看起来不太好,就像MISRA希望我在所有代码中抛出强制转换,这太过分了.
你知道为什么吗?我不认为这应该是一个问题,但我已经尝试了所有我想到的东西,这是摆脱这个错误的唯一方法,但它根本没有任何意义,是吗?
问候.
(嗨,这是一个新帐户,所以我还不能使用评论部分要求进一步澄清,所以,我的回答可能比需要的更广泛)
基于警告信息的文本,我假设您正在讨论MISRA-C:2012(最新标准),这是对以前的标准的一项重大改进,其中更多的努力表明基本原理以及更多符合要求的非已添加兼容示例.这是规则10.3,其基本原理是:由于C允许自动执行不同算术类型之间的分配,因此使用这些隐式转换可能会导致意外结果,并可能导致价值,符号或精度损失.
因此,MISRA-C:2012要求使用更强大的打字,这是由其基本类型模型强制执行的,这可以降低这些问题发生的可能性.
不幸的是,许多工具没有正确实现规则和类型模型.在这种情况下,你的工具是不正确,这是不是违反基本类型规则,因为ProgramStatus
和FLS_PROG_SUCCESS
都是相同的基本类型.实际上,在规则的兼容示例列表下,标准本身也显示了一个类似的示例:
enum enuma { A1, A2, A3 } ena;
ena = A1;
Run Code Online (Sandbox Code Playgroud)
如果您的工具供应商不同意,您可以在"官方"MISRA论坛上发布您的问题,以获得正式答案并将其转发给供应商.