基于clang的程序分析

基于clang的程序分析

2020.09.16

编译LLVM

CMake参数

  • -DLLVM_ENABLE_PROJECT="clang"将clang模块也编译进去
  • -DCMAKE_C_COMPILER=clang-10 -DCMAKE_CXX_COMPILER=clang++-10用clang去编译整个项目,比gcc快
  • -DCMAKE_BUILD_TYPE=Release如果内存不够,用Release版本比Debug版本快

编译插件

将插件目录加入clang/examples目录下,并添加到CMakeLists.txt中

CmakeLists.txt:
+add_subdirectory(MyPlugin)

编译

cmake -G "Unix Makefiles" ...
make MyPlugin

使用插件

clang++ Xclang -load -Xclang ../build/lib/MyPlugin.so -Xclang -add-plugin -Xclang my-plugin-name test.cpp

clang

主要是前端部分,预处理和AST构建

clang和llvm的使用场景

  • clang:简单代码阅读即可解决的问题
  • llvm:需要数据流/控制流分析解决的问题

clang-tutor

HelloWorld

  • translation unit:

    input source file and all header files that it includes ,直接或间接都行,一个cpp文件,以及那些#include包括的文件为翻译单元

  • c++ record declaration:

    struct/union/class

Clang AST

一般在translation unit中top-level declaration总是translation unit declaration

//+--function declaration 'f'
//|
int f(int x) { //--------------------------------------+
	int result = (x / 42);//declaration statement      |----compound statement
	return result;//return statement                   |    body of 'f'
} //---------------------------------------------------+

AST Context

所有关于AST translation unit的信息保存在ASTContext类中

重要成员函数getTranslationUnitDecl,获取顶层结构

AST Node

如果要traverse整个AST

  1. TranslationUnitDecl开始,然后不停的循环遍历,可以借助RecursiveASTVistor

  2. Clang AST中最基本的node是StmtDecl,以及Expr

RecursiveASTVisitor

实现一个类,继承RecursiveASTVisitor,可以从AST获取相关信息

该类提供一个hooks方法

bool VisitNodeType(NodeType *)

[Node]可以是AST中各类nodes

node类型之间关系可以查看clang/Basic/下的.td文件,例如clang\Basic\DeclNodes.td

重写该方法可以自己拿到对应的类型,进行处理

编写插件

加入编译目录

clang/example目录下,新增插件名的文件夹,并将插件目录添加到该目录下的CmakeLists.txt文件下

+ add_subdirectory(MyPluginDirName)
新建CMakeLists.txt文件
add_llvm_library(PrintMacros MODULE PrintMacros.cpp PLUGIN_TOOL clang)

if(LLVM_ENABLE_PLUGINS AND (WIN32 OR CYGWIN))
  set(LLVM_LINK_COMPONENTS
    Support
  )
  clang_target_link_libraries(PrintMacros PRIVATE
    clangAST
    clangBasic
    clangFrontend
    clangLex
    )
endif()
新建MyPlugin.cpp文件
  1. 新建类继承PluginASTAction类,并重写CreateASTConsumerParseArgs两个函数
  2. 新建类继承ASTConsumer类,重写HandleTranslationUnit方法等
  3. 新建类继承RecursiveASTVisitor类,重写VisitXXXDecl方法,可以对不同的Node进行处理,XXX即为Node的类型名称
  4. 新建类继承PPCallbacks类,介入预处理结束后的调用过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值