PORTING.CAST.SIZE
从表达式到可能大小不兼容的类型的转换
PORTING 检查器会标识那些可能依赖于不同编译器中特定实施细则的代码。PORTING.CAST.SIZE 检查器会检测那些将表达式转换为可能大小不兼容的类型的情况。
漏洞与风险
当新的体系结构采用新的数据模型时,针对特定体系结构的数据模型所编写的代码在移植时可能面临重大难题。例如,当代码在 32 位和 64 位数据模型之间移植时,新数据模型通常会保留 int 作为 32 位值,而使用 long 作为 64 位值,这打破了在 32 位数据模型下,所有数据类型大小的假设等效性。
缓解与预防
最佳做法涉及到为您的代码库定义一个数据模型,该模型应从任何特定的编译器数据模型或基础体系结构实施中提取出来。许多流行的编码标准都强制要求对所有类型提取该抽象类型。
漏洞代码示例
复制
void foo()
{
int i = 32;
long l;
l = (long)i; // PORTING.CAST.SIZE
i = (int)l; // PORTING.CAST.SIZE
}
该代码展示了两个将导致 PORTING.CAST.SIZE 错误的示例。