Message349450
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. |
|
Date |
User |
Action |
Args |
2019-08-12 09:33:33 | BTaskaya | set | recipients:
+ BTaskaya |
2019-08-12 09:33:33 | BTaskaya | set | messageid: <1565602413.18.0.439989203772.issue37830@roundup.psfhosted.org> |
2019-08-12 09:33:33 | BTaskaya | link | issue37830 messages |
2019-08-12 09:33:32 | BTaskaya | create | |
|