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
29 trang |
Chia sẻ: phuongt97 | Lượt xem: 504 | Lượt tải: 0
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:
- bai_giang_dac_ta_hinh_thuc_chuong_12_gioi_thieu_ve_escjava2.pdf