【发布时间】: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 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?
有吗?
{请不要在 [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 更好、更流畅地处理隐式类型转换。