JML(The Java Modeling Language)を使ってみました。

JMLを選んだ理由は、「コメントに条件式を書く」というのが気に入ったことと、フリーで開発者が多いことです。
まずはダウンロード。
http://www.cs.iastate.edu/~leavens/JML/index.shtml
http://sourceforge.net/project/showfiles.php?group_id=65346
次に、(jml.dir)/bin/jmlenv.bat 内にあるパスを自分の環境に合わせて変えます。
そして、(jml.dir)/bin をパスに追加します。
適当なプログラムを書いてみます。(意図的にマチガイを埋め込んでいます)

class GCD {

    /*@ requires a>0 && y>0;
     @ ensures a % \result == 0 && b % \result == 0;
     @*/
    public static int gcd(int a, int b) {
        if (b == 0) {
            return a;
        }
        else {
            return gcd(b, a % a);
        }
    }

    public static void main(String[] args) {
        System.out.println(gcd(100,24));    // 4
        System.out.println(gcd(24,24));     // 24
        System.out.println(gcd(23,24));     // 1
        System.out.println(gcd(-32,24));    // ERROR
        System.out.println(gcd(0,24));      // 24
    }
}

契約の書き方が正しいかどうかチェックします。

C:\user\java\test\JML>jml GCD.java

コンパイルし、チェックコードが埋め込まれたクラスファイルを作ります。

C:\user\java\test\JML>jmlc GCD.java

クラスファイルを実行します。

C:\user\java\test\JML>jmlrac GCD

以下が修正したプログラムです。

class GCD {

    /*@ requires a>=0 && b>=0;
     @ ensures a % \result == 0 && b % \result == 0;
     @*/
    public static int gcd(int a, int b) {
        if (b == 0) {
            return a;
        }
        else {
            return gcd(b, a % b);
        }
    }

    public static void main(String[] args) {
        System.out.println(gcd(100,24));    // 4
        System.out.println(gcd(24,24));     // 24
        System.out.println(gcd(23,24));     // 1
//      System.out.println(gcd(-32,24));    // ERROR
        System.out.println(gcd(0,24));      // 24
    }
}

参考
http://www.cs.iastate.edu/~leavens/JML/prelimdesign/prelimdesign_toc.html