PORTING.VAR.EFFECTS
ある使用法が副次的な影響を受ける式で変数が 2 回使用されています
PORTING チェッカーは、異なるコンパイラ内で特定の実装詳細に依存する可能性があるコードを識別します。PORTING.VAR.EFFECTS チェッカーは、1 つの式で変数が 2 回使用され、少なくとも 1 回の使用で副次的な影響を受ける状況を検出します。
このチェッカーは、MISRA C 2004 規格、規則 12.2 および MISRA C++ 2008 規格、規則 5-0-1 の違反を検出します。
脆弱性とリスク
計算順序は、C 標準規格では定義されていないため、構文ショートカットを使用すると、異なるコンパイラ間でコードを移植するときに動作に大きな影響を与えます。このチェッカーは、関数呼び出しのパラメーターリストの一部として割り当てが行われる状況を検出します。この割り当ては、関数呼び出しが行われる前に必ず実行されるとは限らず、プラットフォームによって結果はさまざまです。
軽減と防止
特に、コードが異なるコンパイラに移植される可能性がある場合は構文ショートカットを使用しないでください。
脆弱コード例
コピー
void foo(int m) { printf("Foo called with %d\n", m); }
void bar(int m) { printf("Bar called with %d\b", m); }
void laab()
{
int m = 0;
void (*fp[3])(int);
fp[0] = foo;
fp[1] = bar;
(*fp[++m])(++m); // PORTING.VAR.EFFECTS
}
'm' が 2 の値の場合でも、使用しているコンパイラによっては、関数 'foo' または 'bar' のいずれかが呼び出される場合があります。
修正コード例
コピー
void foo(int m) { printf("Foo called with %d\n", m); }
void bar(int m) { pritnf("Bar called with %d\b", m); }
void laab(int fn)
{
int m = 0;
void (*fp[3])(int);
fp[0] = foo;
fp[1] = bar;
(*fp[fn])(++m);
}
修正コードでは式に曖昧性がなくなり、どの関数が呼び出されるか正確にわかり、また、'm' は想定どおり常に 1 になります。