Cấu trúc Never Claim

Một phần của tài liệu nghiên cứu về kiểm chứng phần mềm sử dụng công cụ spin (Trang 29 - 31)

4 Kiểm chứng chương trình trong Spin

4.3.Cấu trúc Never Claim

Có những tính chất mà ta mong muốn nó không bao giờ đƣợc xuất hiện trong hệ thống. Trong Promela nó đƣợc biểu diễn bởi never claim

Ví dụ 4.5

#define A (divisor > 0) never { /* !([] a) */

T0_init: if

:: (! ((A))) -> goto accept_all :: (1) -> goto T0_init

fi; accept_all:

skip }

CHƢƠNG 4: KIỂM CHỨNG CHƢƠNG TRÌNH VỚI SPIN

Ở ví dụ trên hệ thống cần thỏa mãn rằng biến divisor luôn phải lớn hơn 0, do vậy trƣờng hợp ngƣợc lại không bao giờ đƣợc xảy ra hay !(a)luôn phải nhận giá trị false.

Nhãn T0_init đảm bảo trong khi chƣơng trình đƣợc chạy (và sinh ra các trạng thái), cho đến khi nào A còn đúng, lệnh goto thứ hai luôn luôn đƣợc chọn và Spin sẽ liên tục kiểm tra A.

Khi thuật toán của chúng ta là đúng và chƣơng trình không chứa lỗi, Spin sẽ kết thúc sau khi sinh ra tất cả các trạng thái và thông báo không có trạng thái nào vi phạm đƣợc tìm thấy.

Nhƣng nếu chƣơng trình tính toán đến một trạng thái mà ở đó A sai (divisor nhỏ hơn hoặc bằng 0) lệnh goto thứ nhất sẽ đƣợc thực hiện, Spin nhảy tới nhãn accept_all

và kết thúc chƣơng trình.

Trong Spin ta chỉ cần biểu diễn tính chất của hệ thống dƣới dạng một biểu thức LTL sau đó đƣa vào Spin, Spin sẽ tự động chuyển biểu thức LTL sang cấu trúc never claim của Promela dùng vào việc kiểm chứng. Trong jSpin ta chỉ cần nhập biểu thức LTL và chạy Translate.

Biểu thức LTL đƣợc lƣu lại trong tệp .prp có tên trùng với tên chƣơng trình. Đoạn

never claim đƣợc Spin lƣu lại trong tệp .ltl

Tính chất ở ví dụ 1.3 đƣợc qua biểu thức

Một phần của tài liệu nghiên cứu về kiểm chứng phần mềm sử dụng công cụ spin (Trang 29 - 31)