关于工具的碎碎念
关于怎么用那些工具
下载说明,
(1)openjml+solver的zip:http://www.openjml.org/
(2) jmlunitng:http://insttech.secretninjaformalmethods.org/software/jmlunitng/
点击里面那个 1.4 进行下载
正文第三段,单独一行那个 有个 1.4,点击下载
1 solver
java -jar .\openjml.jar -exec C:\Users\73939\t\Solvers\z3-4.7.1.exe -esc C:\Users\73939\t\Group.java
这是我的文件树,可以参考一下,我进入这个文件夹弄得
2 神奇的jmlunitng
弄好文件,依次输入下面四条指令
java -jar jmlunitng.jar test/Group.java
javac -cp jmlunitng.jar test/*.java
java -jar openjml.jar -rac test/Group.java test/Person.java
java -cp jmlunitng.jar test.Group_JML_Test
文件树同上,把代码放到test里里面(我截图两个文件不参加编译,只留着两个副本备用的)
(我的是魔改版,去除了接口,更改了package的位置)
要是报加载找不到主类,就是你的文件package错了
package test; import java.math.BigInteger; import java.util.ArrayList; public class Person { public int id; public String name; public BigInteger character; public int age; public ArrayList<Person> acquaintance; public ArrayList<Integer> value; public Person(int id, String name, BigInteger character, int age) { this.id = id; this.name = name; this.character = character; this.age = age; acquaintance = new ArrayList<>(); value = new ArrayList<>(); } void addAcq(Person person) { acquaintance.add(person); } void addValue(int x) { value.add(x); } public int getId() { return id; } public String getName() { return name; } public BigInteger getCharacter() { return character; } public int getAge() { return age; } public boolean equals(Object obj) { if (obj != null && obj instanceof Person) { return (((Person) obj).getId() == id); } else { return false; } } public boolean isLinked(Person person) { if (person.getId() == id) { return true; } for (int i = 0; i < acquaintance.size(); i++) { if (acquaintance.get(i).getId() == person.getId() || person.getId() == id) { return true; } } return false; } public int queryValue(Person person) { for (int i = 0; i < acquaintance.size(); i++) { if (acquaintance.get(i).getId() == person.getId()) { return value.get(i); } } return 0; } public int getAcquaintanceSum() { return acquaintance.size(); } public Person getAcq(int x) { return acquaintance.get(x); } public int compareTo(Person p2) { return name.compareTo(p2.getName()); } }
魔改版person就是这个
理论上,运行到第三句之后,test文件夹这个样子
剩下的大家摸索吧
(附上我jmlunitng全过程)
(1)开始
(2)第一条指令
test如下
(3)第二条指令
test如下
(4)第三条指令
众所周知,警告等于不存在
test这样子
(5)最后一步
完成啦