JML理论基础

jml是基于一阶谓词逻辑来对类进行形式化描述的语言,jml语言通过表达式、方法规格、类规格三个部分来进行描述。其中表达式是在java语言的基础上扩展了非修改类型的表达式;方法规格中包括了前置条件、后置条件、副作用作用范围三个部分;类规格包含不变式和状态变化约束两个部分。jml相较于自然语言而言,可以消除歧义,同时配合相关工具进行形式化验证。

jml方法规格写法举例

 /*@ public normal_behavior  //正常行为规格
@ requires (\exists int i; 0 <= i && i < acquaintance.length; //前置条件
@ acquaintance[i].getId() == person.getId());
@ assignable \nothing; //副作用范围
@ ensures (\exists int i; 0 <= i && i < acquaintance.length; //后置条件
@ acquaintance[i].getId() == person.getId() && \result == value[i]);
@ also
@ public normal_behavior
@ requires (\forall int i; 0 <= i && i < acquaintance.length;
@ acquaintance[i].getId() != person.getId());
@ ensures \result == 0;
@*/

JML工具链

目前能用的jml工具链不多,我在本单元使用了openjml和jmlunitng两种工具

openjml使用

openjml使用过程中槽点相当之多,包括jdk版本、大量报错,静态检查巨慢等...

除了用官网的简单代码的测试外,我是用魔改了的MyPerson类来进行了静态测试,结果如下:

可以看到有很多奇怪的报错,后面我用原版的MyPerson执行

java -jar $opjml/openjml.jar  -cp ../../explaintion/package/offical.jar -esc MyPerson.java

结果如下

可以看到时间相当长,而且报了7个奇怪的错误,怀疑可能是opjml支持性的问题

为了证明opjml的效果,我改了一下MyPerson的getId()方法

结果如下

可以看到静态检查确实发现了问题,但是有价值的错误信息混在大量无意义的信息中无疑加大了阅读难度

openjml总结

虽然opjml能够发现问题,但是时间长、报错多的问题使得它并不是特别实用

jmlunitng使用

jmluniting的使用由于Group一直报错,我就自己写了一个MainClass来测试。

MainClass代码如下:

public class MainClass{
private /*@spec_public@*/ int id;
private /*@spec_public@*/ String s;
/*@ assignable id;
@ ensures id == \old(id)+1;
@*/
public void addid(){
id++;
} /*@ requires num>=0;
@ assignable id;
@ ensures id == \old(id)+num;
@*/
public void main(int num){
if(num<0||num>150) return;
for(int i=1;i<=num;i++){
addid();
} } /*@ requires ins!= null;
@ assignable s;
@ ensures !s.equals(ins);
@*/
public void setString(String ins){
this.s = ins;
} /*@ requires ss != null;
@ assignable \everything;
@ ensures id == 0 && s==ss;
@*/
public MainClass(String ss){
s=ss;
id=0;
} }

使用如下的指令来进行测试:

java -jar %opjml%/jmlunitng.jar MainClass.java
javac -cp %opjml%/jmlunitng.jar *.java
java -jar %opjml%/openjml.jar -rac MainClass.java //生成openjml的断言
java -cp .;%opjml%/jmlunitng.jar MainClass_JML_Test
pause

运行结果

可以看到主要对于边界数据进行了一些测试,其实按照官方文档的说法是可以在生成的代码里面添加自己想要测试的数据的,但是这样的化其实会比写junit好一点,自己写junit的话如果理解错误就凉凉了。

代码分析

第一次作业

非常简单,自己写了一个并查集,其余的就是一步步按照jml来,这也为后来的错误埋下了伏笔

第二次作业

同样非常简单,就是把理按照jml一步步来,把某些事件复杂度大的方法稍加修改,结果由于第一次的getPerson采用遍历的方式,导致强测直接原地爆炸,强测0分。

第三次作业

这次作业复杂一些,我先理解完了jml后然后再按照自己的方法来写,其中把queryAgeSum、queryMiPath、queryStrongLink三个方法的实现封装在了Work里面。

测试&bug分析

在这个单元中可以说吃了测试不全的大亏,导致三次作业分数都非常不理想。

黑盒测试

黑盒测试是我这次在互测中采用的主要方法,我的测试主要由两部分构成,一部分是数据生成器,一部分是对拍器。对排器比较简单,主要讲讲数据生成生成。我本来是随机生成的,后来第一次作业观摩了房内某个基本道道全中的dalao的数据,发现采用不同权重的随机数,对于权重高的数据每次生成一小批,例如

A
A
A
B
C
C
C
B

这种,同时尽可能多的把图变得稠密,这样也能增加数据的强度。

在本单元的测试中,前两次我都是用黑盒测试来互相测试,第三次我利用黑盒和同学的代码进行对拍。比较血亏的是我以为queryAgeSum的缩写是qas结果导致本地一个数组开小的错误没有测出,互测中数据强度也不太够,只刀了4个人。

