Ответ 1
Эта проблема вызвана переполнением стека в компиляторе CPython. Простой способ воспроизвести ту же проблему -
>>> code = compile("1" + "+1" * 1000000, "", "eval")
Segmentation fault
что доказывает, что segfault происходит на этапе компиляции, а не во время оценки. (Конечно, это также легко подтвердить с помощью gdb.)
[Замечание: для небольших выражений компилятор в любом случае будет применять постоянную фальцовку, поэтому единственное, что происходит во время выполнения кода, - загрузить результат:
>>> code = compile("1" + "+1" * 1000, "", "eval")
>>> eval(code)
1001
>>> dis.dis(code)
1 0 LOAD_CONST 1000 (1001)
3 RETURN_VALUE
Конец боковой заметки.]
Эта проблема - известный дефект. Разработчики Python собрали несколько способов свернуть интерпретатор Python в каталог Lib/test/crashers
исходного дистрибутива. Тот, который соответствует этой проблеме, Lib/test/crashers/compiler_recursion.py
.