Ngữ nghĩa của các công thức Separation Heap được trình bày tương tự như ngữ nghĩa của lý thuyết Separation Logic, tuy nhiên có một sự mở rộng trong việc sử dụng vị từ Shape User-defined.
Để định nghĩa mô hình ngữ nghĩa, sử dụng các ký hiệu sau đây:
# Ký hiệu Ý nghĩa
1 Loc Tập địa chỉ, có giá trị dương.
2 Val Tập giá trị, với thể hiện giá trị null.
3 Var Tập biến bao gồm biến chương trình và các biến logic.
4 ObjVal
Tập giá trị của đối tượng được lưu trữ trong Heap.
Trong đó thể hiện giá trị của đối
tượng có kiểu dữ liệu là c và giá trị hiện tại của các
trường tương ứng là .
5
Thể hiện cho mô hình quan hệ, Stack s và Heap h thỏa
mãn điều kiện ràng buộc
Bảng4 - Ký hiệu định nghĩa mô hình Định nghĩa miền qua hệ giữa các đối tượng như sau:
Từ công thức trên có thể thấy rằng, mỗi một Heap thể hiện một phần ánh xạ hữu hạn, trong khi đó Stack thể hiện tổng số ánh xạ, điều này tương tự như lý thuyết
Separation Logic thuần túy.Hàm trả lại kết quả là miền giá trị của hàm
Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang59
ánh xạ với con trỏ, còn trong lý thuyết đặc tả đã trình bày thì nó thể hiện cho dạng
thức .Mô hình quan hệ của các công thức Separation Heap được định nghĩa
như sau:
Bảng sau đây giải thích ý nghĩa của các ký hiệu ngữ nghĩa:
# Ký hiệu Ý nghĩa
1 Quan hệthể hiện rằng công thức thuần túy là luôn
đúng trong s
2 Ký hiệuthể hiện miền của , là tách biệt hay
3
Ký hiệu này thể hiện hai ý nghĩa:
- Nếu c là một dữ liệu Node được định nghĩa trong chương trình, thì h thể hiện cho mộ Heap đơn. -Nếu c là một vị từ Shape được định nghĩa trong chương trình, thì c có thể được định nghĩa đệ quy.
Ngữ nghĩa của nó thể hiện rằng có ít nhất một bộ (s, h) thỏa mãn vị từ định nghĩa.
Bảng5 -Ký hiệu ngữ nghĩa 2.6.2 Tính đúng đắn của quy tắc Verification
Tính đúng đắn của quy tắc Verification được trình bày thông qua tính đúng đắn của từng bước nhỏ khi áp dụng các quy tắc Verification, định nghĩa một trạng
Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang60
Heap h, thì một bước nào đó đã được thực hiện để giảm e thành đồng thời tạo ra
một Stack mới và Heap mới . Sử dụng ký hiệu để thể hiện cho tập các
biến đổi con của các quan hệ biến đổi .
Với một ràng buộc thì Post( ) ghi lại quan hệ giữacác biến thay đổi trong
được định nghĩa như sau:
Trong đó V thể hiện tập các biến chưa thay đổi trong , minh họa bằng ví dụ sau:
Phần tiếp theo trình bày 3 định lý áp dụng cho tính đúng đắn của quy tắc Verification.
Định lý 1 (Preservation)
Nếu tồn tại quan hệ và thỏa
mãn thì
(Tham khảo chứng minh định lý trong tài liệu phụ lục [14]) Định lý 2 (Progress)
Nếu tồn tại quan hệ và thì e là một giá trị đồng thời tồn tại thỏa mãn
(Tham khảo chứng minh định lý trong tài liệu phụ lục [14]) Định lý 3 (Safety)
Giả sử không gian của Stack và Heap là không giới hạn và có quan hệ⊢ {true} e
{∆} khi đó biến đổi dừngvới giá trị v trong hậu điều kiện ∆ hoặc
Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang61
(Tham khảo chứng minh định lý trong tài liệu phụ lục [14]) 2.6.3Tính đúng đắn của quy tắc Entailment
Các định lý dưới đây được sử dụng để chứng minh tính đúng đắn và tính dừng của các quy tắc kiểm tra suy diễn (EntailmentChecking) đã trình bày ở phần 2.4.
Định lý 1 (Soundness)
Nếu quá trình kiểm tra suy diễn ∆1⊢∆2 ∗ ∆ là thành công, thì với tất cả các trạng
thái s, h nếu s, h | = ∆1 thì s, h | = ∆2∗ ∆
(Tham khảo chứng minh định lý trong tài liệu phụ lục [14]) Định lý 2(Termination)
Thủ tục kiểm tra suy diễn ∆1⊢∆2∗ ∆ luôn có tình dừng.
(Tham khảo chứng minh định lý trong tài liệu phụ lục [14]) 2.7 Kết luận chương
Trong chương 2 luận văn tập trung tìm hiểu nền tảng xây dựng lên lý thuyết Separation Logic, trong đó nhấn mạnh vào sự kế thừa và mở rộng từ Hoare Logic. Sau đó luận văn trình bày về một kỹ thuật đặc tả chương trình dựa trên lý thuyết Separation Logic và các quy tắc ứng dụng kỹ thuật này phục vụ cho việc suy diễn kiểm định chương trình tự động, cũng như tính đúng đắn của mô hình suy diễn. Phần lý thuyết của chương 2 là nền tảng cơ sở cho việc tìm hiểu công cụ kiểm địnhchương trình tự động HIP/SLEEK sẽ được trình bày ở chương kế tiếp.
Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang62
CHƯƠNG3. CÀI ĐẶT THỬ NGHIỆM CÔNG CỤ KIỂM ĐỊNH TỰ ĐỘNG ỨNG DỤNG SEPARATION LOGIC
Nội dung chương 3:
Trình bày kiến trúc và hoạt động của công cụ kiểm định tự động HIP/SLEEK ứng dụng lý thuyết suy diễn chương trình của Separation Logic.
Trình bày kiểm định một số cấu trúc dữ liệu với công cụ HIP/SLEEK và kết quả thực nghiệm ứng dụng thực tế.
3.1 Phương hướng cài đặt thử nghiệm công cụ kiểm định tự động ứng dụng Separation logic Separation logic
Để thực hiện việc cài đặt thử nghiệm lý thuyết đặc tả chương trình ứng dụng Separation Logic cho việc kiểm định đặc tả Module chương trình tự động, luận văn lựa chọn công cụ HIP/SLEEK. HIP/SLEEK là công cụ được phát triển bởi nhóm
các tác giả Wei-Ngan Chin, Cristina David, Huu Hai Nguyen, và Shengchao Qin;
đây là công cụ đầu tiên áp dụng lý thuyết đặc tả chương trình ứng dụng Separation Logic để xây dựng hệ thống kiểm định chương trình tự động. Sử dụng ngôn ngữ đặc tả chương trình đã được trình bày trong luận văn, người dùng có thể đặc tả Module chương trình dưới dạng thức Separation Logic; sau đó áp dụng công cụ HIP/SLEEK thực hiện việc kiểm định tính đúng đắn chương trình hoàn toàn tự động.
HIP/SLEEK là hệ thống kiểm tra tính đúng đắn chức năng của chương trình hoàn toàn tự động, thiết kế kiểm định ở mức thấp hệ thống (thư viện)các chương trình thao tác dữ liệu trên bộ nhớ Heap.Hệ thống HIP/SLEEK gồm hai hệ thống nhỏ là HIP và SLEEK. HIP là hệ thống thực hiện việc kiểm định Module chương trình được viết dưới dạng ngôn ngữ đặc tả dựa trên Separation Logic, ngôn ngữ đặc tả cho phép người dùng đặc tả cấu trúc dữ liệu phức tạp thông qua vị từ User-defined, đặc tả này còn có thể bao gồm các rằng buộc liên quan đến bộ nhớ Heap, và các
Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang63
thuộc tính khác của cấu trúc dữ liệu như Size, Bag.HIP sẽ tự động xây dựng lên bộ các công thức cần chứng minh dưới dạng Separation Logic, sau đó sẽ được gửi tới hệ thống SLEEK. SLEEK cung cấp khả năng hoàn toàn tự động thực hiện việc chứng minh công thức Separation Logic dựa trên khả năng suy diễn Frame.
3.2 Kiến trúc của HIP/SLEEK
Tổng quan kiến trúc về hệ thống HIP/SLEEK được mô tả như hình dưới đây:
Hình 5- Tổng quan kiến trúc HIP/SLEEK
Kiến trúc hệ thống HIP/SLEEK gồm hai thành phần chính: Front-End và Back-End.Phần Front-End của hệ thống (HIP), chương trình người dùng sẽ được đặc tả dưới dạng ngôn ngữ đặc tả dựa trên Separation Logic, trong đó người dùng sẽ định nghĩa các vị từ dưới dạng công thức Separation để đặc tả cấu trúc dữ liệu dạng Shape và các thuộc tính cơ bản của nó như Size, Bag. Các thủ tục chương trình và vòng lặp chương trình bắt buộc viết dưới dạng chú thíchmột hoặc nhiều đặc tả tiền điều kiện/hậu điều kiện (Pre/Post Conditions) trước khi thực hiện việc kiểm định tính đúng đắn chương trình.HIP thực hiện việc biến đổi các suy diễn đặc tảdưới dạng công thức thuần túy mà có thể được chứng minhtính đúng đắn bởi SLEEK.
Phần Back-End của hệ thống (SLEEK), hay nói cách khác HIP làm việc dựa trên các chứng minh của SLEEK hoặc HIP thực hiện việc gọi SLEEK hoàn toàn trong suốt với người dùng.SLEEK thực hiện việc chứng minh hoàn toàn tự động cho Separation Logic bởi khả năng suy diễn Frame.SLEEK làm việc với dữ liệu đầu
Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang64
vào là hai trạng thái Heap được biểu diễn dưới dạng thức Separation, sau đó thực hiện việc kiểm tra một công thức (Antecedent) là suy diễn ra công thức còn lại (Consequent).Công thức Antecedent có thể bao hàm nhiều hơn trạng thái Heap của công thức Consequent, chính vì vậy phần trạng thái Heap dư thừa này là thể hiện cho các điều kiện Frame và là kết quả trả lại của quá trình chứng minh.
3.3 Hoạt động của HIP/SLEEK
Trong phần trước đã trình bày về kiến trúc hệ thống HIP/SLEEK, do đó để khai thác được hệ thống này chủ yếu quan tâm đến cách thức làm việc của HIP (Front-End) vì trong quá trình thực hiện kiểm tra suy diễn HIP tự động thực hiện việc gọi đến SLEEK và sử dụng các kết quả trả về để thực hiện công việc kiểm định.
Người dùng muốn làm việc với HIP đầu tiên sẽ thực hiện việc đặc tả mã nguồn chương trình dưới dạng thức mà HIP có thể hiểu được (HIP Input Format), sau đó hệ thống thực hiện việc kiểm định tính đúng đắn của đặc tả và trả lại kết quả của kiểm định, quá trình này được thực hiện hoàn toàn tự động. Kết quả trả lại của hệ thống HIP/SLEEK có thể bao gồm các suy diễn Frame mà hệ thống đã thực hiện trong quá trình kiểm chứng tính đúng đắn của đặc tả.
3.3.1 File đầu vào
Dạng thức dữ liệu đầu vào của HIP (HIP Input Format) những thành phần chính như sau:
-Khai báo kiểu dữ liệu
-Khai báo vị từ Shape và các thuộc tính của nó
-Khai báo các thủ tục và các vòng lặpdưới dạng tiền điều kiện/hậu điều kiện (Pre/Post)
- Thực hiện đặc tả cho các thủ tục của chương trình dưới dạng ngôn ngữ đã trình bày ở chương 2 (ngôn ngữ lập trình mục tiêu).
Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang65
Như đã trình bày trong phần ngôn ngữ lập trình trong chương 2, ngôn ngữ lập trình mục tiêu thể trong luận văn được đề cập tới là ngôn ngữ hướng đối tượngtương tự như các loại ngôn ngữ phổ biến C/C++, Java hay C#... Luận văn thực hiện việc kiểm định cho các File đầu vào sử dụng ngôn ngữ khai báo này để thực hiện đặc tả chương trình.
3.3.2 Kiểu dữ liệu cơ bản
Hệ thống hỗ trợ kiểu dữ liệu cơ bản số int và bool. 3.3.3 Cấu trúc dữ liệu
Cấu trúc dữ liệu được định nghĩa bởi người dùng tùy thuộc vào mức độ phức tạp của dữ liệu người dùng định nghĩa. Ví dụ, để minh họa cho cấu trúc dữ liệu Node với trường dữ liệu kiểu int và một con trỏ trỏ tới Node kế tiếp ta có thể định nghĩa:
data node { int val ; node next }
Dựa trên các thuộc tính của cấu trúc dữ liệu cần mô tả mà người dùng có thể thực hiện việc thể hiện cấu trúc dữ liệu thông qua định nghĩa vị từ Shape với các thuộc tính mong muốn, có thể có thêm các mô tả Size và Bag. Phần tiếp theo sẽ trình bày về cấu trúc công thức vị từ của định dạng HIP.
3.3.4 Định dạng công thức khẳng định
Các công thức khẳng định sử dụng chú thích Separation Logic và được đưa ra dưới dạng thức rời rạc thông thường. Mỗi dạng thức rời rạc gồm có hai phần: công thức Heap (Heap part) và công thức thuần túy (Pure Part). Xem xét ví dụ sau, một Heap Node cơ bản được định nghĩa như sau:
v::node_type<list_of_arguments>
Trong đó v là một con trỏ được trỏ tới Heap Node và list_of_arguments là nội dung của Heap Node. Sử dụng định dạng này có thể khai báo cho những vị từ
Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang66
của đoạn cấu trúc dữ liệu, ví dụ sau thể hiện vị từ là một dang sách độ dài n, khai báo trong HIP có dạng:
list<n> == self=null & n=0 or self::node<_,r> * r::list<n-1> inv n>=0 Công thức trên cho biết danh sách rỗng với n=0 hoặc danh sách được tạo bởi một Node liên kết với một danh sách kích thước n-1. Mỗi vị từ có một công thức mô tả tính bất biến thuần túy của nó, trong vị từ trên công thức thuần túy (Không chứa mô tả Heap) là n>=0. Thông thường bất biến thuần túy được giả định là luôn đúng, thành phần biến tự do hoặc biến không xác định trong một công thức Separation giả định được lượng hóa.
Tiền điều kiện/hậu điều kiện (Pre/Post) được chú thích bởi hai từ khóa "requires" và "ensures". Ví dụ sau thể hiện đặc tả cho thủ tục ghép hai danh sách đơn được trỏ bởi các con trỏ x và y:
node append(node x, node y) requires x::list<n> * y::list<m> ensures res::list<n+m>
Hậu điều kiện phải đảm bảo rằng kết quả trả về là một danh sách đơn có độ dài n+m, trong đó n và m lần lượt là độ dài của dang sách đầu vào x và y. Người dùng hoàn toàn có thể mô tả nhiều cặp tiền điều kiện/hậu điều kiện của các thủ tục được gọi trong chương trình.
3.3.5 Một vài tính năng đặc biệt khác Đặc tả cho cấu trúc Case: Đặc tả cho cấu trúc Case:
HIP cho phép làm việc với đặc tả được xây dựng với cấu trúc Case trong quá trình thực hiện kiểm định. Minh họa cho tính năng này, xem xét ví dụ viết lại thủ tục ghép danh sách khi xem xét với tình huống đặc biệt x có thể null:
Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang67
case {x=null -> requires y::list<m> -> ensures res::list<m>;
x!=null-> requires x::list<n> * y::list<m> -> ensures res::list<n+m>};
Read only:
Một vị từ Heap có thể được thêm vào với chú thích @I, với ý nghĩa rằng cấu trúc dữ liệu được liên kết tới chỉ sử dụng để đọc mà không thể thay đổi. Ví dụ:
x::list<n,p>@I, Khai báo một danh sách read only. Exception handling:
Đặc tả chương trình mô tả thao tác chương trình theo một luồng điều khiển, luồng này có thể là thông thường (normal – không có ngoại lệ) hoặc cũng có thể có những bất thường (abnormal – xuất hiện ngoại lệ). HIP thực hiện việc ghi lại những luồng thông thường dưới dạng "flow __norm", trong khi các luồng ngoại lệ được ghi lại dưới dạng "flow exception_name".
3.4 Kết quả của thử nghiệm 3.4.1 Môi trường cài đặt 3.4.1 Môi trường cài đặt
Hệ thống HIP/SLEEK được thực hiện triển khai trên môi trường Linux, hệ điều hành Ubultu. Trước khi cài đặt HIP/SLEEK cần thực hiện việc cài đặt các tính toán hỗ trợ bao gồm:
- Hệ thống chứng minh mono
- Tính toán omega được đặt trong đường dẫn thư mục /usr/local/bin/
- Cho phép việc truy cập tới dữ liệu đóng gói dạng ZIP, thông thường dữ liệu này được đặt trong cùng thư mục đặt file thực thi hệ thống HIP/SLEEK.
Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang68
- Kiểm định mã nguồn: ./hip [input_file]
- Xem xét thời gian thực thi thêm vào tùy chọn "--epi" - Xem hỗ trợ hệ thống: ./hip --help
3.4.2 Kiểm định với cấu trúc dữ liệu List
Danh sách là một tập các phần tử có cùng kiểu dữ liệu, thông thường một danh sách được sắp xếp theo một thứ tự nhất định. Trong máy tính danh sách được thể hiện bằng nhiều kiểu cấu trúc dữ liệu khác nhau, nhưng đặc trưng nhất là sử dụng List, trong phần này thực hiện việc kiểm định với danh sách nối kép (Double Link List).
3.4.2.1 Mô tả cấu trúc dữ liệu danh sách
Danh sách nối kép gồm các Node được nối với nhau theo hai chiều, mỗi Node là một bản ghi (Record) gồm có 3 trường:
- Trường thứ nhất chứa giá trị lưu trong đó.
- Trường thứ hai (Next) chứa liên kết (con trỏ) tới Node kế tiếp, tức là thông tin để biết Node tiếp theo trong danh sách là Node nào, trong trường hợp nếu là Node cuối cùng sẽ được gán một giá trị đặc biệt.
- Trường thứ ba (Prev) chứa liên kết (con trỏ) tới Node liền trước, tức là thông tin để biết Node đứng trước Node đó trong danh sách là Node nào, trong trường hợp là Node đầu tiên(không có Node liền trước) thì nó cũng sẽ được gán một giá trị đặc biệt.
Luận văn thực hiện việc kiểm định các thao tác cơ bản trên danh sách nối kép: Duyệt danh sách, thêm Node vào danh sách, xóa Node trong danh sách, ghép hai danh sách theo thứ tự sắp xếp.
Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang69