EN JP CN

PORTING.VAR.EFFECTS

PORTING.VAR.EFFECTS

ある使用法が副次的な影響を受ける式で変数が 2 回使用されています

PORTING チェッカーは、異なるコンパイラ内で特定の実装詳細に依存する可能性があるコードを識別します。PORTING.VAR.EFFECTS チェッカーは、1 つの式で変数が 2 回使用され、少なくとも 1 回の使用で副次的な影響を受ける状況を検出します。

このチェッカーは、MISRA C 2004 規格、規則 12.2 および MISRA C++ 2008 規格、規則 5-0-1 の違反を検出します。

脆弱性とリスク

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

軽減と防止

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

脆弱コード例


1   void foo(int m) { printf("Foo called with %d\n", m); }
2   void bar(int m) { printf("Bar called with %d\b", m); }

3   void laab()
4   {
5     int m = 0;
6     void (*fp[3])(int);

7       fp[0] = foo;
8       fp[1] = bar;
9       (*fp[++m])(++m);        // PORTING.VAR.EFFECTS
10  }

'm' が 2 の値の場合でも、使用しているコンパイラによっては、関数 'foo' または 'bar' のいずれかが呼び出される場合があります。

修正コード例


1   void foo(int m) { printf("Foo called with %d\n", m); }
2   void bar(int m) { pritnf("Bar called with %d\b", m); }

3   void laab(int fn)
4   {
5     int m = 0;
6     void (*fp[3])(int);

7       fp[0] = foo;
8       fp[1] = bar;
9       (*fp[fn])(++m);
10  }

修正コードでは式に曖昧性がなくなり、どの関数が呼び出されるか正確にわかり、また、'm' は想定どおり常に 1 になります。