私bash
が使用している(4.2.25(1))は無限関数の再帰に対して保護されていないことに気付きました。このような場合、Segfaultが発生します(そしてbash
プロセスが終了します)。でこれを確認するにはbash
、次のように入力します。
$ bash
$ f() { f; }
$ f
(最初にサブシェルを開始すると(最初の行)、端末のシェルを危険にさらすことなく実験できる候補が得られます。最初の行がなければ、ターミナルウィンドウはおそらくすぐに閉じられるので、興味深いものは何も表示されません。)
私はこの現象の理由を理解していると思います。おそらくbash
プロセスに割り当てられていないメモリの領域に書き込もうとするスタックオーバーフローです。
私が疑問に思っているのは、2つのことです。
bash
そのような状況からそれを保護するためのチェックを行うべきではありませんか?「シェル関数でのスタックオーバーフロー」のようなより適切なエラーメッセージは、単純な役に立たないセグフォールトよりも確実に優れています。これはセキュリティ上の問題でしょうか?このメソッドは、プロセスに割り当てられていない(Segfaultになる)メモリパーツに書き込む前に、
bash
内部スタックに使用することを意図していない他のパーツを上書きする可能性があります。
@hasturに感謝します。これは「バグ」の歴史について啓発するものでした。これがセキュリティ問題かどうかは疑問です。おそらくそれを利用するにはカオスが多すぎると思います。
—
アルフェ
man bash
):Functions may be recursive. No limit is imposed on the number of recursive calls.
それbash
はそれを制限しないことを意味するかもしれませんが、利用可能なメモリのみです: