赞
踩
这是源代码分析课
一个难想且难编写的作业,不过幸运的是,曾经使用过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代码
不过我的代码未能详细列出每个变量详细的dupath(从后向前遍历的代价是需要再重新遍历一次才能获得结果),所以看看代码,说不定会有更多的想法。(以后发pycpaser的节点属性)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。