class Value { private /*@ spec_public @*/ boolean value; /*@ ensures value == v; @*/ public Value(boolean v) { value = v; } /*@ ensures value == !\old(value); @*/ public void toggle() { value = !value; } /*@ ensures \result == value; @*/ public boolean get() { return value; } } class Broken { /*@ private invariant obj.value == true; @*/ private /*@ non_null @*/ Value obj; public Broken() { obj = new Value(true); } /*@ requires o.value == true; @*/ public Broken(/*@ non_null @*/ Value o) { obj = o; } /*@ ensures \result == true; @*/ public boolean getValue() { return obj.get(); } } public class Invariant1 { public static void main(String[] param) { Value val = new Value(true); Broken broken = new Broken(val); val.toggle(); if (!broken.getValue()) { throw new RuntimeException("ESC/Java is unsound!"); } } }