Bài giảng Đặc tả hình thức: Chương 10 do Nguyễn Thị Minh Tuyền biên soạn nhằm mục đích phục vụ cho việc giảng dạy. Nội dung bài giảng gồm có Giới thiệu về JML, công cụ hỗ trợ cho JML, ESC/Java2: Cách sử dụng và thuộc tính, ESC/Java2: các cảnh báo, một số chỉ dẫn về đặc tả và điểm yếu, JML nâng cao.
Trang 1LOGO
Đặc tả hình thức
Nguyễn Thị Minh Tuyền
Giới thiệu về Java Modeling Language
Trang 3Java Modeling Language
v Java Modeling Language (JML)
§ http://www.eecs.ucf.edu/~leavens/JML/index.shtml
v Tài liệu:
§ http://www.kindsoftware.com/products/opensource/ESCJava2/docs.html
v Ngôn ngữ đặc tả hình thức cho Java
§ đặc tả hành vi của các lớp trong Java
§ ghi lại các quyết định về thiết kế và cài đặt
bằng cách thêm vào trong mã nguồn Java các assertion
§ điều kiện trước (pre-condition)
§ điều kiện sau (post-condition)
§ bất biến (invariant)
v Mục tiêu: người lập trình Java nào cũng có thể
sử dụng dễ dàng
Trang 4Đặc tả hình thức
v JML assertion được thêm vào dưới
dạng các chú thích trong file java
Trang 5Điều kiện trước và sau (pre- và post-condition)
v Điều kiện trước của một phương thức
là điều kiện phải đúng trước khi gọi
phương thức đó
v Điều kiện sau của một phương thức là điều kiện phải đúng khi nó kết thúc
phương thức trả về bình thường, nghĩa là không có
ngoại lệ Sử dụng từ khóa ensures
Sử dụng từ khóa signals
Trang 6v Ở đây, \old(balance) chỉ đến giá trị của
balance trước khi thực thi phương thức
debit(int amount)
6
Nguyễn Thị Minh Tuyền
Trang 8Đặc tả hình thức
Design-by-Contract
v Điều kiện trước và sau định nghĩa
ràng buộc (contract) giữa một lớp và client của nó
định điều kiện sau
đảm bảo điều kiện sau
v Ví dụ:
client là đảm bảo rằng giá trị của amount dương
Mệnh đề requires phải làm rõ ràng điều này
8
Nguyễn Thị Minh Tuyền
Trang 9signals (BankException e) &&
amount > balance &&
balance == \old(balance) &&
e.getReason().equals("Amount too big");
@*/
public int debit(int amount) throws BankException
}
Trang 10signals (…)
exceptional (throw)
Trang 11v Các ngoại lệ được đề cập trong mệnh
Để thay đổi điều này, có 3 tùy chọn:
/*@ normal_behavior
requires
ensures
@*/
signals (E) false;
signals_only E1, , E2;
Trang 12Đặc tả hình thức
Bất biến
phải được duy trì trong tất cả các phương
thức
public class Wallet {
public static final short MAX_BAL = 1000;
private short balance;
@*/
và sau Bất biết cũng phải được bảo toàn
nếu có ngoại lệ
12
Nguyễn Thị Minh Tuyền
Trang 13Bất biến
kế
public class Directory {
private File[] files;
files != null
&&
(\forall int i; 0 <= i && i < files.length;
; files[i] != null &&
files[i].getParent() == this);
@*/
}
cho việc hiểu rõ mã nguồn
Trang 14Đặc tả hình thức
non_null
v Nhiều bất biến, điều kiện trước và sau
là các tham chiếu không null Sử dụng
điều này
public class Directory {
private /*@ non_null @*/ File[] files;
void createSubdir( /*@ non_null @*/ String name){
Trang 15assert
v Mệnh đề assert đặc tả một thuộc tính phải đúng tại một điểm trong mã
Trang 16Đặc tả hình thức
assert
v Từ khóa assert cũng có trong Java (từ phiên bản Java 1.4) Tuy nhiên, assert trong JML giàu ngữ nghĩa hơn
Trang 18Đặc tả hình thức
pure
v Một phương thức mà không có hiệu
ứng phụ gọi là pure
public /*@ pure @*/ int getBalance(){
Trang 21thời điểm biên dịch
§ ESC/Java2
Trang 22Đặc tả hình thức
Kiểm tra assertion tại thời gian thực thi
v Trình biên dịch jmlrac được viết bởi
Gary Leavens, Yoonsik Cheon và các
cộng sự tại Iowa State University
trong khi thực thi, tất cả các assertion được kiểm tra
và bất kỳ vi phạm nào của assertion đều sinh ra một lỗi
tắc kiểm thử hiện có
tính được kiểm tra, tại nhiều vị trí trong mã nguồn
22
Nguyễn Thị Minh Tuyền
Trang 23Kiểm tra assertion tại thời gian thực thi
v jmlrac có thể phát sinh các mã kiểm
tra phức tạp Ví dụ:
signals ( Exception ) balance == \old (balance);
@*/
public int debit(int amount) { }
v Kiểm tra rằng nếu debit throws một
ngoại lệ, balance không thay đổi và
bất biến vẫn đúng
Trang 24Đặc tả hình thức
Kiểm tra tĩnh mở rộng
chương trình tự động một cách đầy đủ, với một số thỏa hiệp để đạt được sự tự động một cách đầy đủ
dịch, hoàn toàn tự động
tốt (ví dụ như Null-, ArrayIndexOutOfBounds-, ClassCast-) và kiểm tra một số thuộc tính đơn giản
24
Nguyễn Thị Minh Tuyền
Trang 25v ESC/Java có thể thất bại trong việc tạo ra các cảnh báo về chương trình không đúng
public class Positive{
public void increase(){ n++; }
}
increase sẽ phá vỡ điều kiện trong bất biến, chẳng hạn với
Trang 26Đặc tả hình thức
Kiểm tra tĩnh và kiểm tra tại thời
gian thực thi
tra đặc tả tại thời điểm thực thi
thử tại thời gian thực thi chỉ đúng với bộ test,
và sau của các phương thức và các bất biến cần thiết cho
việc kiểm định
26
Nguyễn Thị Minh Tuyền
Trang 27Các công cụ JML khác
(trong khi ESC/Java2 chỉ nhắm đến việc kiểm định hoàn
toàn tự động) và vì vậy có thể chứng minh các thuộc tính phức tạp
State)
Trang 28LOGO