PORTING.CMPSPEC.TYPE.LONGLONG

使用“long long”

PORTING 检查器会标识那些可能依赖于不同编译器中特定实施细则的代码。PORTING.CMPSPEC.TYPE.LONGLONG 检查器检测对“long long”的使用。

漏洞与风险

该数据类型的定义在各编译器之间的一致性非常差,因此应尽量避免使用。大部分编译器都提供了可用于替代该数据类型的抽象数据模型,因此编程人员知道将使用精确的 64 位(举例),而不是无法预料结果的 128 位。

缓解与预防

使用编译器固有的或已定义的宏来代表您想要的实际位大小,而不是仅仅假定“long long”将具有合理的宽度。

漏洞代码示例

复制
   void foo()
   {
     long long ll = 0xff00;        // PORTING.CMPSPEC.TYPE.LONGLONG
   }

使用该类型无法保证不同的编译器将如何在 II 的堆栈上保留空间。

修正代码示例

复制
   void foo()
   {
     UINT64_t l;     // compiler-defined, or data model-provided abstract type of a defined bit width
       l = 0xff00;
   }

通过经修复的代码,您可以准确地知道编译器如何为“I”保留空间。在切换使用各编译器时,您将发现可用于新平台的与 typedef 或 #define 相似的类型。