Points-to analysis工具Doop的基本使用(2)

在上一篇博客中:Java和Android应用points-to analysis工具Doop的基本使用方法_qysh123的专栏-CSDN博客

我简单介绍了Souffle和Doop的安装和使用方法,下面以Doop自带的例子为例,简单介绍一下Doop的运行过程,和一些我注意到的问题:

首先,在这个文件夹下doop/docs/doop-101-examples,我们可以看到一个示例代码:Example.java,直接在这个文件夹下运行:

make

就可以生成对应的jar包,然后我们可以通过命令行对其进行分析了,具体的命令行参数可以参考这位小哥总结的:指针分析工具 Doop 使用指南 | Jckling's Blog

具体而言,在Doop根目录下运行:

./doop -a context-insensitive -i docs/doop-101-examples/Example.jar

可以看到在last-analysis这个文件夹下生成了很多facts文件,还有一些诸如VarPointsTo.csv的文件,其中VarPointsTo.csv的大小有320MB,呵呵,正常情况下不是应该介绍一下这个文件的具体含义吗?不好意思,作者默认这些简单的细节我们都知道的,所以讲了很多无关紧要的东西。能否让这个结果简单一些呢?

./doop -a context-insensitive --app-only -i docs/doop-101-examples/Example.jar

似乎让结果文件简单了一点。这下减小到26KB了,然后作者又教了我们怎么过滤:

新建一个文件:temp.dl

.decl Var_DeclaringMethod(v: symbol, m: symbol)
.input Var_DeclaringMethod(IO="file", filename="Var-DeclaringMethod.facts", delimiter="\t")

.decl VarPointsTo(c1: symbol, h: symbol, c2: symbol, v: symbol)
.input VarPointsTo(IO="file", filename="VarPointsTo.csv", delimiter="\t")

.decl Temp(v: symbol, h: symbol)
Temp(v, h) :-
  VarPointsTo(_, h, _, v),
  Var_DeclaringMethod(v, "<Example: void test(int)>").

.output Temp

然后运行:

souffle -F last-analysis/ temp.dl

然后可以生成这样的一个Temp.csv文件:

<Example: void test(int)>/@this	<Example: void main(java.lang.String[])>/new Example/0
<Example: void test(int)>/$stack5	<Example: void test(int)>/new Dog/0
<Example: void test(int)>/$stack6	<Example: void test(int)>/new Cat/1
<Example: void test(int)>/l3#_32	<Example: void test(int)>/new Cat/1
<Example: void test(int)>/$stack7	<Example: void test(int)>/new Cat/2
<Example: void test(int)>/l4#_33	<Example: void test(int)>/new Cat/2
<Example: void test(int)>/l0#_0	<Example: void main(java.lang.String[])>/new Example/0
<Example: void test(int)>/$stack8	<Example: void test(int)>/new Cat/0
<Example: void test(int)>/l2#_26	<Example: void test(int)>/new Cat/0
<Example: void test(int)>/l2_$$A_1#_28	<Example: void test(int)>/new Dog/0
<Example: void test(int)>/l2_$$A_2#_29	<Example: void test(int)>/new Dog/0
<Example: void test(int)>/l2_$$A_2#_29	<Example: void test(int)>/new Cat/0

相信这回大家一看就知道是什么意思。

上一篇博客说了,我比较关心Doop和Souffle之间的交互,那就想知道,能否用Doop只生成一些有用的facts呢?如下图所示:

但是和预想的不一样啊,如果运行:

./doop -a context-insensitive --app-only --dry-run -i docs/doop-101-examples/Example.jar

呵呵呵呵,这回就只生成了11个文件,大部分还是大小为0的,其中有一个MainClass.facts,里面只是列出了main class的名字。没办法,只能自己在上面那个很多的一堆文件里分析了。不得不说,很多工具开发的作者,脑子真的不清楚,写文档的时候不知道读者最想知道/关心的是什么,净写一堆有的没的废话。

另外总结一点,按照Doop给出的例子:doop-mirror/doop-101.md at master · plast-lab/doop-mirror · GitHub

运行的是micro这个分析,这个和上面的context-insensitive还是不一样的,如果运行:

./doop -a micro --app-only -i docs/doop-101-examples/Example.jar

这时候生成的VarPointsTo.csv的大小是266MB,并且格式和前面的也有了些变化(盲猜一下:本质和前面320MB的文件是相同的,只是因为格式不同引起了变化)。相应的,我们的处理代码也要稍微变一下:

.decl Var_DeclaringMethod(v: symbol, m: symbol)
.input Var_DeclaringMethod(IO="file", filename="Var-DeclaringMethod.facts", delimiter="\t")

.decl VarPointsTo(h: symbol, v: symbol)
.input VarPointsTo(IO="file", filename="VarPointsTo.csv", delimiter="\t")

.decl Temp(v: symbol, h: symbol)
Temp(v, h) :-
  VarPointsTo(h, v),
  Var_DeclaringMethod(v, "<Example: void test(int)>").

.output Temp

这时候得到的结果还是和上面是相同的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值