Bài giảng Đặc tả hình thức - Chương 12: Giới thiệu về ESC/Java2-Thủ thuật và cạm bẫy - Nguyễn Thị Minh Tuyền

Nội dung

1. Đặc tả thừa kế

2. Aliasing

3. Object invariants

4. Giả thuyết không nhất quán

5. Exposed references

6. \old

7. Viết đặc tả thế nào

pdf29 trang | Chia sẻ: phuongt97 | Lượt xem: 504 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Bài giảng Đặc tả hình thức - Chương 12: Giới thiệu về ESC/Java2-Thủ thuật và cạm bẫy - Nguyễn Thị Minh Tuyền, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
LOGO Đặc tả hình thức Nguyễn Thị Minh Tuyền 1 Giới thiệu về ESC/Java2 Thủ thuật và cạm bẫy Nội dung slide này được dịch từ các slide của David Cok, Joe Kiniry, Eric Poll Đặc tả hình thức Nội dung 1.   Đặc tả thừa kế 2.   Aliasing 3.   Object invariants 4.   Giả thuyết không nhất quán 5.   Exposed references 6.   \old 7.   Viết đặc tả thế nào 2 Nguyễn Thị Minh Tuyền Đặc tả hình thức Nội dung 1.   Đặc tả thừa kế 2.   Aliasing 3.   Object invariants 4.   Giả thuyết không nhất quán 5.   Exposed references 6.   \old 7.   Viết đặc tả thế nào 3 Nguyễn Thị Minh Tuyền Đặc tả hình thức Behavioural subtyping v Giả sử rằng Child mở rộng từ Parent §  Behavioural subtyping = các đối tượng từ lớp con Child ứng xử giống các đối tượng từ lớp cha Parent. §  Nguyên tắc: mã nguồn sẽ ứng xử như mong đợi nếu ta khai báo một đối tượng Child trong đó một đối tượng Parent đã được cài đặt như mong đợi. 4 Nguyễn Thị Minh Tuyền Đặc tả hình thức Behavioural subtyping v Một số ràng buộc bởi behavioural subtyping: §  Bất biến trong lớp con mạnh hơn bất biến trong lớp cha. §  Đối với mỗi phương thức: •  Điều kiện trước trong lớp con yếu hơn điều kiện trước trong lớp cha •  Điều kiện sau trong lớp con mạnh hơn điều kiện sau trong lớp cha. v JML đạt được behavioural subtyping bằng kế thừa đặc tả: bất cứ lớp con nào cũng kế thừa đặc tả từ lớp cha của nó. 5 Nguyễn Thị Minh Tuyền Đặc tả hình thức Kế thừa đặc tả cho bất biến v Bất biến được kế thừa từ các lớp con. v Ví dụ: class Parent { ... //@ invariant invParent; ... } class Child extends Parent { ... //@ invariant invChild; ... } bất biến cho Child là invChild && invParent. 6 Nguyễn Thị Minh Tuyền Đặc tả hình thức Kế thừa đặc tả cho đặc tả của phương thức class Parent { /*@ requires i >= 0; ensures \result >= i; @*/ int m(int i){ ... } } class Child extends Parent { /*@ also requires i <= 0; ensures \result <= i; @*/ int m(int i){ ... } } Từ khóa also chỉ ra rằng các đặc tả được kế thừa. 7 Nguyễn Thị Minh Tuyền Đặc tả hình thức Kế thừa đặc tả cho đặc tả của phương thức v Phương thức m trong Child cũng cần phải thỏa mãn đặc tả trong lớp Parent. Vì thế đặc tả đầy đủ cho Child là /*@ requires i>=0; ensures \result>=i; also requires i <=0 ensures \result<=i; @*/ int m(int i){ ... } } Kết quả của m(0) là gì? 8 Nguyễn Thị Minh Tuyền Đặc tả hình thức Kế thừa đặc tả cho đặc tả của phương thức v Đặc tả này của Child tương đương với class Child extends Parent { /*@ requires i=0; ensures \old(i >= 0) ==> \result >= i; ensures \old(i \result <= i; @*/ int m(int i){ ... } } 9 Nguyễn Thị Minh Tuyền Đặc tả hình thức Đặc tả thừa kế v Hai Object là == thì cũng luôn luôn equals. Nhưng ngược lại thì không nhất thiết phải đúng. Nó đúng cho các đối tượng mà kiểu động là Object. public class Object { //@ ensures (this == o) ==> \result; /*@ ensures \typeof(this) == \type(Object) ==> (\result == (this==o)); */ public boolean equals(Object o); } 10 Nguyễn Thị Minh Tuyền Đúng cho tất cả các Object Không nhất thiết đúng cho tất cả các subtype Đặc tả hình thức Đặc tả thừa kế v Đặc tả lớp cơ sở áp dụng cho các lớp con §  ESC/Java2 tuân theo behavioral subtyping §  Đặc tả từ các giao diện được cài đặt cũng phải thỏa mãn các lớp cài đặt. v Giữ lại \typeof(this) == \type(...) nếu cần. v Các giới hạn trên các ngoại lệ như normal_behavior hoặc signal (E e) false; cũng sẽ được áp dụng cho các lớp được dẫn xuất nữa. 11 Nguyễn Thị Minh Tuyền Đặc tả hình thức Nội dung 1.   Đặc tả thừa kế 2.   Aliasing 3.   Object invariants 4.   Giả thuyết không nhất quán 5.   Exposed references 6.   \old 7.   Viết đặc tả thế nào 12 Nguyễn Thị Minh Tuyền Đặc tả hình thức Aliasing v Một vấn đề phổ biến nhưng không dễ thấy gây ra các vi phạm về bất biến là aliasing. public class Alias { /*@ non_null */ int[] a = new int[10]; boolean noneg = true; /*@ invariant noneg ==> (\forall int i; 0=0); */ //@ requires 0<=i && i < a.length; public void insert(int i, int v) { a[i] = v; if (v < 0) noneg = false; } } tạo ra Alias.java:12: Warning: Possible violation of object invariant (Invariant) }ˆ Associated declaration is “Alias.java", line 5, col 6: /*@ invariant noneg ==> (\forall int i; 0<=i && i <a.length; ... 13 Nguyễn Thị Minh Tuyền Đặc tả hình thức Aliasing v Một ngữ cảnh phản ví dụ đầy đủ (sử dụng tùy chọn –counterexample) sinh ra, giữa nhiều thông tin khác: brokenObj%0 != this (brokenObj%0).(a@pre:2.24) == tmp0!a:10.4 this.(a@pre:2.24) == tmp0!a:10.4 v đó là, this và một số đối tượng khác (brokenObj) chia sẻ cùng một đối tượng. 14 Nguyễn Thị Minh Tuyền int noneg int[] a this brokenObj int noneg int[] a một đối tượng int[] Đặc tả hình thức Aliasing v  Để sửa điều này, khai báo rằng a chỉ được sở hữu bởi đối tượng cha của nó (owner là một trường ghost của java.lang.Object). public class Alias { /*@ non_null */ int[] a = new int[10]; boolean noneg = true; /*@ invariant noneg ==> (\forall int i; 0=0); */ //@ invariant a.owner == this; //@ requires 0<=i && i < a.length; public void insert(int i, int v) { a[i] = v; if (v < 0) noneg = false; } public Alias() { //@ set a.owner = this; } } 15 Nguyễn Thị Minh Tuyền this int noneg int[] a brokenObj int noneg int[] a một đối tượng int[] int[] .... owner một đối tượng int[] int[] .... owner Đặc tả hình thức Aliasing v Một ví dụ khác. Thất bại ở điều kiện sau. public class Alias2 { /*@ non_null */ Inner n = new Inner(); /*@ non_null */ Inner nn = new Inner(); //@ invariant n.owner == this; //@ invariant nn.owner == this; //@ ensures n.i == \old(n.i + 1); public void add() { n.i++; nn.i++; } Alias2(); } class Inner { public int i; //@ ensures i == 0; Inner(); } 16 Nguyễn Thị Minh Tuyền Đặc tả hình thức v Ngữ cảnh phản ví dụ chỉ ra rằng this.(nn:3.24) == tmp0!n:10.4 tmp2!nn:11.4 == tmp0!n:10.4 v n và nn được tham chiếu từ cùng một đối tượng. v Nếu ta thêm bất biến //@ invariant n != nn; để ngăn aliasing giữa hai trường này thì mọi thứ đều ok. 17 Nguyễn Thị Minh Tuyền Đặc tả hình thức Aliasing v Aliasing là một khó khăn lớn trong kiểm định. v Quản lý aliasing là một lĩnh vực nghiên cứu năng động, liên quan đến quản lý các frame condition. v Các trường owner này tạo ra một hình thức đóng gói có thể được kiểm tra bởi ESC/Java để điều khiển cái gì có thể thay đổi bởi một thao tác cho sẵn. 18 Nguyễn Thị Minh Tuyền Đặc tả hình thức Nội dung 1.   Đặc tả thừa kế 2.   Aliasing 3.   Object invariants 4.   Giả thuyết không nhất quán 5.   Exposed references 6.   \old 7.   Viết đặc tả thế nào 19 Nguyễn Thị Minh Tuyền Đặc tả hình thức Viết các object invariant v Đảm bảo rằng các bất biến của lớp là về đối tượng. v Các phát biểu về tất cả các đối tượng của một lớp có thể đúng nhưng khó chứng minh, đặc biệt là đối với các công cụ chứng minh tự động. v Ví dụ, nếu có một vị từ P được giả sử là đúng cho các đối tượng có kiểu T, thì không viết: //@ invariant (\forall T t; P(t)); v Thay vào đó, viết: //@ invariant P(this); Cách viết thứ 2 sẽ làm cho điều kiện sau dễ chứng minh ở hàm khởi tạo. 20 Nguyễn Thị Minh Tuyền Đặc tả hình thức Các giả sử trái ngược nhau v Nếu ta đặc tả trái ngược nhau thì ta chứng minh gì cũng đúng. public class Inconsistent { public void m() { int a,b,c,d; //@ assume a == b; //@ assume b == c; //@ assume a != c; //@ assert a == d; // Passes, but inconsistent //@ assert false; // Passes, but inconsistent } } 21 Nguyễn Thị Minh Tuyền Đặc tả hình thức v Một ví dụ khác: public class Inconsistent2 { public int a,b,c,d; //@ invariant a == b; //@ invariant b == c; //@ invariant a != c; public void m() { //@ assert a == d; // Passes, but inconsistent //@ assert false; // Passes, but inconsistent } } 22 Nguyễn Thị Minh Tuyền Đặc tả hình thức Exposed references v  Vấn đề có thể phát sinh khi tham chiếu đến một đối tượng bên trong được export từ một lớp: public class Exposed { /*@ non_null */ private int[] a = new int[10]; //@ invariant a.length > 0 && a[0] >= 0; //@ ensures \result != null; //@ ensures \result.length > 0; //@ pure public int[] getArray() { return a; } } class X { void m(/*@ non_null */ Exposed e) { e.getArray()[0] = -1; // unchecked invariant violation } } §  ESC/Java không kiểm tra rằng mọi đối tượng được cấp phát bộ nhớ vẫn thỏa mãn các bất biến của nó. §  Các vấn đề tương tự có thể giải quyết nếu các trường public được thay đổi trực tiếp. 23 Nguyễn Thị Minh Tuyền Đặc tả hình thức Nội dung 1.   Đặc tả thừa kế 2.   Aliasing 3.   Object invariants 4.   Giả thuyết không nhất quán 5.   Exposed references 6.   \old 7.   Viết đặc tả thế nào 24 Nguyễn Thị Minh Tuyền Đặc tả hình thức \old v \old được dùng để chỉ giá trị ở trạng thái trước trong một biểu thức điều kiện sau. v Xem xét đặc tả §  public static native void arraycopy(Object[] src, int srcPos, Object[] dest, int destPos, int length); v Thử: §  ensures (\forall int i; 0<=i && i<length; dest[destPos +i] == src[srcPos+i]); Sai! §  ensures (\forall int i; 0<=i && i<length; dest[destPos +i] == \old(src[srcPos+i]); 25 Nguyễn Thị Minh Tuyền Đặc tả hình thức v Trong điều kiện sau: §  ensures (\forall int i; 0<=i && i<length; dest[destPos+i] == \old (src[srcPos+i]); §  public static native void arraycopy(Object[] src, int srcPos, Object[] dest, int destPos, int length); v Tại sao ta không viết \old(length) thay vì length? v Và \old(dest)[...] thay vì dest[...]? v Bất cứ một tham số x nào trong điều kiện sau đều có nghĩa là \old(x). v Điều này nghĩa là không thể chỉ đến giá trị mới của length trong điều kiện sau của arraycopy.Nhưng giá trị này không thấy bởi client. 26 Nguyễn Thị Minh Tuyền Đặc tả hình thức Nội dung 1.   Đặc tả thừa kế 2.   Aliasing 3.   Object invariants 4.   Giả thuyết không nhất quán 5.   Exposed references 6.   \old 7.   Viết đặc tả thế nào 27 Nguyễn Thị Minh Tuyền Đặc tả hình thức v  Đối với mỗi trường: §  có bất biến nào cho trường này không? v  Đối với mỗi tham chiếu trường: §  có nên thêm non_null không? §  có nên có một trường owner để thiết lập cho nó hay không? v  Đối với mỗi phương thức? §  phương thức đó có nên là pure hay không? các tham số và kết quả có nên non_null hay không? v  Đối với mỗi lớp: bất biến nào thể hiện tính nhất quán của dữ liệu bên trong? v  Thêm điều kiện trước và điều kiện sau đề giới hạn đầu vào và đầu ra của mỗi phương thức. v  Thêm các ngoại lệ không được kiểm tra cho các mệnh đề throws. v  Bắt đầu với các đặc tả đơn giản, thực hiện phức tạp dần lên khi chúng có giá trị. 28 Nguyễn Thị Minh Tuyền Đặc tả hình thức v Tách rời các phép nối để lấy thông tin về các phép nối bị vi phạm. Sử dụng requires A; requires B; và không dùng requires A && B; v Sử dụng các phát biểu assert để tìm ra cái gì đang bị sai. v Sử dụng assume về điều bạn biết là đúng để hỗ trợ cho việc chứng minh. 29 Nguyễn Thị Minh Tuyền

Các file đính kèm theo tài liệu này:

  • pdfbai_giang_dac_ta_hinh_thuc_chuong_12_gioi_thieu_ve_escjava2.pdf