資源簡介
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個文件信息
評論
共有 條評論