【问题标题】:Telling VX-Tasking that "bool" in a boolean?用布尔值告诉 VX-Tasking “bool”?
【发布时间】:2012-10-23 10:05:57
【问题描述】:

我正在使用 Tasking VX 工具集(基于 Eclipse 构建)并且有一个我无法解决的相当基本但基本的问题......我已经 RTFMed 并且仍然完全不明智。

想象一下简单的sn-p代码:

#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 definitionstdbool.h 定义为:

#define bool  _Bool
#define true  1
#define false 0

我假设这个错误是因为#define false 0 并且该工具正在隐式转换为 bool?

注意:如果我进行赋值,则错误被删除:

 bool myFlag = (bool)false;

但是(恕我直言)这是掩盖问题,而不是解决问题,我真的不想分配每个任务。

LINT 等工具允许您指定 bool 类型以阻止此类误报...我需要 Eclipse/Tasking 的等价物


所以我的问题是:

我怀疑某处有一个工具选项告诉 TASKING bool 是布尔类型,因此可以使用 falsetrue

有吗?

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

【问题讨论】:

  • 你收到bool myFlag = (bool) false;的警告了吗?
  • 不...因此我的假设。但我真的不想用强制转换来弄乱每个布尔集或测试。
  • 最好的想法可能是#define TRUE 1u 等,但是代码需要重写以在任何地方使用大写版本。问题的根源在于您使用的是 C99,而 MISRA-C:2004 不允许也不支持 C99。
  • @lundin - 在某种程度上你是正确的,但是(我必须检查)即使在 MISRA-C:2012 中这也可能是一个问题(_BOOL 设置为无符号整数),因为stdbool.h 定义 bool 类型的笨拙方式......
  • @Andrew 如果 MISRA-C:2012 的最终版本与草稿类似,那么他们将更改表达式中类型的定义。他们计划引入一种称为“基本类型”的东西,而不是旧术语“基础类型”。布尔表达式将具有“基本布尔”类型,静态分析器必须正确处理它们。 MISRA 甚至声明 C90 中的“布尔枚举”应被视为基本布尔值。但是,当然,这只是目前的草案。看起来 MISRA-C:2012 无论如何都会比 2004 更好、更流畅地处理隐式类型转换。

标签: c eclipse misra


【解决方案1】:

MISRA 规则 10.1 说

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

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

b) 表达式很复杂,或者

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

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

#include <stdbool.h>

bool myFlag = false;

等同于:

_Bool myFlag = 0;

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

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

bool myFlag = (bool) false;

这就是 MISRA 的魅力。

【讨论】:

  • 不,MISRA-C:2012 尚未发布(即将...)
【解决方案2】:

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

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

这应该通过严格的检查。

【讨论】:

  • 那当然是C语言应该做的!
  • 您还必须删除 stdbool.h 标头,并且您将不会有与 _Bool 相同的行为(例如对于通常的算术转换)。
  • enum 本身就有很多符号问题,它们非常奇怪,以至于枚举变量和枚举常量不一定具有相同的符号和宽度。相反,使用#defines 并改写0u1u
  • 调用枚举类型bool 会引起混淆,因为您现在有两种名为bool 的类型,它们的行为和(在许多系统上)不同的大小(通常,sizeof(_Bool) 是 1 和 @ 987654329@ 是 4)。
【解决方案3】:

您可以在#include &lt;stdbool.h&gt; 之后将#undef truefalse 定义为使MISRA 成员满意的新值。

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

【讨论】:

  • 这不是一个好主意,因为#undef 被 MISRA-C 19.6 禁止,从标准库重新定义项目被 20.1 禁止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 2020-10-13
  • 2019-12-11
  • 2014-11-04
  • 1970-01-01
相关资源
最近更新 更多