5.5.2.1 [A * B] n
Việc kiểm chứng giao thức [A * B] n nảy sinh hai vấn đề lớn:
- Thứ nhất: phương thức A và B được gọi liên tiếp nhau (), tức là việc gọi hai phương thức A B phải tạo thành một dãy: A … B … A … B… Vấn đềnày được giải quyết bằng một biến đếm kiểu nguyên num như sau:
o Ban đầu đặt num = 0.
o Trước khi gọi A, kiểm tra num, nếu num != 0 -> báo lỗi
o Sau khi gọi A, tăng num lên 1.
o Sau khi gọi B, giảm numđi 1. Và sau khi giảm n đi 1 kiểm tra num, nếu num != 0 -> báo lỗi.
- Thứ hai: cặp (A B) được gọi đúng n lần.
Việc gọi cặp (A B) đúng n lần nảy sinh ra hai trường hợp: gọi lớn hơn n
lần và gọi nhỏhơn n lần. Kiểm tra cặp A, B gọi đúng lớn hơn n lần rất đơn
giản, ta cũng dùng một biến kiểu nguyên khác để kiểm tra (ví dụ: biến int count):
o Sau khi gọi A, tăng biến count lên 1 và kiểm tra, nếu count > n thì báo lỗi.
o Ở đây ta chỉ cần kiểm tra A có được gọi > n lần hay không mà không cần kiểm tra B vì nếu A đã được gọi > n lần thì ta đã bắt được lỗi và nếu A và B được gọi với số lần khác nhau, ta cũng đã b ắt được lỗi bằng biến numởtrên. Như vậy chỉ cần kiểm tra A là đủ.
Kiểm tra (A B) được gọi < n lần khó khăn hơn, ta không thể dùng các join point tại các phương thức A và B kiểm tra được mà phải dùng một join point khác là điểm mà sau khi tất cả các hàm A, B
được gọi. Để đơn giản, tôi tạo ra một phương thức mới trong mã nguồn của chương trình (void checkAnBn()). Phương thức này không
ảnh hưởng gì đ ến chương trình, nó đư ợc gọi ở điểm kết thúc của
chương trình. Sau khi tạo được một join point tại điểm kết thúc của
chương trình thì việc kiểm tra A có được gọi n lần hay không tôi cũng dùng chính ngay biến count ởtrên để kiểm tra. Before advice sẽ
kiểm tra xem, nếu count != n thì sẽ báo lỗi.
Quay trở lại, ta có thể thấy việc tạo ra một phương thức mới làm
54
liên quan tới việc gọi hàm A đúng n lần. Trong công cụ PVG tôi sử
dụng cảhai cách đã được chỉ ra ở trên.
5.5.2.2 [A B] n
[A B] n là mở trường hợp đặc biệt của [A * B] n khi * = null. Ở đây, ta phải gọi
hai phương thức A, B theo một cặp (A B). Để kiểm chứng giao thức [A B] n ta cũng kế
thừa từ thuật toán kiểm chứng giao thức [A * B] n, và mở rộng thêm một phần kiểm tra gọi hai phương thức A, B theo cặp (A B).
Để làm được điều này, ta phải bắt được tất cả các điểm gọi hàm khác. Khi bắt
được tất cảcác điểm gọi hàm khác thì việc kiểm tra vi phạm sẽ rất đơn giản, ta chỉ cần dùng một biến check kiểu nguyên. Mỗi khi chương trình g ọi hàm, biến check được
tăng lên 1. Sau khi chương trình gọi hàm A, biến check được đặt lại giá trị = 0. Và ta sẽ kiểm tra sau khi gọi hàm B, nếu biến check != 1 thì chương trình sẽ báo lỗi. Vì nếu
check != 1 thì tức là đã có một hàm khác được gọi ở giữa A và B.
5.5.3 Sinh mã aspect kiểm chứng giao thức (AB)n
Phương pháp này có ý tưởng hoàn toàn giống với phương pháp sinh aspect kiểm chứng từ biểu đồ UML, nó chỉ khác nhau ở các mẫu aspect được định nghĩa khác
nhau. Đầu tiên là phân tích chuỗi [A * B] n lấy ra các phương thức A, B và biến n. Sau
đó dùng các phương thức xử lý xâu ký tự, tách các hàm A, B này ra thành các phần: tên hàm, kiểu giá trị trả về, tham số… giống như khi xử lý tạo ra aspect từ biểu đồ UML. Sau đó tạo ra các aspect theo mẫu đã định nghĩa trước.
5.6 Kết luận
Trong chương này, tôi đã trình bày phương pháp tựđộng sinh mô-đun aspect từ
FSM mô tả biểu đồ UML. Nội dung chính của phương pháp chính là duyệt các trạng thái trong FSM, phân tích vào các vị trí thích hợp trong xâu aspect mẫu được khai báo từ trước. Xâu aspect mẫu sẽ tuân theo cú pháp của một aspect cơ bản, bao gồm tên
aspect, vùng pointcut và vùng advice. Thuật toán duyệt các trạng thái trong máy trạng thái thực chất là việc duyệt các key của FSM, lấy dữ liệu của từng trạng thái, sử dụng
các phương thức thao tác với xâu ký tự để tạo ra các aspect. Đồng thời, tôi đưa ra phương pháp kiểm chứng giao thức (AB)n – một mở rộng cho công cụ PVG có thể
kiểm chứng giao thức (AB)n.
Kết quả thu được sau bước này là mã aspect. Mã aspect này sẽ được đan vào chương trình chính để thực hiện chức năng kiểm chứng chương trình.
55
Chương 6. Thực nghiệm
Để minh họa cho phương pháp xây dựng công cụ sinh aspect được giới thiệu
trong các chương trước, chương này sẽ mô tả chi tiết các bước cài đặt mà tôi đã thực hiện và kết quả thực hiện kiểm chứng trên một số giao thức thực tế.