MISRA C 2012是否说不要使用bool

Nic*_*ick 6 c c99 misra language-lawyer pc-lint

我正处于制定新项目的初期阶段.

我定义了一个返回类型为"bool"的函数

我从PC-Lint得到了这个输出

    Including file sockets.h (hdr)
bool sock_close(uint8_t socket_id);
^
"LINT: sockets.h (52, 1) Note 970: Use of modifier or type '_Bool' outside of a typedef [MISRA 2012 Directive 4.6, advisory]"
Run Code Online (Sandbox Code Playgroud)

我继续在另一个标题中定义了这个以关闭lint:

typedef bool bool_t;
Run Code Online (Sandbox Code Playgroud)

然后我开始想知道为什么我必须这样做以及为什么它改变了什么.我转向MISRA 2012 Dir 4.6.它主要关注基本类型的宽度,如short,int和long,它们的宽度以及它们的签名方式.

该标准没有给出任何放大,合理,例外或bool的例子.

bool在C99中的stdbool.h中明确定义为_Bool.那么这个标准真的适用于bool吗?

根据C99的第6.2.5节,我认为_Bool明确地始终是"最小的标准无符号整数类型,足以存储值0和1".所以我们知道bool是无符号的.那么问题就在于_Bool不是固定的宽度而且主题被提升的某种方式是问题吗?因为理性似乎与这个概念相矛盾.

遵守本指南并不保证可移植性,因为int类型的大小可能决定表达式是否受整数提升的影响.

如何typedef bool bool_t;改变任何东西 - 因为我没有做任何表示这样做的宽度或标记?bool_t的宽度也将取决于平台.有没有更好的方法重新定义布尔?

除非实现的类型实际上具有该长度,否则不能使用特定长度定义类型

所以typedef bool bool8_t;应该完全违法.

Gimpel对指令4.6的解释是错误的还是他们发现了?

Lun*_*din 8

在typedef之外使用修饰符或类型'_Bool'[MISRA 2012 Directive 4.6,advisory]

这是废话,指令4.6只关心使用的类型stdint.h,而不是int,short等该指令是关于基本数值类型.bool与该指令无关,因为它不是数字类型.

由于未知原因,MISRA-C:2012示例使用称为奇怪的类型bool_t,这不是标准的.但是MISRA决不强制要求在任何地方使用这种类型,特别是它们不会在指令4.6中强制执行它,它甚至没有提到布尔值.MISRA不会阻止使用bool_Bool在任何地方使用.

Gimpel对指令4.6的解释是错误的

是的,他们的工具提供了错误的诊断.

此外,您可能必须配置工具(如果可能)以告诉它使用了哪种bool类型.5.3.2提到如果不使用则可能必须这样做_Bool,这意味着所有静态分析仪必须理解_Bool.但即使bool类型配置正确,dir 4.6也与它无关.

  • 金普尔的支持也同意这是误报.所以我只是在项目的lnt文件中使用-esym(970,_Bool)来抑制关于bool的注释970. (2认同)