今天简单总结一下Doop这个工具的使用方法,其网址在这里:Bitbucket
感觉这个页面其实已经说得很详细了。首先,需要安装Soufflé这个工具(这是一个高效的Datalog引擎),我发现最靠谱的方法还是自己build以后安装:
首先下载其源码:
git clone git://github.com/souffle-lang/souffle.git
然后按照这个链接:Build Soufflé | Soufflé • A Datalog Synthesis Tool for Static Analysis
进行build和安装,安装的时候可以指定到其他的目录,例如我这里运行:
cd soufflecmake -S 、-B build -DCMAKE_INSTALL_PREFIX=/home/yu/souffle-instcmake --build build --target install
然后将安装路径加入到环境变量中:
gedit ~/.bashrc
然后加入这一行:
export PATH=$PATH:/home/yu/souffle-inst/bin
重启终端之后就可以在任意目录下运行souffle了。
接下来就是Doop的安装和使用,按照这个页面的介绍:Bitbucket
我们可以直接通过运行类似:
./doop -a context-insensitive -i com.example.some.jar
的命令来运行Doop。我尝试了一下doop/tests/016-reflection这里的例子,首先在这个目录下运行:
gradle build
可以在这个目录下:doop/tests/016-reflection/build/libs看到一个jar包:016-reflection.jar,如果我们把这个jar包直接拷贝到Doop根目录下,然后运行:
./doop -a context-insensitive -i 016-reflection.jar
则会报和JRE版本有关的错误,具体我也没有仔细看,看了看上面Doop的页面:
For a variety of benchmarks, you could clone (or download) the doop-benchmarks repository.
One important directory in that repository is JREs、It can be used for the DOOP_PLATFORMS_LIB environment variable、It contains certain java library files for different JRE versions, necessary for analysis purposes.
感觉还是应该指定一下这个环境变量(目的是可以在分析过程中使用一个老的JRE版本),clone一下上面这个repo,然后在上面修改过的.bashrc文件中加入:
export DOOP_PLATFORMS_LIB=/home/yu/doop-benchmarks
再重新打开一个终端,然后再运行:
./doop -a context-insensitive -i 016-reflection.jar
发现可以正常运行了。运行完之后在类似于:doop/last-analysis的目录下,可以看到生成了很多结果文件,其中VarPointsTo.csv这个文件很大。我还没有具体仔细看这些文件的内涵。
下面总结一下和Doop官网中说的不一样的地方:我比较感兴趣Doop和Souffle这两者是怎么交互的,按照官网的介绍:
Soufflé profile
You can then inspect the analysis results by using souffle-profile and providing the profile.txt file produced by Souffle under the output directory of the analysis database、In order to inspect the profile.txt of the above doop invocation with --souffle you would use the following command:
$ souffle-profile out/antlr-ci/profile.txt
感觉好像是在Doop根目录下运行这个命令即可,但是当我这样运行,就会报错:
souffle-profile:未找到命令
其实可以理解,我们并没有看到有一个可执行文件叫这个名字啊。我又看了看souffle的bin目录,发现其实有这样一个可执行文件:souffleprof,所以感觉是不是改名了。另外,上面这个例子给出的目录:out/antlr-ci/profile.txt也是不存在的。我看了一下doop/out这个目录,里面是一个或者若干个md5 hash value命名的文件夹,觉得好奇怪啊。点开其中一个文件夹,可以看到里面有一个叫meta的文件,是不是记录了这次运行的一些基本的信息呢:
SOUFFLE_DEBUG=false
SOUFFLE_FORCE_RECOMPILE=false
SOUFFLE_INCREMENTAL_OUTPUT=false
SOUFFLE_JOBS=4
SOUFFLE_LIVE_PROFILE=false
SOUFFLE_MODE=compiled
SOUFFLE_PROFILE=false
SOUFFLE_PROVENANCE=false
SOUFFLE_USE_FUNCTORS=false
所以我想,是不是我们把SOUFFLE_PROFILE在命令行中指定一下就可以了?所以尝试运行:
./doop -a context-insensitive --souffle-profile -i 016-reflection.jar
没想到这样运行的话会报一堆错,不知道怎么回事!另外吐槽一点,上面souffle-profile out/antlr-ci/profile.txt中给出的profile.txt我也不知道是什么意思,因为整个Doop文件夹下都没有叫这个名字的文件。
不过今天算是能够正常运行Doop了,所以这里还是简单记录一下。(尝试了一个小时左右,呵呵,应该说Doop的文档写得不错了,但是还是有错误和语焉不详的地方,例如上面的Soufflé profile,实在不知所云,不得不说,大家做事都太粗心了)