インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

浮動小数点スタックの状態のチェック

IA-32 アーキテクチャー・ベース・システムでアプリケーションが浮動小数点値を返す関数を呼び出すと、返された浮動小数点値は通常、浮動小数点スタックの最上位に保存されます。戻り値が使用されない場合、コンパイラーは浮動小数点スタックを正しい状態に保つため、浮動小数点スタックから値をポップします。

インテル® 64 アーキテクチャー・ベース・システムでは、浮動小数点値は通常、xmm0 レジスターで返されます。浮動小数点スタックは、Linux* および macOS* システムで、戻り値が long double の場合のみ使用されます。

アプリケーションが関数のプロトタイプを定義しなかったり、誤ったプロトタイプを定義して関数を呼び出すと、その関数が浮動小数点値を返す必要があるかどうかをコンパイラーは判断できません。そのため、戻り値が使用されない場合でも浮動小数点スタックからその値がポップされません。この場合には、浮動小数点スタックがオーバーフローする可能性があります。

スタックのオーバーフローにより、次のような好ましくない事態が発生します。

IA-32 およびインテル® 64 アーキテクチャー・ベース・システムの場合、[Q]fp-stack-check オプションは、プログラムが浮動小数点値を戻す関数の呼び出しを正しく行うかどうかをチェックします。不正な呼び出しが検出されると、このオプションがプログラムに不正な呼び出しをマークするコードを追加します。[Q]fp-stack-check オプションは、不正な呼び出しにマークを付けてエラーを検出しやすくします。

[Q]fp-stack-check オプションは、浮動小数点スタックを正しい状態に保つため、各関数/サブルーチン呼び出しの後で大量のコードを生成します。そのため、このオプションを使用すると、コンパイル処理の速度が低下します。このオプションは、デバッグの際に浮動小数点スタックのアンダーフローやオーバーフローの問題を検出するためにのみ使用してください。これらの問題はこのオプションを使用しないと検出することは困難です。

関連情報