2

我正在使用 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 实现,根据标准库定义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使用吗?

有没有?

{请不要在 [on this thread] 讨论 MISRA 的优点(或其他方面)}

4

3 回答 3

1

MISRA 规则 10.1 说

(规则 10.1)如果出现以下情况,整数类型表达式的值不应隐式转换为不同的基础类型:

a)它不是转换为具有相同符号的更广泛的整数类型,或

b) 表达式很复杂,或

c) 表达式不是常量并且是函数参数,或者

d) 表达式不是常量,是返回表达式

#include <stdbool.h>

bool myFlag = false;

是相同的:

_Bool myFlag = 0;

0int有符号整数类型但又_Bool是无符号整数类型的类型。您正在将有符号类型的值隐式转换为无符号类型的值,因此您违反a)了 MISRA 规则 10.1。

请注意,如果您使用的是 MISRA-C:2004(我认为 MISRA-C:2012 尚未发布),则在发布时仅考虑了 C90,并且_Bool是 C99 的补充。正如我在评论中所写,您可以使用这样的演员来摆脱警告:

bool myFlag = (bool) false;

这就是 MISRA 的美妙之处。

于 2012-10-23T10:18:57.627 回答
0

似乎没有办法解决它,但你可以自己定义 bool :

typedef enum _bool { false = 0, true = 1 } bool;
bool x = false;

这应该通过严格的检查。

于 2012-10-23T10:26:06.457 回答
0

您可以#undef true然后将它们定义为使 MISRA 的东西满意的新值false#include <stdbool.h>

C99 和 C11 允许这种做法作为过时的功能。

于 2012-11-01T17:55:06.517 回答