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 標準規格では関数呼び出しパラメーターの評価順が厳密に定義されていないため、コンパイラによっては、関数 'bar' の呼び出し前または後に 'x' の値を持つものとして 'y' が評価されます。そのような場合、コンパイラによっては完全に異なる動作となる場合があります。

修正コード例

コピー
  extern bar(int*, int);
   void foo()
   {     int x, y;
       x = 32;
       y = x / 2;
       bar(&x, y);
   }

修正例ではショートカットが使用されないため、さまざまなプラットフォーム上でのコードの動作の様子を確実に知ることができます。