用Python获取C语言的控制流及其du(cfg和dupath)

 这是源代码分析课一个难想且难编写的作业,不过幸运的是,曾经使用过C语言的抽象语法树,所以还是有一些想法和思路。
 我的想法是,利用pycparser遍历抽象语法树。遍历的同时,判断每个节点是什么类型的语句,是哪种类型的普通语句,语句中是否定义或使用了变量,是哪一种类型的表达式等等等等…总之,挺复杂的,得好好考虑。

 参考之前大佬的博客,对不同语句的概念会更清晰:http://www.xz8090.com/f/article/14.html
 参考了以后,可以根据pycparser的节点类型,做出以下判断:

普通statement: (Decl, Assignment, FuncCall, EmptyStatement, UnaryOp, TernaryOp)
分支statement: (Switch, Case, Default, If, DoWhile, While, For, Break, Continue, Return)
特殊statement: typedef
Type(这似乎是pycparser的特别之处,type描述语句,所以依赖该节点还原源代码): (TypeDecl, PtrDecl, ArrayDecl, IdentifierType, Typename, Struct)

 按照以上做好分类,还需要思考一个问题,如何确定代码节点的后继呢?

 如果按照顺序读取代码的思路,会发现难以确定节点后继是什么。(或者说把分支节点也看做普通节点,运行一次后,再层层递归,这种思路也是不错)

 我才用从后向前的思路,把普通statement合并为一类处理,遇到分支节点单独处理,这样既能一次遍历确定节点的后继,又可以把节点直接展开,不需要层层扩展更新。

 按照这个思路和前大佬的节点分析,就可以编写基于pycparser的CFG-dupath-of-C代码了。

下载地址:CFG-dupath-of-C代码
用Python获取C语言的控制流及其du(cfg和dupath)_第1张图片

 不过我的代码未能详细列出每个变量详细的dupath(从后向前遍历的代价是需要再重新遍历一次才能获得结果),所以看看代码,说不定会有更多的想法。(以后发pycpaser的节点属性)

你可能感兴趣的:(python,c语言,编程语言,数据结构)