白盒测试(Junit)

本单元,我觉得Junit测试有一定风险,如果对jml理解错误就会导致一些比较尴尬的情况。我觉得junit测试方面有两个心得,一个是要尽可能多的覆盖掉所有代码路径,这样能够比较大限度地判断已经完成代码逻辑与没有问题。另外一个方面是尽可能多地覆盖数据的情况,对数据进行分类,比如采用判断表法或者数据等价类划分能够很好地解决黑盒测试中难以生存的某些边界数据问题。

总结

在本单元的学习中,我对于形式化验证的方法有了一定了解,但也认识到形式化验证还存在效率不高等问题。同时本单元的连续多次踩坑,也让我更加注重测试的重要性,对测试代码的迭代也让我了解了许多测试的方法。当然本单元学习还是有一些遗留问题,比如为什么jml的是如此设计的,为什么通过前置和后置条件副作用就能完美地描述一个方法,这其实有赖于对于公理逻辑系统的理解,希望以后有空能去看看相关论文深入了解下。

OO第三单元小结的更多相关文章

  1. oo第三单元学习总结

    OO第三单元小结 一.JML语言理论基础及工具链梳理 在本单元我们学习了JML语言的一些基础知识,能够让我们看懂简单的JML规格并写出对应代码, 主要用到的知识点有:   1.requires 该子句 ...

  2. OO第三单元作业总结

    OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...

  3. 规格化设计——OO第三单元总结

    规格化设计--OO第三单元总结 一.JML语言理论基础.应用工具链 1.1 JML语言 ​ JML(java modeling language)是一种描述代码行为的语言,包括前置条件.副作用等等.J ...

  4. 【OO学习】OO第三单元作业总结

    [OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...

  5. OO第三单元(地铁,JML)单元总结

    OO第三单元(地铁,JML)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉并了解JML来是我们具有规格化编程架构的思想.这个单元的主题一开始并不明了,从第一次作业的路径到第二次 ...

  6. OO第三单元——基于JML的社交网络总结

    OO第三单元--基于JML的社交网络总结 一.JML知识梳理 1)JML的语言基础以及基本语法 JML是用于java程序进行规格化设计的一种表示语言,是一种行为接口规格语言.其为严格的程序设计提供了一 ...

  7. OO第三单元作业——魔教规格

    OO第三单元作业--魔教规格 JML的理论基础和相关工具   JML(Java Modeling Language,Java建模语言),在Java代码种增加了一些符号,这些符号用来标志一个方法是干什么 ...

  8. OO第三单元个人总结

    OO第三单元个人总结 JML理论与基础与应用工具链 JML是什么? Java建模语言(JML)是一种行为接口规范语言,可用于指定Java模块的行为 .它结合了Eiffel的契约设计方法 和Larch ...

  9. 2020 OO 第三单元总结 JML语言

    title: 2020 OO 第三单元总结 date: 2020-05-21 10:10:06 tags: OO categories: 学习 第三单元终于结束了,这是我目前为止最惨的一单元,第十次作 ...

随机推荐

  1. React SSR in Action

    React SSR in Action react render HTML string from the server ReactDOMServer https://reactjs.org/docs ...

  2. svg & regex

    svg & regex https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reg ...

  3. 在浏览器上播放m3u8视频

    在edge上有效 <video width="600" controls> <source src="https://www.gentaji.com/2 ...

  4. cobra-强大的CLI应用程序库

    cobra介绍 Cobra是一个用于创建强大的现代CLI应用程序的库,也是一个用于生成应用程序和命令文件的程序. Cobra用于许多Go项目,如Kubernetes.Hugo和Github CLI等. ...

  5. 微信小程序:标签字符串直接变成标签来显示要通过富文本技术

    rich-text标签存在nodes属性直接接受标签字符串

  6. 零基础学Python:数据容器

    1.常用操作 列表常用操作 在 ipython 中定义一个 列表,例如: l= list() 输入 l. 按下 TAB 键, ipython 会提示 字典 能够使用的函数如下: 可以到官方网址查询使用 ...

  7. AQS源码解读(ReentrankLock的公平锁和非公平锁)

    构建Debug代码: 1 package com.hl.interview.lock; 2 3 import java.util.Scanner; 4 import java.util.concurr ...

  8. javaweb遇到的报错及解决方式

    javaweb报错问题以及解决方案 问题(报错信息):Application Server was not connected before run configuration stop, reaso ...

  9. Linux速通 随笔整理

    Linux速通 随笔整理 为了方便阅读,特整理了相关的学习笔记 零.大纲 一.系统安装 二.命令格式 三.文件管理 四.用户群组 五.文件处理 六.系统初始化及监控 七.硬盘初始化 八.网络原理

  10. 一个把数据转化成Excel导出的程序 python Django

    把从数据库查询出来数据导出 源码下载!!!!! 效果图 登入界面 主页面 查询到数据 导出 打开得到文件 项目地址,源码下载