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 相似的类型。