资源简介
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-BDD100K大规模多样化驾驶视频数据
- Instant Pygame for Python Game Development How
- Biopython Tutorial
- Think Python 2nd
- 一个小小的表白程序(python)
- Python课堂笔记(高淇400集第一季)
- 二级考试python试题12套(包括选择题和
- pywin32_python3.6_64位
- python+ selenium教程
- PycURL(Windows7/Win32)Python2.7安装包 P
- 英文原版-Scientific Computing with Python
- 7.图像风格迁移 基于深度学习 pyt
- 基于Python的学生管理系统
- A Byte of Python(简明Python教程)(第
- Python实例174946
- Python 人脸识别
- Python 人事管理系统
- 基于python-flask的个人博客系统
- 计算机视觉应用开发流程
- python 调用sftp断点续传文件
- python socket游戏
- 基于Python爬虫爬取天气预报信息
- python函数编程和讲解
- Python开发的个人博客
- 基于python的三层神经网络模型搭建
- python实现自动操作windows应用
- python人脸识别(opencv)
- python 绘图(方形、线条、圆形)
- python疫情卡UN管控
- python 连连看小游戏源码
评论
共有 条评论