7

さて、私は SIGFPE に関する記事を検索し、いくつかのテストを書きましたが、動作が奇妙です。次に、助けを求めるためにここに投稿する必要があります。GCC/G++ または ISO C++ は、ゼロで除算するとどうなるかを明確に定義していますか?

1) 記事を検索しました: Division by zero does not throw SIGFPE it sames the output is inf

2)次のように書き直すと:

void signal_handler (int signo) {
    if(signo == SIGFPE) {
      std::cout << "Caught FPE\n";
    }
}

int main (void) {
  signal(SIGFPE,(*signal_handler));

  int b = 1;
  int c = 0;
  int d = b/c;
  //fprintf(stderr,"d number is %d\n,d);
  return 0;
}

その場合、signal_handler は発生しません。しかし、行のコメントを外すと

//fprintf(stderr,"d number is %d\n,d);

その後、signal_handler は呼び出しを続けます。

誰かがそれを説明できますか?

4

4 に答える 4

5

これは興味深いことです。fprintfコメント アウトされているため、コンパイラは、計算された結果:d = b/cが未使用のローカル式であり、最適化して取り除くことができると判断しました。

明らかに、実行時に副作用がないわけではありませんが、コンパイラはこの段階でランタイム環境について何も判断できません。最新のコンパイラでは、静的解析がこれを (少なくとも) 警告として検出しないことに驚いています。

@vonbrandは正しいです。(非同期) シグナル ハンドラーで行っていることは幸運でした。


編集:「signal_handler が呼び出し続ける」と言うとき、それは無期限に繰り返されるということですか? その場合、基になるシステム コールの再起動に問題がある可能性があります。試してください:(siginterrupt(SIGFPE, 1);利用可能であると仮定して)。

于 2013-02-16T01:38:42.777 に答える
3

signal_handler が発生しない理由: コンパイラの最適化により、未使用の結果の除算が強制終了されました。

signal_handler が呼び出し続ける理由: シグナル ハンドラーから戻った後、FPE は同じ命令を再実行します。longjmp を使用することで回避できます。

これが目的のための私のうまく機能するコードです(少なくともMac OS Xでは) https://github.com/nishio/learn_language/blob/master/zero_division/zero_division.cpp

于 2014-05-19T02:41:43.343 に答える
3

シグナルハンドラで許可されている操作はごくわずかであり、バッファリングされた I/O を使用することは (std::cout他にもfprintf(3)ありますが、前のものとうまく混合するかどうかはわかりません) は問題外です。signal(7)制限については、を参照してください。

于 2013-02-16T01:35:41.653 に答える
1

GCC/G++ または ISO C++ は、ゼロで除算するとどうなるかを明確に定義していますか?

標準に関する限り、ゼロによる除算は未定義の動作であり、何が起こる可能性があります。

実際には、標準では UB であると言われていますが、実際には OS (言語/コンパイラではなく) レベルで実装定義されています。POSIX では実際に SIGFPE が生成され、Windows では例外がスローされます (一部のコンパイラは SEH を C++ 例外にさらにマップしますが、Windows の SEH 例外であり、C++ 例外ではありません)。

行のコメント//fprintf(stderr,"d number is %d\n,d);を外すと、signal_handler が呼び出しを続けます。誰かがそれを説明できますか?

他の人が言ったように、これは、コンパイラdが決して使用されていないことを検出し、計算を最適化するためです (bおよび とのc定義はおそらく)。これは、言語が何が起こるかを予測できないために発生します (これは UB であることを思い出してください)。

于 2013-02-16T03:40:31.517 に答える