我正在为我最后一年的项目为python代码的一小部分构建一个优化编译器。我要做的第一件事是测试一个变量是否与I/O有关或导致I/O。如果我要静态地跟踪一个函数调用到众所周知的“兔子洞”中,我如何确切地知道它涉及I/O?是否会调用内置的python函数(如print、input或内置的“file”对象函数调用)进行读写操作?在
我没有太多的时间来做这个项目(只有6个月),所以我完全忽略了人们用C编写I/O,把它包装成某种python对象并从python调用它。在
生成的字节码是否指示是否存在I/O?还是和AST一样没用?在
如果它是不可撤销的,我将只是我的项目的I/O子集来打印,输入读写。或者做活性分析。在
谢谢。在
它不像只查看字节码那么简单,因为对事物的调用只是符号查找:
它们自己的字节码只是加载、调用和存储。如果您在字节码级别操作,那么实际上必须查看有效负载。在
Check out the current list of Python bytecodes并且您可以看到实际上没有任何东西可以区分I/O调用。在
即使您要检查所有
^{pr2}$LOAD_GLOBAL
调用或LOAD_FAST
调用并应用白名单,也不一定有效,因为有些模块提供I/O,而字节码也不能真正帮助您:注意,
shutil
的LOAD_FAST
可以是用户自己编出来的。在我的例子中,我只是使它成为一个通用对象,但是用户的路径上也可以有一个不同的shutil
。在相关问题 更多 >
编程相关推荐