《SVF: Interprocedural Static Value-Flow Analysis in LLVM》阅读笔记
作者:Yulei Sui Jingling Xue
文章介绍了工具SVF,用稀疏分析的最新进展,对C程序进行可扩展的、精确的程序内静态值流分析,许以迭代的
方式进行值流构建和指针分析。SVF接受所有的指针分析产生的points-to 信息,并且建立起程序间内存SSA,从而捕获top-level和address-taken的def-use链,这些value flow 之后可以被利用来支持各种程序分析,如内存泄漏,未初始化变量检测,安全漏洞检测以及污点分析,也可以用来支持更加精确的指针分析。
svf框架
svf是实现在LLVM上的,程序源代码首先被clang编译成字节码文件,接着被LLVM Gold Plugin在链接阶段合并产生一个全程序的.bc文件,接着调用指针分析模块,根据获得的points-to信息,value-flow构建模块将程序置于内存SSA模式从而使得top-level和address-taken的def-use链被激活。
指针分析
svf指针分析包含三个组件:Graph,Rules,Solver。Graph从一个程序的LLVM IR中提取更高层次的抽象,表明应该在哪里进行指针分析。Rules定义了如何从每个stmt即图上的约束条件获取points-to信息。Solver决定以何种顺序来解决所有的约束。
value-flow图构建
构建规则
Copy:q流向p.
PHI:v1,v2流向v3.
Load:类似于p=(*q).o,o流向p.
Store:类似于(*p).o2=q.o1,q流向o2,o1流向o2.
Call:调用点(r=f(…p…)),被调用函数(f(…q…){return x}),这里p是实参,q是形参,所以p流向q,返回值x流向r。另外两个没看懂(我太菜了)
总结:
除了上面说到的两种分析,文中还介绍了source-sink分析,加速动态分析以及程序的调试方法等。
此外,svf源码在github上已经开源(https://github.com/svf-tools/SVF),本人最近也在学习源码,欢迎交流呀!邮箱:2714085031@qq.com