2016-06-24 7 views
0

テストシナリオはIPになるpingであり、ctr + Cはスクリプトから交互に呼び出されます。NETBSD 3.1エラー - malloc():警告:再帰呼び出し

シグナルハンドラが呼び出されたときのように、pingはmallocの内側にあります。シグナルハンドラはmallocとmallocとも呼ばれ、以下の警告とともに返されました。 のmallocで():警告:再帰呼び出し

しかし、それでもまだ、私はそれがクラッシュを引き起こす可能性がありますどのように見つけることができませんでしたが、誰かが

+0

'triptime'が定数であり、他のFPがコード内にない場合(コンパイル時に' triptime * 1000.0'が実行された場合)、FPルーチンを最適化し、 'printf()'をFP指定子で最適化します失敗する - しかし、ここには文脈がほとんどないので、これは推測に過ぎない。 – chux

+0

「クラッシュする」と言うと、pingバイナリ、OSなどを意味しますか?これは確か3.1 pingからのラインのようです(より最近のNetBSDでは64ビットタイミングのために異なる)。 また、実行しているコマンドラインとアーキテクチャは何ですか?特定のハードウェアに関連する奇妙なハードウェア/ OSの問題である可能性があります。 – abs

+0

質問を更新しました。どうぞよろしくお願いいたします。 – Twinkle

答えて

1

ああ、非リエントラント関数の問題を使用して恐ろしいシグナルハンドラを説明してください可能性があります。

問題は、* BSD pingの機能を追加する保守担当者が最初から安全に作業を行うことにパンクしたことです。

FreeBSDは1994年にこの問題を追加OpenBSDは追加、いつか1998年

で、最終的な修正で、1996年にそれに気づき、それがあることが判明したよりも、問題を解決するために、はるかに短いパスされている必要があり何始めましたこの問題は1997年に発見され、2002年に気づいたが、問題の性質を完全に逃し、2015年まで完全に修正しなかった。

NetBSDはこの問題を1996年に追加したが、まだ修正されています。 NetBSDはおそらくOpenBSDのpingをインポートするはずです。

malloc()もSTDIO(printf()も含む)のいずれもリエントラントではなく、シグナルハンドラで使用されるすべてのコードが必要です。

ありように再入の記述を見つけるためのより良い場所の数十、シグナルハンドラの問題、とがありますが、おそらくこの質問とその受け入れ答え(および関連の質問のいくつかは)良いスタートになります:

Why are malloc() and printf() said as non-reentrant?

+0

グレッグありがとうございます。あなたが正しいです。これが問題です。しかし、ctr + cを押すと、ping統計を表示する必要があります。ここでprintfを避けるにはどうすればいいですか? – Twinkle

+0

私はOpenBSDの 'ping'を移植することを提案しましたが、私はそれを試みました、そして、それは私が思ったよりもはるかに多くの作業です(それはうまくいくかもしれませんが)。残念ながら、コアダンプを避けるために必要な完全かつ適切な修正はおそらく、ジョブとほぼ同じくらい長いものです。 (私はFreeBSDの 'ping'を移植することはもっと面倒だと思います) –

関連する問題