3.19 シグナルによる例外トラップ処理

SIGFPE シグナルを利用して、例外を処理することができます。

これらの機能では、--fpmode=ieee_full--fpmode=ieee_fixed など、例外をサポートする浮動小数点モデルを選択する必要があります。
例外がトラップされても、トラップハンドラのアドレスに NULL が設定されている場合は、デフォルトのトラップハンドラが使用されます。
デフォルトのトラップハンドラでは、SIGFPE シグナルが生成されます。SIGFPE のデフォルトハンドラは、エラーメッセージを出力してプログラムを終了します。
SIGFPE をトラップする場合は、シグナルハンドラ関数の宣言に第 2 パラメータを含めることで、発生した浮動小数点例外の型情報を受け取るようにできます。この機能は、Microsoft 製品との互換性を維持するために提供されています。値は _FPE_INVALID_FPE_ZERODIVIDE_FPE_OVERFLOW_FPE_UNDERFLOW、および _FPE_INEXACT です。これらの値は float.h 内で定義されています。以下に例を示します。
void sigfpe(int sig, int etype){     printf("SIGFPE (%s)\n",            etype == _FPE_INVALID ?"Invalid Operation" :etype == _FPE_ZERODIVIDE ?"Divide by Zero" :etype == _FPE_OVERFLOW ?"Overflow" :etype == _FPE_UNDERFLOW ?"Underflow" :etype == _FPE_INEXACT ?"Inexact Result" :"Unknown"); } signal(SIGFPE, (void(*)(int))sigfpe);
この情報を渡してユーザ定義の SIGFPE シグナルを生成する場合は、ISO 関数 raise() の代わりに __rt_raise() 関数を呼び出します。以下に例を示します。
    __rt_raise(SIGFPE, _FPE_INVALID);
__rt_raise()rt_misc.h 内で定義されています。
関連する概念
3.17 ユーザ定義の例外トラップハンドラの記述
3.18 ユーザ定義の例外ハンドラの例
3.29 IEEE 754 浮動小数点演算で発生する例外
3.8 ARM 浮動小数点環境の制御
関連する参考文書
3.16 C99 インタフェースの ARM 浮動小数点コンパイラ拡張
3.10 ARM 浮動小数点環境を制御するための C99 互換関数
4.30 __rt_raise()
関連情報
--fpmode=model コンパイラオプション
非機密扱いPDF file icon PDF 版ARM DUI0475KJ
Copyright © 2010-2014 ARM.All rights reserved.