PORTING.CMPSPEC.TYPE.BOOL
对布尔型的赋值大于 1 字节
PORTING 检查器会标识那些可能依赖于不同编译器中特定实施细则的代码。PORTING.CMPSPEC.TYPE.BOOL 检查器会检测对布尔型的赋值大于 1 字节的情况。
漏洞与风险
布尔数据类型 (bool) 设计用于持有值 1 (true) 或 0 (false),但可以强制其依赖于 ANSI 定型规则,该规则非常灵活,并且允许将布尔型视为整型。当在具有不同级别灵活性的编译器之间移植项目时,这可能导致出现问题,因此该检查器会强制针对任何布尔数据类型实施最大 1 字节的分配。
缓解与预防
请勿交换布尔数据和其他整型数据。C++ 标准定义了布尔关键字“true”和“false”,以分别代表整型值 1 和 0。此外,许多编译器都定义了 TRUE 和 FALSE 宏或合适的占位符,或者您也可以定义您自己的值。
漏洞代码示例
复制
void foo()
{
bool b;
b = 0x100;
}
某些编译器可能选择假设布尔变量已被分配了 true 值并保存为 1,而对发生的将整型截断成布尔型的操作发出警告。而其他编译器可能依靠简单的 ANSI 定型规则并保存为指定的 0x100 值。这种互换能力的缺乏可能在数据传输或永久性存储中导致移植问题。
修正代码示例
复制
#define MY_TRUE 0x01
#define MY_FALSE 0x00
void foo()
{
bool b;
b = MY_TRUE;
b = 1;
b = true;
}
在经修复的示例中,代码针对布尔 true 和 false 定义了其自己的值,因此可以移植代码而不会产生问题。