源程序生成控制流图和du-path

最近上《源代码分析技术》这个课,老师让写一个程序,由一段c代码,生成生成控制流图和du-path,控制流图不用解释了,说一下du-path,这个术语是针对变量来说的,对于一个变量,它在使用时,分析之前的定义,如果该变量在定义和使用过程中都没有被再定义,则从定义到使用的路径成为一条du-path。

1.使用lex和yacc

网上源代码很多,主要说一个我的修改

首先,要画控制流图,要找到关键字-while if for之类的有断点意义的词,在词法分析器中把这类词分出来

在语法分析阶段,匹配部分,判断,有下列情况:

  1. 函数+变量-》使用
  2. 变量1+“=”变量2-》:使用变量2,定义变量1
  3. 变量1+"="数字-》:定义变量1
  4. 变量1+“== / !=”数字-》使用变量1
  5. 变量1+“== / !=”变量2-》使用变量1、使用变量2
  6. 变量1“+-*/”变量2-》使用变量1、使用变量2
  7. 变量1“+-*/”数字-》使用变量1
  8. 当然,还有别的,没有全部列出

之后,生成的文件就是包含“关键字”和使用定义变量信息的表

在读取du-path的时候,从下往上匹配就行

画控制流图的时候,注意堆栈信息处理,把分析出的结果一次压栈,遇到一个}就匹配,如果是if语句,先扫描下面的语句是否有else,如果有,创建三个节点,if、if成立的代码、else,并且建立一个虚节点,作为if节点的退出节点,如果没有else,只需创建两个节点就行,再创建一个出口节点。

if判断完之后,创建一个合并节点,并且当做普通语句压回栈中

如果遇到的是while,则创建两个节点,一个内容节点,一个while节点,并且将两个节点分别连接(这个是相对别的而言的,其他语句只需要单箭头)

当栈空的时候就是完成匹配了

最后,用graphviz工具画出流程图即可

 

你可能感兴趣的:(Graphviz,源程序,控制流图,dupath)