Nội dung của Bài giảng Đặc tả hình thức Chương 11 được trình bày như sau: Cấu trúc của ESC/Java2, chạy ESC/Java2, Platform được hỗ trợ, ứng dụng dựa vào môi trường có, các tùy chọn dòng lệnh, Các file đặc tả,...Mời các bạn cùng tham khảo!
Trang 1LOGO
Đặc tả hình thức
Nguyễn Thị Minh Tuyền
Giới thiệu về ESC/Java2 Cách sử dụng và thuộc tính
Trang 2v ESC/Java
§ Extended Static Checker for Java
Trang 3Cấu trúc của ESC/Java2
§ Một pha kiểm tra cú pháp
§ Một pha typechecking (kiểm tra loại và cách sử dụng)
§ Một pha kiểm tra tĩnh ( diễn giải để tìm ra các lỗi tìm tàng) – chạy một prover behind-the-scenes gọi là Simplify
ra các cảnh báo hoặc lỗi
Trang 4Chạy ESC/Java2
§ http://www.kindsoftware.com/products/opensource/
ESCJava2/download.html
§ Chạy công cụ bằng lệnh
§ Sử dụng Eclipse plug-in
§ Hướng dẫn cài đặt:
http://kindsoftware.com/products/opensource/
ESCJava2/
Trang 5Platform được hỗ trợ
§ Linux
§ MacOSX
§ Cygwin on Windows
§ Windows (nhưng vẫn còn một số vấn đề về môi
trường cần được giải quyết)
§ Solaris
Trang 6Môi trường
§ Một prover Simplify chạy được trên môi trường sử
dụng ESC/Java2, thường là cùng đường dẫn với file jar của ứng dụng
§ Biến môi trường SIMPLIFY thiết lập tên của file thực thi cho môi trường này
§ Tập các đặc tả cho các file hệ thống Java, mặc định được bundle vào trong file jar của ứng dụng, nhưng cũng nằm trong jmlspecs.jar
§ Các script cần biến môi trường
ESCTOOLS_RELEASE được thiết lập tới đường dẫn chứa bản release
Trang 7Các tùy chọn dòng lệnh
v Một số thông số trên dòng lệnh là tùy chọn hoặc các tham số hoặc là đầu vào Các tùy chọn thông dụng
nhất được sử dụng là:
§ -help - prints a usage message
§ -quiet - turns off informational messages (e.g progress messages)
§ -nowarn - turns off a warning
§ -classpath - sets the path to find referenced classes [best if it
contains ‘.’]
§ -specs - sets the path to library specification files
§ -simplify - provides the path to the simplify executable
§ -f - the argument is a file containing command-line arguments
§ -nocheck - parse and typecheck but no verification
§ -routine - restricts checking to a single routine
§ -eajava , -eajml - enables checking of Java assertions
§ -counterexample - gives detailed information about a warning
Trang 8Đầu vào
được kiểm tra Nhiều lớp khác có thể được tham chiếu cho các định nghĩa
lớp hoặc các đặc tả - những lớp này
được tìm thấy trong classpath (hoặc
sourcepath hoặc specspath)
đường dẫn hiện tại)
đối với đường dẫn hiện tại)
Trang 9Các file đặc tả
các file java
các file đặc tả
§ Không có cài đặt của phương thức
§ Không có khởi tạo field
§ Hậu tố bắt buộc: refines-java
§ Yêu cầu một annotation refines
§ Cũng phải nằm trong classpath
Trang 10Ví dụ về file đặc tả
package java.lang;
import java.lang.reflect.*;
import java.io.InputStream;
public final class Class implements java.io.Serializable {
private Class();
/*@ also public normal_behavior
@ ensures \result != null && !\result.equals("")
@ && (* \result is the name of this class object *);
@*/
public /*@ pure @*/ String toString();
Trang 11
Demo
v Ví dụ Bag
Trang 12modular reasoning
thức đơn lẻ Vì thế, trong
class A{
byte[] b;
public void n() { b = new byte[20]; } public void m() { n();
b[0] = 2;
}
dereference null ở đây, thậm chí ta có thể
thấy rằng điều đó không xảy ra
Trang 13modular reasoning
v Để dừng cảnh bảo của ESC/Java2 : thêm
một điều kiện sau
class A{
byte[] b;
//@ ensures b != null && b.length = 20;
public void n() { b = new byte[20]; } public void m() { n();
b[0] = 2;
}
v Vì vậy: thuộc tính liên quan của phương
thức phải được chỉ ra rõ ràng
v Các lớp con override các phương thức phải
Trang 14modular reasoning
b[0]=2 trong
class A{
byte[] b;
public void A() { b = new byte[20]; } public void m() { b[0] = 2;
}
mạo, dù điều này có thể khó hơn
trong ví dụ trước: ta sẽ phải xem xét tất cả các khởi tạo và tất cả các
phương thức
Trang 15modular reasoning
v Để không còn cảnh báo ESC/Java2: ta thêm một bất biến
class A{
byte[] b;
//@ invariant b != null && b.length == 20;
// or weaker property for b.length ?
public void A() { b = new byte[20]; } public void m() { b[0] = 2;
} v Vì vậy: các thuộc tính liên quan phải được
chỉ rõ
v Các lớp con phải bảo toàn các thuộc tính
Trang 16assume
v Thay vì dừng cảnh báo ESC/Java2: thêm một giả định:
//@ assume b != null && b.length > 0;
b[0] = 2;
v Đặc biệt hữu ích trong quá trình phát triển, khi ta vẫn còn đang cố gắng tìm ra các giả định bị che lấp, hoặc khi độ mạnh để suy diễn của ESC/
Java2 quá yếu
v (requires có thể được hiểu như một hình thức của
assume)
Trang 17cần có các mệnh đề assignable
class A{
byte[] b;
public void m() {
b = new byte[3];
//@ assert b[0] == 0; // ok!
o.n( );
//@ assert b[0] == 0; // ok?
}
tra assert thứ hai?
Trang 18cần có các mệnh đề assignable
class A{
byte[] b;
public void m() {
b = new byte[3];
//@ assert b[0] == 0; // ok!
o.n(b);
//@ assert b[0] == 0; // ok?
}
trong điều kiện sau rằng b[0] vẫn là 0
Trang 19cần có các mệnh đề assignable
class A{
byte[] b;
public void m() {
b = new byte[3];
//@ assert b[0] == 0; // ok!
o.n();
//@ assert b[0] == 0; // ok?
}
§ Nếu điều kiện sau của o.n không cho ta biết b không null – và không thể mong đợi điều đó – ta cần mệnh đề assignable để nói rằng o.n sẽ không ảnh hưởng b[0]
Trang 20LOGO