最近上《源代码分析技术》这个课,老师让写一个程序,由一段c代码,生成生成控制流图和du-path,控制流图不用解释了,说一下du-path,这个术语是针对变量来说的,对于一个变量,它在使用时,分析之前的定义,如果该变量在定义和使用过程中都没有被再定义,则从定义到使用的路径成为一条du-path。
1.使用lex和yacc
网上源代码很多,主要说一个我的修改
首先,要画控制流图,要找到关键字-while if for之类的有断点意义的词,在词法分析器中把这类词分出来
在语法分析阶段,匹配部分,判断,有下列情况:
- 函数+变量-》使用
- 变量1+“=”变量2-》:使用变量2,定义变量1
- 变量1+"="数字-》:定义变量1
- 变量1+“== / !=”数字-》使用变量1
- 变量1+“== / !=”变量2-》使用变量1、使用变量2
- 变量1“+-*/”变量2-》使用变量1、使用变量2
- 变量1“+-*/”数字-》使用变量1
- 当然,还有别的,没有全部列出
之后,生成的文件就是包含“关键字”和使用定义变量信息的表
在读取du-path的时候,从下往上匹配就行
画控制流图的时候,注意堆栈信息处理,把分析出的结果一次压栈,遇到一个}就匹配,如果是if语句,先扫描下面的语句是否有else,如果有,创建三个节点,if、if成立的代码、else,并且建立一个虚节点,作为if节点的退出节点,如果没有else,只需创建两个节点就行,再创建一个出口节点。
if判断完之后,创建一个合并节点,并且当做普通语句压回栈中
如果遇到的是while,则创建两个节点,一个内容节点,一个while节点,并且将两个节点分别连接(这个是相对别的而言的,其他语句只需要单箭头)
当栈空的时候就是完成匹配了
最后,用graphviz工具画出流程图即可