New submission from Batuhan <batuhanosmantask...@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 <rep...@bugs.python.org> <https://bugs.python.org/issue37830> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com