New submission from Xinmeng Xia <xi...@smail.nju.edu.cn>:

The following program will lead to a incorrect behavior of Python parser.  We 
change all variable to integer( forcely transformed to string) via 
ast.NodeTransformer. Then we compile the new code and execute it. It's 
surprising that code like "1=2; print(1)" can be compiled without error 
message. And more surprisingly, the execution result of "print(1)" is 2 ! !

====================================
import ast
class RewriteName(ast.NodeTransformer):
    def visit_Name(self, node):
        if node.id != "print":
            node.id = str(node.lineno)
        return node


code = "a = 2;print(a)"


myast = ast.parse(code)
transformer = RewriteName()
newast = transformer.visit(myast)

# print(ast.dump(newast))

print("new code:","------------")
print(ast.unparse(newast))
print("------------")

c = compile(newast,'','exec')
exec(c)
=================================

output result:
new code: ------------
1 = 2
print(1)
------------
2

Expected result: (1). Syntax error during compilation. "1" should not be the 
correct identifier of program, even if it's forcely transformed to string. (2). 
The output of execution should be "1"  , since the parameter of "print()" in 
the new code is string "1".  

This incorrect behaviors exists on all version of Python(from Python2 to Python 
3).

----------
components: Interpreter Core
messages: 384799
nosy: xxm
priority: normal
severity: normal
status: open
title: Incorrect behavior of Python parser after ast node of test program  
being modified
type: behavior
versions: Python 3.10, Python 3.6, Python 3.7, Python 3.8, Python 3.9

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue42889>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to