1.python生成AST
官方文档:https://docs.python.org/3/library/ast.html
官方使用的是Cpython解释器的ast包
这样生成的AST不是可视化,如果要可视化的AST推荐ctree
参考链接:https://ucb-sejits.github.io/ctree-docs/ipythontips.html
- 安装ipython
Ubuntu默认的python为2,所以如果要使用ipython3需要运行
sudo apt-get install ipython3
其实ipython就是jupyter notebook
2.安装ctree包
pip install ctree
- 测试代码
import ctree
def f(a):
for x in range(10):
a[x] += x
tree1 = ctree.get_ast(f)
ctree.ipython_show_ast(tree1)
输出就是AST可视化树,如下图所示
后来在jupyter notebook中执行这个代码,会一直没有结果。
尝试在ipython中执行,显示有输出是一张图片,但是无法显示。如下图最后一行所示。
后来在jupyter notebook中尝试解决:出现问题如下:
使用命令行pip install sphinx仍不能解决,因此查看ctree代码。
vim /home/zyn/anaconda3/envs/ast/lib/python3.7/site-packages/ctree/visual/dot_manager.py
把sphinx这一部分代码注释掉:
同时修改代码为:
import ctree
def f(a):
for x in range(10):
a[x] += x
tree1 = ctree.get_ast(f)
tree1
ctree
a=ctree.ipython_show_ast(tree1)
a
成功!
2.python生成CFG
使用github项目:
PythonStaticAnalysis
使用conda创建python=3.7环境
conda create -n pysa python=3.7
-n后面加的是环境的名字
安装依赖包和环境
pip install -r requirements.txt
运行代码
python runAnalysis.py -t ast -s "def gcd(a, b):
if a<b:
c: int = a
a: int = b
b: int = c
while b != 0 :
c: int = a
a: int = b
b: int = c % b
return a"
或者脚本
./runSample.sh
结果在output文件夹里