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);
   }

在经修复的示例中,避免了快捷方式的使用,因此确保我们了解代码将在不同的平台上如何执行。