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 | 0] f = p.function_list[ |
主要还是一些很基本的信息,示例函数如下
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 |
算了,先空着吧,等用到了再回来填坑