我正在使用Tasking VX工具集(基于Eclipse构建),并且有一个相当基本但基本的问题,我无法解决这个问题......我已经完成了RTFMed并且仍然完全没有明智。
想象一下简单的代码片段:
#include <stdbool.h>
bool myFlag = false;
如果我启用MISRA-C检查,我会得到以下信息:
MISRA-C rule 10.1 violation: [R] restrict the use of implicit conversions for integer types
Eclipse设置为C99实现,根据standard library definition,stdbool.h
定义为:
#define bool _Bool
#define true 1
#define false 0
我假设这个错误是因为#define false 0
并且该工具隐式转换为bool?
注意:如果我转换了作业,则会删除错误:
bool myFlag = (bool)false;
但是(恕我直言)正在掩盖这个问题,而不是解决它,而且我真的不想抛出每一项任务。
LINT等工具允许你指定bool类型来阻止这类误报......我需要Eclipse / Tasking的等价物
所以我的问题是:
我怀疑某个地方有一个工具选项告诉TASKING bool
是布尔类型,因此false
和true
可以使用吗?
有吗?
{请不要[在此主题]讨论MISRA的优点(或其他方面)
答案 0 :(得分:1)
MISRA规则10.1说
(规则10.1)如果出现以下情况,整数类型表达式的值不得隐式转换为不同的基础类型:
a)它不是转换为相同签名的更宽整数类型,或
b)表达式很复杂,或者
c)表达式不是常量,是函数参数,或
d)表达式不是常量,是一个返回表达式
#include <stdbool.h>
bool myFlag = false;
与:
相同_Bool myFlag = 0;
0
的类型为int
,它是有符号整数类型,但_Bool
是无符号整数类型。
您隐式将有符号类型的值转换为无符号类型的值等等
您违反了MISRA规则10.1中的a)
。
请注意,如果您使用的是MISRA-C:2004(我认为MISRA-C:2012尚未发布),则在发布时仅考虑C90并且_Bool
是C99的补充。正如我在评论中所写,你可以使用这样的演员来消除警告:
bool myFlag = (bool) false;
这是MISRA的美丽。
答案 1 :(得分:0)
似乎无法解决这个问题,但你可以自己定义bool:
typedef enum _bool { false = 0, true = 1 } bool;
bool x = false;
这应该通过严格的检查。
答案 2 :(得分:0)
您可以在#undef
之后true
false
和#include <stdbool.h>
将其定义为使MISRA成为满意的新值。
C99和C11允许这种做法作为过时功能。