栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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, "").

.output Temp

然后运行:

souffle -F last-analysis/ temp.dl

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

/@this	/new Example/0
/$stack5	/new Dog/0
/$stack6	/new Cat/1
/l3#_32	/new Cat/1
/$stack7	/new Cat/2
/l4#_33	/new Cat/2
/l0#_0	/new Example/0
/$stack8	/new Cat/0
/l2#_26	/new Cat/0
/l2_$$A_1#_28	/new Dog/0
/l2_$$A_2#_29	/new Dog/0
/l2_$$A_2#_29	/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, "").

.output Temp

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/727412.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号