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
mã 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