[issue37830] continue in finally with return in try results with segfault
Batuhan
report at bugs.python.org
Mon Aug 12 05:33:33 EDT 2019
New submission from Batuhan <batuhanosmantaskaya at gmail.com>:
When you try to put a return statement with the iterated value inside of try/finally and if you have continue in finally it will result with segfault.
def simple():
for number in range(2):
try:
return number
finally:
continue
simple()
SEGV
My first debugs shows TOS is the next value int(1) when it comes to FOR_ITER, instead of the range instance.
So when python try to call next() with (*iter->ob_type->tp_iternext)(iter) in FOR_ITER it gets a non iterator, int(1).
Adding an assert can prove it,
python: Python/ceval.c:3198: _PyEval_EvalFrameDefault: Assertion `PyIter_Check(iter)' failed.
For seeing how stack changed i enabled lltrace and formatted it little bit;
>>> STACK_SIZE 0
LOAD_GLOBAL 0
>>> STACK_SIZE 0
>>> push <class 'range'>
LOAD_CONST 1
>>> STACK_SIZE 1
>>> push 2
CALL_FUNCTION 1
>>> STACK_SIZE 2
>>> ext_pop 2
>>> ext_pop <class 'range'>
>>> push range(0, 2)
GET_ITER None
>>> STACK_SIZE 1
FOR_ITER 24
>>> STACK_SIZE 1
>>> push 0
STORE_FAST 0
>>> STACK_SIZE 2
>>> pop 0
SETUP_FINALLY 12
>>> STACK_SIZE 1
LOAD_FAST 0
>>> STACK_SIZE 1
>>> push 0
POP_BLOCK None
>>> STACK_SIZE 2
CALL_FINALLY 6
>>> STACK_SIZE 2
>>> push 20
POP_FINALLY 0
>>> STACK_SIZE 3
>>> pop 20
JUMP_ABSOLUTE 8
>>> STACK_SIZE 2
FOR_ITER 24
>>> STACK_SIZE 2
[SEGV]
And the oddity is STACK_SIZE should be 1 before the FOR_ITER but it is 2, then i said why dont i try the SECOND() as iter, and it worked. It means an instruction is pushing the value of previous iteration.
There are 3 things we can do;
=> raise a RuntimeError if TOS isn't an iterator (IMHO we should do that)
=> check if try/finally created inside of a function and an iterator. then check inside of try if a return happens with the iterated value and if so set preserve_tos value to false.
=> dont allow continue in finally
I want to fix this, and i prefer the first one. If you have any suggestion, i am open.
----------
messages: 349450
nosy: BTaskaya
priority: normal
severity: normal
status: open
title: continue in finally with return in try results with segfault
_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue37830>
_______________________________________
More information about the Python-bugs-list
mailing list