0

この「無限」ループのセグメンテーション違反がすぐに発生する理由を誰かが説明できますか? たとえば、次の関数があるとします。

#!/bin/bash

foo() {
  foo 
}; foo

この segfault は 8 ~ 10 秒後に発生します。strace で調べると、多くのbrk()呼び出しが見られます。

brk(0x2e11000)                          = 0x2e11000
brk(0x2e12000)                          = 0x2e12000
brk(0x2e13000)                          = 0x2e13000
brk(0x2e14000)                          = 0x2e14000
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x7ffcddf5ff68} ---
+++ killed by SIGSEGV +++
Segmentation fault

私の質問は次のとおりです。

  1. これは、(brk を介して) メモリ空間内のマップされていない領域にアクセスしようとしているため、セグメンテーション違反ですか?
  2. はいの場合、なぜアクセスしようとしているのですか?
  3. ここでは malloc() の方が良い選択でしょうか?
  4. これに関する追加/トリビア情報があれば、それをいただければ幸いです。
4

2 に答える 2

0

あなたが見ているのは、リソースが枯渇するまでスタックが成長しているようです. 要するに、それは再帰の問題です。

brk()呼び出しを見ると、プロセスのデータ セグメントの末尾が変更されていることがわかります。プログラムブレークを増やすと、プロセスにメモリが割り当てられますが、無尽蔵の供給はありません。使い切るとクラッシュします。

しかし、3 番目の質問については、ドキュメントのメモ セクションでさえ、malloc() がより適切な選択であることが示唆されています。

于 2017-12-28T18:10:52.877 に答える