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的解释是错误的还是他们发现了?
在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也与它无关.