C/C++文件解析
由于主要研究C和C++,对函数、变量、类型提取等还是会经常用的,但是直接抱着ANTLR4手撸Visitor还是太傻了,所以调研了一下已有的一些工具,康康有没有好的解决方案
主要介绍三个工具,分别是lizard、pycparser、libclang
lizard#
lizard是一个代码分析的python包,语言包括但不限于c/cpp、
java,同时除了分析源代码文件,它也有一些统计代码量、检测抄袭啥的功能。当然我只关心它的源代码分析部分,它有个比较好的优点就是对源代码的分析不依赖于头文件,所以我们不用管它的头文件是不是缺失的问题。
代码量统计#
通过命令行即可调用
| 1 | lizard openssl/ssl/bio_ssl.c | 
函数相关#
| 1 | import lizard | 
可以看到主要是保留了函数的信息和一些基本信息,接着看看函数信息
| 1 | f = p.function_list[0] | 
主要还是一些很基本的信息,示例函数如下
| 1 | static int ssl_new(BIO *bi) | 
| 1 | f.start_line | 
对于函数调用等的分析是没有的,这个作者也在README中说了。
pycparser#
是一个用python解析C语言的库,可定制性比lizard更高,目前主要兼容C99标准,它内置c_ast用于访问AST树,缺点是只能对一些标准的头文件进行忽略,当缺失头文件时,由于AST解析失败,会出错,需要自己更正直到产生正确的中间文件。具体可参考(https://eli.thegreenplace.net/2015/on-parsing-c-type-declarations-and-fake-headers),值得一提的是,即使正确的处理得到了中间文件,parser依然可能会处理失败。
这里我们都使用base64的代码进行体验,里面有for循环也有if语句等。
pycparser主要在AST树上做事,所以写代码的时候可以多参照c_ast.py和它的examples。
访问节点示例1#
示例1主要访问函数定义、参数定义、变量定义等。
| 1 | from __future__ import print_function | 
访问节点示例2#
示例2主要想知道函数调用了哪些函数,也就是想生成函数调用图
| 1 | from __future__ import print_function | 
libclang#
libclang需要先装llvm,从一个纯净ubuntu的docker开始,命令如下
| 1 | apt install vim gcc g++ cmake python2 python3 python3-distutils python3-pip | 
算了,先空着吧,等用到了再回来填坑

