首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用函数后JML删除警告

调用函数后JML删除警告
EN

Stack Overflow用户
提问于 2020-12-13 09:52:33
回答 1查看 347关注 0票数 2

在任务中,我必须删除JML产生的每一个警告。

如果我在构造函数中调用一个方法,那么我的requiresensures就不再被验证了,尽管对被调用的函数添加了相同的约束。

我被要求只使用requiresensuresinvariantloop_invariant

以下是代码:

代码语言:javascript
复制
  /*@ non_null @*/ int[] elements;
  int n;
  //@ invariant n >= 0;
  
  //@ requires input != null;
  //@ requires input.length >= 0;
  //@ ensures elements != null;
  Class(int[] input) {
    n = input.length;
    elements = new int[n];
    arraycopy(input, 0, elements, 0, n);
    //@ assert n >= 0;
  }
  
  //@ requires srcOff >= 0;
  //@ requires destOff >= 0;
  //@ requires length >= 0;
  //@ requires dest.length >= destOff + length;
  //@ requires src.length >= srcOff + length;
  //@ ensures dest.length == \old(dest.length);
  //@ ensures length == \old(length) ==> length >= 0;
  //@ ensures dest != null;
  private static void arraycopy(/*@ non_null @*/ int[] src,
                                int   srcOff,
                                /*@ non_null @*/ int[] dest,
                                int   destOff,
                                int   length) {
     
     //@ loop_invariant destOff+i >= 0;
     //@ loop_invariant srcOff+i >= 0;
     //@ loop_invariant length >= 0;
     for(int i=0 ; i<length; i=i+1) {
        dest[destOff+i] = src[srcOff+i];
    }
  }

和产出:

代码语言:javascript
复制
Class.java:25: warning: The prover cannot establish an assertion (NullField) in method Class
  /*@ non_null @*/ int[] elements;
                         ^
Class.java:32: warning: The prover cannot establish an assertion (InvariantExit: MultiSet.java:27: ) in method Class
  Class(int[] input) {
  ^
Class.java:27: warning: Associated declaration: Class.java:32: 
  //@ invariant n >= 0;
      ^
3 warnings

一种解决方案是使函数arraycopy是非静态的,但我不明白为什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-24 13:11:14

验证程序无法确定类变量是否发生变化,因为函数在nelements上具有可见性。因此,它应该需要一个注释,如

代码语言:javascript
复制
//@ ensures n == \old(n)
//@ ensures elements == \old(elements)

这是一个有两个不同原因的问题:

在Java中的

  1. 静态方法不能访问非静态变量的值,因此以下规范不能被JML所证明(显示工具的限制)。

代码语言:javascript
复制
// ...
//@ ensures n == \old(n)
//@ ensures elements == \old(elements)
private static void arraycopy( /* ... */ ) {

arraycopy.的

  1. 第二ensures可能引起一些问题,给elements作为src的论证

为了避免修改函数签名,需要在每次调用assume函数之后添加arraycopy规范。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65274277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档