Soot生成控制流图

Soot是一个强大的Java字节码分析工具,可用于生成控制流图、进行优化和分析。本文介绍了如何利用Soot自带的CFGViewer生成DOT语言描述的控制流图,并通过graphviz的dot命令转换为可视化图形。同时,文章深入探讨了Soot的内部工作原理,包括中间表示法(如Baf、Grimp、Jimple和Shimple)以及如何通过自定义变换实现更复杂的控制流图生成和代码优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Soot是McGill大学的Sable研究小组自1996年开始开发的Java字节码分析工具,它提供了多种字节码分析和变换功能,通过它可以进行过程内和过程间的分析优化,以及程序流图的生成,还能通过图形化的方式输出,让用户对程序有个直观的了解。尤其是做单元测试的时候,可以很方便的通过这个生成控制流图然后进行测试用例的覆盖,显著提高效率。

 

如果是将Soot当作简单工具来分析的人,可以直接使用Soot自带的工具soot.tools.CFGViewer分析类中的每个方法的控制流并生成DOT语言描述的控制流图,然后用graphviz中的dot命令来转换成可视化图形格式如.PNG

使用soot.tools.CFGViewer来生成Triangle.class的控制流图

进入项目bin目录下,拷贝soot.trunk.jar

1 java -cp soot-trunk.jar soot.tools.CFGViewer --soot-classpath .;"%JAVA_HOME%"\jre\lib\rt.jar TriangleClass.Triangle

为什么这里是TriangleClass.Triangle,是因为Triangle类是在TriangleClass包下的,所以类名需要加上完整包名

Triangle.java源代码如下:

 1 package TriangleClass;
 2 
 3 public class Triangle {
 4     
 5     
 6     public String triangle(int a, int b, int c){
 7         
 8         if(a > 0 && b > 0 && c >0){
 9             if(a + b >c)
10             {
11                 if(a == b || b ==c || a ==c)
12                 {
13                     if(a == b && b == c)
14                     {
15                         return "equilateral";
16                     }
17                     return "isosceles";
18                 }
19                 else{
20                     return "scalene";
21                 }
22             }
23             else{
24                 return "Not Triangle";
25             }
26         }
27         else{
28             return "Not Triangle";
29         }
30         
31         
32         
33     }
34     
35     public int a;
36     public int b;
37     public int c;
38 
39 }

其中一个文件已经生成

重命名后(文件名太长了。。),使用graphviz dot转换为图片PNG格式

1 dot -Tpng -o Triangle.png Triangle.dot  

再生成Test.class的控制流图:

Test.java

 1 package Soot;
 2 
 3 public class Test {
 4     
 5     private double num = 5.0;
 6     
 7     public double cal(int num, String type){
 8         double temp=0;
 9         if(type == "sum")
10         {
11             for(int i = 0; i <= num; i++){
12                 temp =temp + i;
13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值