用 Tai-e 框架(教学版)分析自制用例
我们非常鼓励你在完成实验作业的过程中自己写一些类作为测试用例,然后用你实现的分析算法来分析这些类。这既可以帮助你更好地理解分析算法,也对你 debug 很有帮助。下面我们介绍如何用 Tai-e (教学版)分析你写的类、其中可能遇到的问题、以及解决方法。
如何用 Tai-e 框架分析自己写的测试用例?
实际上我们已经在 Tai-e 框架(教学版)配置指南 介绍过,假设你写了一个类 A.java
并放在路径 path/to/class/
下,那么你可以用我们为每个作业提供的 pascal.taie.Assignment
分析你的类,只需给它指定参数 -cp /path/to/class/ -m A
即可。
参数 -m
只能指定一个类,即你写的 Java 程序的主类 (main class),但这并不意味着 Tai-e 只能分析一个类的程序。若该类使用了 -cp
所指定路径下的其它类, Tai-e 也能一并分析。
遇到前端报出错误或生成的 IR 不符合预期怎么办?
我们在 Tai-e 框架(教学版)配置指南 中介绍过, Tai-e 目前利用 Soot 前端解析 Java 程序并辅助构建 Tai-e IR。若你写的类符合 Java 语法,但 Tai-e 分析时抛出 SootFrontendException
,或生成的 IR 不符合预期(如缺少了源码中的某些语句),那这极有可能是你的类中使用了一些 Soot 的 Java 前端无法处理的语言特性(该前端最高只能部分支持 Java 7 的特性,且不是十分健壮)。
对于这类问题,最简单的解决方法是用 Java 编译器将你写的类编译成字节码 (.class
),然后让 Tai-e 分析 .class
文件,这样 Tai-e 就会借助 Soot 的字节码前端解析程序(注:Soot 的字节码前端虽然更加健壮,但其不能保存源码中的变量名信息,因此生成的相应 IR 可读性会差一些)。
.class
)?
如何用 Tai-e 框架分析字节码 (很简单,与分析 Java 源码的方式一样。假设你编译好的类 A.class
存放在路径 /path/to/class/
下,则使用 pascal.taie.Assignment
并给予其参数 -cp /path/to/class/ -m A
即可。
若同一路径下同时存在一个类的 Java 源码 (.java
) 和字节码 (.class
), Tai-e 会自动优先选择字节码进行分析,因此你只需将代码编译成字节码并放在同一路径下,然后用同样的参数进行分析即可。