Почему эта функция PHP выдает ошибку сегментации (SIGSEGV)? - PullRequest
2 голосов
/ 13 июня 2011

Я написал следующий код.

<?php
function f(){
  return f();
}
f();

и получил вывод

$ php test.php
Segmentation fault

Почему?Я не использовал указатели.

Это StackOverflow?

Ответы [ 4 ]

6 голосов
/ 13 июня 2011

Это случай бесконечной рекурсии, но это не конкретная причина.Это переполнение стека .Когда у вас есть рекурсия, бесконечная или нет, существует максимальная глубина, которую вы можете использовать (добавить в стек) в зависимости от размера вашего стека (в байтах).

Технически это бесконечно, но вы не получите никаких ошибок в течение долгого времени:

<?php
function f(){
  sleep(1);
  return f();
}
f();

То, что вам нужно, известно как base case в вашей рекурсии для остановкидо того, как он займет весь стек.

<?php
function f($i){
  if($i == 10)
    return;

  echo $i;

  return f(++$i);
}
f(0);

, который будет печатать от 0 до 9.

Ошибка segmentation fault поступает из операционной системы, сообщая, что приложение PHP обнаружило проблемудобавление в стек.Это не попадет в ваш сценарий, потому что на системном уровне двоичный файл, который составляет PHP, потерпел неудачу.

1 голос
/ 13 июня 2011

Разве это не бесконечная рекурсия?Чего ты пытаешься достичь?

0 голосов
/ 13 июня 2011

Это происходит именно от расширения XDebug.

Запустив GDB, вы увидите:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff41f7e48 in xdebug_add_stack_frame (zdata=Cannot access memory at address 0x7fffff5fefa8
) at /build/buildd/xdebug-2.1.0/build-php5/xdebug_stack.c:772
772 /build/buildd/xdebug-2.1.0/build-php5/xdebug_stack.c: No such file or directory.
    in /build/buildd/xdebug-2.1.0/build-php5/xdebug_stack.c

Если XDebug отключен, он будет выполняться до достижения memory_limit.Если ваша memory_limit слишком высока, вы можете исчерпать ОЗУ и начать замену, замораживая / сбивая вашу машину.

0 голосов
/ 13 июня 2011

Бесконечная рекурсия, которую вы настроили, продолжает добавлять кадры стека, пока вы не переполните объем памяти, выделенный стеку вызовов процесса PHP, после чего вы получите ошибку сегментации .

...