Traceback leaks global code when `exec`:ed code raises
Ninguém assumiu esta issue ainda.
- Linguagem predominante
- Python
- Estrelas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PRs
- Métricas de PR pendentes
Descrição
Bug report
Bug description:
Details
The traceback module's various functions for inspecting an exception leaks surrounding code when used to inspect an exception originating from an exec or eval call. I discovered this using traceback.format_exception but it applies to traceback.print_exc and the other ones that call or are called by those as well.
Specifically when compiled for "exec" mode using compile, and the exec:ed code inherits the context from which exec was called.
In this example, the comment on the first line is included in the printed traceback.
# Hi, I'm in the error message
import traceback
try:
exec(compile("tuple()[0]", "s", "exec"))
except:
traceback.print_exc()
This prints:
Traceback (most recent call last):
File "<filename>", line 4, in <module>
exec(compile("tuple()[0]", "s", "exec"))
File "s", line 1, in <module>
# Hi, I'm in the error message
IndexError: tuple index out of range
It seems that whatever line number the error is on in the exec:ed code is applied to the calling file instead of the exec:ed code.
Changing line 4 in the example above to exec("tuple()[0]") avoids the issue, and no info regarding the line is printed by traceback. This behavior is in line with what python outputs when the exception is not caught:
# Hi, I'm not in the error message
exec(compile("tuple()[0]", "s", "exec"))
results in:
Traceback (most recent call last):
File "<filename>", line 2, in <module>
exec(compile("tuple()[0]", "s", "exec"))
File "s", line 1, in <module>
IndexError: tuple index out of range
Summary
Example code
# Hi, I'm in the error message
import traceback
try:
exec(compile("tuple()[0]", "s", "exec"))
except:
traceback.print_exc()
Expected behaviour
Should print the following:
Traceback (most recent call last):
File "<filename>", line 4, in <module>
exec(compile("tuple()[0]", "s", "exec"))
File "s", line 1, in <module>
IndexError: tuple index out of range
Actual behaviour
Prints this:
Traceback (most recent call last):
File "<filename>", line 4, in <module>
exec(compile("tuple()[0]", "s", "exec"))
File "s", line 1, in <module>
# Hi, I'm in the error message
IndexError: tuple index out of range
CPython versions tested on:
3.8, 3.10, 3.11, 3.12
Operating systems tested on:
Linux, Windows
Linked PRs
- gh-122126
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Direção de pesquisa
Comece reproduzindo o exemplo com traceback.format_exception e traceback.print_exc, comparando o código exec compilado com exec direto e com exceções não capturadas. Rastreie como a renderização do traceback usa o nome do arquivo e o número da linha para o frame de exec; o trabalho estará concluído quando a saída esperada omitir a linha de código-fonte do chamador, inclusive para as outras funções de traceback descritas.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- python
- Domínio
- backend
- Tipo de issue
- Bug
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Status de atividade
- Estagnada
- Clareza
- Claramente especificada
- Facilidade para iniciantes
- 25/100