• 大小: 1.61MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-11-06
  • 语言: Python
  • 标签: Python  控制流图  

资源简介

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个文件信息

评论

共有 条评论