程序不变量挖掘工具Daikon的安装与使用

来源:互联网 发布:淘宝客服兼职可靠吗 编辑:程序博客网 时间:2024/05/29 13:03

安装教程

1,JDK安装,配置三个java环境变量,JAVA_HOME,PATH,CLASSPATH,最终能够成功执行一个java程序为安装成功标志。
Note:三个环境变量各有其分别不同的作用,具体网上查看。

2,daikon必要组件安装daikon,配置目录daikonparent/daikon并将daikon文件解压进去,在shell启动文件中配置(linux:~/.bashrc):
# The full pathname of the directory that contains Daikon
export DAIKONDIR=daikonparent/daikon
# 将daikon中的daikon.jar和JDK中的tools.jar放到CLASSPATH中。daikon中该命令行文件可完成。
source $DAIKONDIR/scripts/daikon.bashrc
此步骤以提取出example中java程序不变量为安装成功标志。
Note:该步骤核心就是daikon.jar,该包实现了daikon.Chicory和daikon.Daikon的功能故能够提取java程序不变量。

3,daikon扩展组建安装kvasir:
git clone https://github.com/codespecs/fjalar.git
并将最新的fjalar替换之前daikon中的fjalar(实验显示旧的可能会存在一些不可预测的问题)
cd $DAIKONDIR/daikon
make kvasir
过程中可能会出现以下问题及解决方案:
Exception1:error,autogen.sh failed to run aclocal:No such file or directory
Reason1:丢失的aclocal是automake包的一部分,而其中某些包依赖与aclocal
Solution1:安装包automake。ubuntu:sudo apt-get install automake
Exception2:
readelf.c:53:17: fatal error: bfd.h: No such file or directory
#include "bfd.h"
^
compilation terminated.
Reason2:
it is most likely caused by the package binutils-dev not being installed
Solution2:
安装包binutils-dev。ubuntu:sudo apt-get install binutils-dev
kvasir的安装经常会遇到错误,往往是缺乏某些数据包的依赖,对于百度提示信息命令行安装依赖即可。此外,经常会出现些莫名其妙的没有安装成功现象,此时删除fjalar替换其他版本多尝试几次。

4,daikon扩展组建安装DynComp:
用于java程序需要额外安装see Section 7.2.1 [Instrumenting the JDK with DynComp], page 101
用于c程序只需要参数--with-dyncomp即可

使用教程

daikon提取c/c++程序不变量(以wordplay.c为例):

1,#进入源程序目录
cd $DAIKONDIR/examples/c-examples/wordplay
2,#编译源程序为可执行文件,必使用gcc参数-gdwarf-2,dwarf是linux中调试信息的一种格式
gcc -gdwarf-2 wordplay.c -o wordplay
3,#kvasir是daikon使用的c/c++程序的插桩工具,记录函数进入和出去时刻的可见变量状态。dyncomp是daikon使用到的程序变量分类工具,使用该工具可以减少不同类型变量之间没有意义的比较。分别生成.dtrace和.decls文件,存放在daikon-output目录下。
kvasir-dtrace --with-dyncomp ./wordplay -f words.txt ’daikon dynamic invariant detector’
4,#使用Daikon工具从.dtrace和.decls文件中分析,挖掘提取出不变量。生存.inv.gz文件,用于存放不变量。
java daikon.Daikon --config_option daikon.derive.Derivation.disable_derived_variables=true daikon-output/wordplay.decls daikon-output/wordplay.dtrace
5, #使用PrintInvariants工具将.inv.gz文件中的不变量,以可读的形式打印出来。
java daikon.PrintInvariants wordplay.inv.gz > wordplay_decl.inv.txt

daikon提取java程序不变量(以StackAr/DataStructures/*.java为例)
#进入原程序目录
1,cd examples/java-examples/StackAr
#编译源程序代码为class文件
2,javac -g DataStructures/*.java
#使用工具DynComp分析java的class文件,生成.decls文件,记录变量“可比较类别”。
3,java daikon.DynComp DataStructures.StackArTester
#使用工具Chicory和Daikon,相继生成.dtrace文件和.inv文件(该步骤亦可分为两步)
4,java daikon.Chicory --daikon comparability-file=StackArTester.decls-DynComp DataStructures.StackArTester
#使用PrintInvariants工具将.inv.gz文件中的不变量,以可读的形式打印出来。
5,java daikon.PrintInvariants StackArTester.inv > StackArTester_decl.txt

关于daikon的不变量报告理解:

C语言:
不变量的检测只是在特定的program points
program points:函数的入口,函数的出口
不变量检测涉及到的变量:
函数入口:全局变量、传入的形参
函数出口:全局变量、返回值、传入形参的原始值


Java语言: