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