Issue 13644: Python 3 aborts with this code. (original) (raw)
Issue13644
Created on 2011-12-21 05:54 by Ramchandra Apte, last changed 2022-04-11 14:57 by admin. This issue is now closed.
Messages (19) | ||
---|---|---|
msg149956 - (view) | Author: Ramchandra Apte (Ramchandra Apte) * | Date: 2011-12-21 05:54 |
When you run the following code, Python 3 (not Python 2) crashes. Interestingly, Python 2.7 doesn't seem to be affected and correctly raises an error about recursion ( so this must be a regression ). The code's recursion should be detected and Python should raise a RuntimeError about recursion. def recurse(): try:raise Exception #An arbitary exception except Exception:recurse() After running this code Python 3 says "Fatal Python error: Cannot recover from stack overflow." and then Python aborts . In Jython, this code doesn't crash it. | ||
msg149957 - (view) | Author: Benjamin Peterson (benjamin.peterson) * ![]() |
Date: 2011-12-21 06:15 |
Python isn't crashing; it's bailing out of an impossible situation. It's not clear what the correct behavior is, since you're basically preventing Python from aborting the recursive behavior. | ||
msg149958 - (view) | Author: Ramchandra Apte (Ramchandra Apte) * | Date: 2011-12-21 06:24 |
But Python 2 doesn't crash after running the code. | ||
msg149959 - (view) | Author: Ramchandra Apte (Ramchandra Apte) * | Date: 2011-12-21 06:26 |
Oops, to reproduce this bug after running the code run "recurse()". | ||
msg150006 - (view) | Author: Benjamin Peterson (benjamin.peterson) * ![]() |
Date: 2011-12-21 16:14 |
The behavior of Python 2 is not anymore correct than that of Python 3. | ||
msg150089 - (view) | Author: Ramchandra Apte (Ramchandra Apte) * | Date: 2011-12-22 11:51 |
Well, I expect Python 3 to raise RuntimeError about recursion not to segfault. | ||
msg150095 - (view) | Author: Benjamin Peterson (benjamin.peterson) * ![]() |
Date: 2011-12-22 14:46 |
There is no place for it to raise a RuntimeError which will continue to propogate! | ||
msg150101 - (view) | Author: Roger Serwy (roger.serwy) * ![]() |
Date: 2011-12-22 16:01 |
With Python 2, I can inspect the error to see where it occurred using traceback. With Python 3, I'd need to use gdb. | ||
msg150198 - (view) | Author: Georg Brandl (georg.brandl) * ![]() |
Date: 2011-12-23 22:03 |
@OP: As you yourself wrote, this is an abort, not a segfault. It is not a crash; it is a controlled exit of the Python executable. @Benjamin: I don't really understand your reasoning: what is preventing Python to raise the error during the except clause? | ||
msg150199 - (view) | Author: Benjamin Peterson (benjamin.peterson) * ![]() |
Date: 2011-12-23 22:40 |
Nothing, but that would be pointless; the recursion would just start again. | ||
msg150205 - (view) | Author: Terry J. Reedy (terry.reedy) * ![]() |
Date: 2011-12-24 03:28 |
When I run this with 3.2.2 IDLE, from an edit window, I get an MSVC++ Runtime Library window: "Runtime Error! .../pythonw This application has requested termination in an unusual way...". When I close that, IDLE continues. So I would say that this is not a crash and not even a bug, but a particular choice of undefined behavior given infinite loop code. So we have no obligation to change it. I presume the change from 2.x is a side-effect of a change to improve something else. def recurse(): recurse() recurse() does print "RuntimeError: maximum recursion depth exceeded" but only after printing a l o n g traceback. So for running from IDLE, I at least half prefer the immediate error box with no traceback. | ||
msg150208 - (view) | Author: Ramchandra Apte (Ramchandra Apte) * | Date: 2011-12-24 04:12 |
@Terry IDLE restarts python (like in the menu entry "Restart Shell") when the Python process dies no matter how the Python process dies. So this issue is a valid bug. | ||
msg150217 - (view) | Author: Roger Serwy (roger.serwy) * ![]() |
Date: 2011-12-24 07:25 |
This is identical to and may be related to . | ||
msg150227 - (view) | Author: Georg Brandl (georg.brandl) * ![]() |
Date: 2011-12-24 09:33 |
> Nothing, but that would be pointless; the recursion would just start again. Why? | ||
msg150229 - (view) | Author: Benjamin Peterson (benjamin.peterson) * ![]() |
Date: 2011-12-24 14:50 |
2011/12/24 Georg Brandl <report@bugs.python.org>: > > Georg Brandl <georg@python.org> added the comment: > >> Nothing, but that would be pointless; the recursion would just start again. Because it would be caught in the function call above in the stack? | ||
msg150230 - (view) | Author: Georg Brandl (georg.brandl) * ![]() |
Date: 2011-12-24 14:51 |
Would it? | ||
msg150231 - (view) | Author: Benjamin Peterson (benjamin.peterson) * ![]() |
Date: 2011-12-24 14:52 |
2011/12/24 Georg Brandl <report@bugs.python.org>: > > Georg Brandl <georg@python.org> added the comment: > > Would it? (<class 'Exception'>,) | ||
msg150232 - (view) | Author: Benjamin Peterson (benjamin.peterson) * ![]() |
Date: 2011-12-24 14:54 |
Basically forget my last 3 messages. | ||
msg150238 - (view) | Author: Terry J. Reedy (terry.reedy) * ![]() |
Date: 2011-12-24 22:45 |
@maniram I know what IDLE does. For the tracker, a 'bug' is a discrepancy between doc and behavior. According to the doc, a recursion loop should continue forever, just like an iteration loop ;=). Anyway, Roger is right, this is a duplicate of #6028, which has at least a preliminary patch. |
History | |||
---|---|---|---|
Date | User | Action | Args |
2022-04-11 14:57:24 | admin | set | github: 57853 |
2011-12-24 22:45:47 | terry.reedy | set | status: open -> closedresolution: duplicatesuperseder: Interpreter aborts when chaining an infinite number of exceptionsmessages: + |
2011-12-24 14:54:09 | benjamin.peterson | set | messages: + |
2011-12-24 14:52:45 | benjamin.peterson | set | messages: + |
2011-12-24 14:51:21 | georg.brandl | set | messages: + |
2011-12-24 14:50:16 | benjamin.peterson | set | messages: + |
2011-12-24 09:33:41 | georg.brandl | set | messages: + |
2011-12-24 09:33:25 | georg.brandl | set | messages: - |
2011-12-24 09:32:45 | georg.brandl | set | messages: + |
2011-12-24 07:25:24 | roger.serwy | set | messages: + |
2011-12-24 04:12:38 | Ramchandra Apte | set | messages: + |
2011-12-24 03:28:50 | terry.reedy | set | type: crash -> behaviormessages: + nosy: + terry.reedy |
2011-12-23 22:40:22 | benjamin.peterson | set | messages: + |
2011-12-23 22:03:09 | georg.brandl | set | nosy: + georg.brandlmessages: + title: Python 3 crashes (segfaults) with this code. -> Python 3 aborts with this code. |
2011-12-22 16:01:58 | roger.serwy | set | nosy: + roger.serwymessages: + |
2011-12-22 14:46:53 | benjamin.peterson | set | messages: + |
2011-12-22 11:51:56 | Ramchandra Apte | set | messages: + |
2011-12-21 16:14:54 | benjamin.peterson | set | messages: + |
2011-12-21 06:26:15 | Ramchandra Apte | set | messages: + |
2011-12-21 06:24:42 | Ramchandra Apte | set | messages: + |
2011-12-21 06:15:40 | benjamin.peterson | set | nosy: + benjamin.petersonmessages: + |
2011-12-21 06:11:21 | Ramchandra Apte | set | title: Python 3 crashes with this code. -> Python 3 crashes (segfaults) with this code. |
2011-12-21 05:55:20 | Ramchandra Apte | set | title: Python crashes with this code. -> Python 3 crashes with this code. |
2011-12-21 05:54:52 | Ramchandra Apte | create |