C28753

警告 C28753: パラメーターが未定義の評価順序に依存している

C/C++ を使用すると、コンパイラは実際のパラメーターを任意の順序で評価するコードを生成でき、x86 コンパイラと Arm コンパイラは異なる順序を選択する傾向があります。 特定の順序に依存するコードは、プラットフォームによって動作が異なる場合があります。

一般的な間違いは、次のような呼び出しで address-of 演算子 & に副作用があるスマート ポインターの使用です。

sp->Foo(&sp);

メンバー アクセス演算子 -> および演算子 & の呼び出しは、どちらの順序でも発生する可能性があります。 したがって、演算子 & からの副作用は、演算子 -> が呼び出された前または後に発生する可能性があります。 この警告は、これらのバグのある呼び出しを検出して、プラットフォーム間で異なる動作を防ぎます。

次のコード例では、この警告が生成されます。

sp->Foo(&sp)

次のコード例では、この警告は生成されません。

SmartPtr spTemp;
sp->Foo(&spTemp);
sp = spTemp;