8

我正处于一个新项目框架的早期阶段。

我定义了一个返回类型为“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]"

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

typedef bool bool_t;

然后我开始想知道为什么我必须这样做以及为什么它改变了任何东西。我转向 MISRA 2012 Dir 4.6。它主要关注原始类型的宽度,如 short、int 和 long、它们的宽度以及它们是如何签名的。

该标准没有给出 bool 的任何放大、合理、例外或示例。

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

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

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

放置如何typedef bool bool_t;改变任何东西 - 因为我没有做任何事情来表明这样做的宽度或签名?bool_t 的宽度也将取决于平台。有没有更好的方法来重新定义 bool?

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

所以typedef bool bool8_t;应该是完全非法的。

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

4

2 回答 2

10

在 typedef 之外使用修饰符或类型“_Bool”[MISRA 2012 Directive 4.6,咨询]

胡说八道,指令 4.6 只关心使用 instdint.h而不是intshort的类型。指令是关于基本数值类型的bool与该指令无关,因为它不是数字类型。

由于未知的原因,MISRA-C:2012 示例使用了一种称为 的奇怪类型bool_t,这不是标准的。但是 MISRA 绝不会强制这种类型在任何地方使用,特别是它们没有在指令 4.6 中强制使用它,甚至没有提到布尔值。MISRA 不鼓励在任何地方使用bool或使用_Bool

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

是的,他们的工具给出了不正确的诊断。

此外,您可能必须配置工具(如果可能)以告诉它使用哪种布尔类型。5.3.2 提到如果不使用可能必须这样做_Bool,暗示所有静态分析器都必须了解_Bool。但是即使正确配置了 bool 类型,dir 4.6 也与它无关。

于 2015-06-03T08:04:18.437 回答
4

布尔类型的一个潜在问题是 C99 之前的许多代码使用单字节类型来保存真/假值,其中相当一部分可能使用了名称“bool”。尝试将 256 的任何倍数存储到大多数此类类型中将被视为存储零,而将 256 的非零倍数存储到 c99“bool”将产生 1。如果使用 C99“bool”的一段代码是移植到使用 typedef 字节的一段代码中,生成的代码很容易发生故障(在存储 0 或 1 以外的值时,为 typedef 字节编写的代码不太可能依赖于任何特定行为)。

于 2016-06-21T17:38:35.177 回答