资源简介
Python开发的生成Python代码控制流图的小工具。
原理:将源代码解析为AST,遍历AST生成结构化字符串,最后解析结构化字符串得到控制流图。
使用:python CFG.py src [-o dir]
工具扫描src文件所有函数并在dir目录下生成控制流图,缺省为当前工作目录。
代码片段和文件信息
import codecs
import pydot
import ast
import astunparse
import os
import argparse
import time
class FunctionVisitor(ast.NodeVisitor):
def __init__(self):
self.number = 0 # 节点编号
self.s = ‘‘ # 简化ast串
self.n2title = {} # 编号 -> 标题
def print(self v):
self.s += str(v)
def generic_visit(self node):
ast.NodeVisitor.generic_visit(self node)
def visit_FunctionDef(self node):
self.print(‘(‘)
siz = len(node.body)
for i in range(siz):
fun_name = ‘visit_‘ + type(node.body[i]).__name__
if hasattr(self fun_name):
getattr(self fun_name)(node.body[i])
else:
self.number += 1
self.print(self.number)
self.n2title[str(self.number)] = astunparse.unparse(node.body[i]).lstrip().rstrip()
if i != siz - 1:
self.print(‘‘)
self.print(‘)‘)
# 忽略掉import等语句
def visit_Import(self node):
ast.NodeVisitor.generic_visit(self node)
def visit_ImportFrom(self node):
ast.NodeVisitor.generic_visit(self node)
def visit_alias(self node):
ast.NodeVisitor.generic_visit(self node)
# if语句
def visit_If(self node):
# 条件
self.print(‘i(‘)
self.number += 1
self.print(self.number)
self.n2title[str(self.number)] = astunparse.unparse(node.test).lstrip().rstrip()
# true分支
self.print(‘(‘)
siz = len(node.body)
for i in range(siz):
fun_name = ‘visit_‘ + type(node.body[i]).__name__
if hasattr(self fun_name):
getattr(self fun_name)(node.body[i])
else:
self.number += 1
self.print(self.number)
self.n2title[str(self.number)] = astunparse.unparse(node.body[i]).lstrip().rstrip()
if i != siz - 1:
self.print(‘‘)
# else分支
self.print(‘)(‘)
siz = len(node.orelse)
for i in range(siz):
fun_name = ‘visit_‘ + type(node.orelse[i]).__name__
if hasattr(self fun_name):
getattr(self fun_name)(node.orelse[i])
else:
self.number += 1
self.print(self.number)
self.n2title[str(self.number)] = astunparse.unparse(node.orelse[i]).lstrip().rstrip()
if i != siz - 1:
self.print(‘‘)
self.print(‘))‘)
# for 语句
def visit_For(self node):
# 迭代器
self.print(‘x(‘)
self.number += 1
self.print(self.number)
a = astunparse.unparse(node.target).lstrip().rstrip()
b = astunparse.unparse(node.iter).lstrip().rstrip()
self.n2title[str(self.number)] = a + ‘ in ‘ + b
# 循环体
self.print(‘(‘)
siz = len(node.body)
for i in range
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2018-01-14 16:35 CFG\
目录 0 2018-01-14 16:32 CFG\CFG\
文件 379843 2017-12-19 21:39 CFG\CFG\CFG.build_CFG.png
文件 76773 2017-12-19 21:39 CFG\CFG\CFG.build_CFG_from_ast.png
文件 96944 2017-12-19 21:39 CFG\CFG\CFG.build_For.png
文件 85404 2017-12-19 21:39 CFG\CFG\CFG.build_If.png
文件 44385 2017-12-19 21:39 CFG\CFG\CFG.check_unreachable.png
文件 27544 2017-12-19 21:39 CFG\CFG\CFG.match.png
文件 69934 2017-12-19 21:39 CFG\CFG\CFG.new_edge.png
文件 140796 2017-12-19 21:39 CFG\CFG\CFG.new_node.png
文件 16185 2017-12-19 21:39 CFG\CFG\CFG.__init__.png
文件 8134 2017-12-19 21:39 CFG\CFG\CFGGenerator.generic_visit.png
文件 11314 2017-12-19 21:39 CFG\CFG\CFGGenerator.visit_ClassDef.png
文件 41668 2017-12-19 21:39 CFG\CFG\CFGGenerator.visit_FunctionDef.png
文件 9971 2017-12-19 21:39 CFG\CFG\CFGGenerator.__init__.png
文件 8134 2017-12-19 21:39 CFG\CFG\FunctionVisitor.generic_visit.png
文件 5723 2017-12-19 21:39 CFG\CFG\FunctionVisitor.print.png
文件 8134 2017-12-19 21:39 CFG\CFG\FunctionVisitor.visit_alias.png
文件 11207 2017-12-19 21:39 CFG\CFG\FunctionVisitor.visit_Break.png
文件 11322 2017-12-19 21:39 CFG\CFG\FunctionVisitor.visit_Continue.png
文件 113471 2017-12-19 21:39 CFG\CFG\FunctionVisitor.visit_For.png
文件 84594 2017-12-19 21:39 CFG\CFG\FunctionVisitor.visit_FunctionDef.png
文件 202185 2017-12-19 21:39 CFG\CFG\FunctionVisitor.visit_If.png
文件 8134 2017-12-19 21:39 CFG\CFG\FunctionVisitor.visit_Import.png
文件 8134 2017-12-19 21:39 CFG\CFG\FunctionVisitor.visit_ImportFrom.png
文件 42024 2017-12-19 21:39 CFG\CFG\FunctionVisitor.visit_Return.png
文件 105846 2017-12-19 21:39 CFG\CFG\FunctionVisitor.visit_While.png
文件 9737 2017-12-19 21:39 CFG\CFG\FunctionVisitor.__init__.png
文件 13915 2017-12-19 21:38 CFG\CFG.py
文件 92976 2017-12-16 19:23 CFG\fun1.png
文件 111168 2017-12-16 19:23 CFG\fun2.png
............此处省略3个文件信息
相关资源
- python cookbook(第3版)高清中文完整
- ml-agents-master
- 从视频中分离前景目标的Python & Matl
- 百度图像自动识别程序
- xlrd-1.2.0.tar
- python3.7离线帮助文档英文原版
- 爬取优酷电影代码
- Python开发五子棋小游戏
- 《Python Cookbook》第三版中文完整版
- 黑马2017Python课程配套笔记
- Python空间分析教程
- numpy-1.12.1rc1-cp27-none-win_amd64.whl
- 《Python 3.6 入门指南》中文版
- Python核心编程第二版完整版_高清中文
- Python核心编程第二版中文.pdf
- Tkinter教程第二版.pdf
- python机器学习-音乐分类器实现
- 免费Python性能分析与优化.pdf
- SNIC超像素python代码
- wxPython2.8-win32-unicode-2.8.12.1-py27.exe
- python数据可视化编程实战 pdf 中文完整
- eric4-4.5.23
- python-3.7.3中文文档 chm版
- wxPython实战(中文版).pdf244916
- LIDC-IDRI-nodule-segmentation-master.zip
- Python opencv库 cv2.so (armhf版
- 基于Python网络爬虫毕业论文.doc
- 基于Python智联招聘牌爬虫+本科毕业论
- think python中文版
- python编程从入门到实践.zip237878
评论
共有 条评论