PORTING.CMPSPEC.EFFECTS.ASSIGNMENT
函数参数中的分配
PORTING 检查器会标识那些可能依赖于不同编译器中特定实施细则的代码。PORTING.CMPSPEC.EFFECTS.ASSIGNMENT 检查器检测函数参数中的分配。
漏洞与风险
C 标准并未定义计算的顺序,因此当在不同编译器之间移植代码时,使用语法快捷方式可能具有明显的操作影响。该检查器会检测将分配作为函数调用的参数列表的一部分的情况。无法保证这种分配始终发生在函数调用之前,因此会在不同平台上导致不同的结果。
缓解与预防
请勿使用此类语法快捷方式,尤其是当可能将代码移植到其他编译器时。
漏洞代码示例
复制
extern bar(int*, int);
void foo()
{
int x, y;
x = 32;
bar(&x, y = x / 2); // PORTING.CMPSPEC.EFFECTS.ASSIGNMENTS
}
因为 C 标准并未定义函数调用参数的计算顺序,不同编译器可能选择不同的计算顺序,比如在获得 x 的值之后,有些编译器可能在调用函数 bar 之前计算 y 值,有些编译器可能在调用函数 bar 之后计算 y 值。在这种情况下,不同编译器可能产生完全不同的行为。
修正代码示例
复制
extern bar(int*, int);
void foo()
{ int x, y;
x = 32;
y = x / 2;
bar(&x, y);
}
在经修复的示例中,避免了快捷方式的使用,因此确保我们了解代码将在不同的平台上如何执行。