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 定义了其自己的值,因此可以移植代码而不会产生问题。