首先,Soot安装完成后得“sootclasses-trunk-jar-with-dependencies.jar”,使用此jar文件来完成Soot操作。
其次,明确我们使用Soot时,输入.class文件,输出也是.class文件。
最后,Soot绘制完成后得到.dot文件,需要使用graphviz进行绘制,从而得到控制流图。
运行“sootclasses-trunk-jar-with-dependencies.jar”时,输入文件BubbleSort.class文件的位置与sootclasses-trunk-jar-with-dependencies.jar在同一目录下。
2.1按语句划分# 命令1:按语句划分 java -cp sootclasses-trunk-jar-with-dependencies.jar soot.tools.CFGViewer -cp . -pp BubbleSort
其中:
(1)“soot.tools.CFGViewer”表示使用Soot的控制流图绘制功能
(2)“-cp .”表示Soot指明类路径,“.”表示类路径为当前路径。
(3)Soot还必须指明 java.lang.Object,可以用“-pp”,也可以添加“rj.jar”。
(4)BubbleSort指代BubbleSort.class,Soot默认输入class文件;当然,你可以用"–src-prec"指定输入文件类型。
# 命令2:按基本块划分 java -cp sootclasses-trunk-jar-with-dependencies.jar soot.tools.CFGViewer -cp . -pp --graph=BriefBlockGraph BubbleSort
其中:“–graph=BriefBlockGraph”表示按基本块划分
2.3Soot命令运行结果在BubbleSort.class同一目录下生成sootOutput文件,文件中包含图中的四个.dot文件及一个优化后的BubbleSort.class文件。
生成的.dot文件名称好复杂,为了简便操作,将"BubbleSort void main(java.lang.String[]).dot"改名为"main.dot",然后使用下列命令进行绘制。
dot -Tpng -o main.png main.dot5结果 5.1 按语句划分的控制流图
下图是main.dot的控制流图。
下图是main.dot的控制流图。
由于main函数中没有控制流的转移,所以将其绘制为一个基本块更为合理(即5.2的效果更符合要求)。



