PORTING.CAST.PTR.SIZE
指针转换为大小可能不兼容的类型
PORTING 检查器会标识那些可能依赖于不同编译器中特定实施细则的代码。PORTING.CAST.PTR.SIZE 检查器会检测那些转换为可能大小不兼容的类型的指针。
漏洞与风险
当新的体系结构采用新的数据模型时,针对特定体系结构的数据模型所编写的代码在移植时可能面临重大难题。例如,当代码在 32 位和 64 位数据模型之间移植时,新数据模型通常会保留 int 作为 32 位值,而使用 long 作为 64 位值,这打破了在 32 位数据模型下,所有数据类型大小的假设等效性。
缓解与预防
最佳做法涉及到为您的代码库定义一个数据模型,该模型应从任何特定的编译器数据模型或基础体系结构实施中提取出来。许多流行的编码标准都强制要求对所有类型提取该抽象类型。
漏洞代码示例
复制
void foo(long* pl)
{
int i, *pi;
i = 32;
pi = &i;
*pl = *(long*)pi; // PORTING.CAST.PTR.SIZE
}
C 标准并未针对整数型提供明确的大小要求(除相对要求外),因此编译器供应商可以自由设计 int 和long(以及 long long),只要它们不破坏相对大小要求即可(long 至少必须与 int 一样大,以此类推)。本示例中展示的代码基于典型的 32 位实施运行,但无法在大多数 64 位实施上运行。
修正代码示例
复制
void foo(long* pl)
{
int i, *pi;
i = 32;
pi = &i;
*pl = 0L | *(int*)pi;
}
经修正的代码确保了代码可以移植到 64 位平台上而不会出现问题。