EN JP CN

PORTING.CMPSPEC.EFFECTS.ASSIGNMENT

PORTING.CMPSPEC.EFFECTS.ASSIGNMENT

関数パラメーターでの割り当て

PORTING チェッカーは、異なるコンパイラ内で特定の実装詳細に依存する可能性があるコードを識別します。PORTING.CMPSPEC.EFFECTS.ASSIGNMENT チェッカーは、関数パラメーターでの割り当てを検出します。

脆弱性とリスク

計算順序は、C 標準規格では定義されていないため、構文ショートカットを使用すると、異なるコンパイラ間でコードを移植するときに動作に大きな影響を与えます。このチェッカーは、関数呼び出しのパラメーターリストの一部として割り当てが行われる状況を検出します。この割り当ては、関数呼び出しが行われる前に必ず実行されるとは限らず、プラットフォームによって結果はさまざまです。

軽減と防止

特に、コードが異なるコンパイラに移植される可能性がある場合は、このタイプの構文ショートカットを使用しないでください。

脆弱コード例


1   extern bar(int*, int);

2   void foo()
3   {
4     int x, y;

5       x = 32;
6       bar(&x, y = x / 2);    // PORTING.CMPSPEC.EFFECTS.ASSIGNMENTS
7   }

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

修正コード例

1


2   extern bar(int*, int);

3   void foo()
4   {
5     int x, y;

6       x = 32;
7       y = x / 2;
8       bar(&x, y);
9   }

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