Mặt khác ứng dụng lý thuyết Logic vào kiểm định chương trình có thể bao hàm được rỗng rãi hơn các trường hợp kiểm định chưa tạo được bước đột phá, một phần nguyên nhân chính đến từ việc
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
Trang 2LỜI CAM ĐOAN
Tôi xin cam đoan đề tài nghiên cứu của tôi hoàn toàn do tôi tự làm dưới sự
hướng dẫn của Thầy giáo TS Trần Đức Khánh Những kết quả nghiên cứu, thử
nghiệm được thực hiện trên các phần mềm mô phỏng Các số liệu, kết quả trình bày
trong luận văn là hoàn toàn trung thực và chưa từng được công bố trong bất cứ công
trình nào
Các tài liệu tham khảo sử dụng trong luận văn đều được dẫn nguồn
Nếu xảy ra bất cứ điều không đúng như những lời cam đoan trên, tôi xin chịu
hoàn toàn trách nhiệm trước Viện và Nhà trường
Hà Nội, ngày tháng 3 năm 2014 Tác giả
Nguyễn Đức Cường
Trang 3LỜI CẢM ƠN
Trong lời đầu tiên của báo cáo luận văn tốt nghiệp “Nghiên cứu về
Separation Logic và ứng dụng vào hệ thốngkiểm định tự động” này, tôi muốn gửi
những lời cảm ơn và biết ơn chân thành của mình tới tất cả những người đã hỗ trợ, giúp đỡ tôi về chuyên môn, vật chất và tinh thần trong quá trình thực hiện luận văn
Trước hết, tôi xin chân thành cảm ơn Tiến sĩ Trần Đức Khánh, bộ môn Hệ thống thông tin, Viện Công nghệ Thông tin và Truyền thông trường Đại học Bách khoa Hà Nội, người đã trực tiếp hướng dẫn, nhận xét, giúp đỡ tôi trong suốt quá trình thực hiện luận văn
Xin chân thành cảm ơn Viện Công nghệ Thông tin và Truyền thông, Viện Đào tạo sau đại học - Trường Đại học Bách khoa Hà Nội đã giúp đỡ tôi trong suốt quá trình học tập và tìm hiểu
Xin cảm ơn các cộng tác viên của nhóm tìm hiểu về Separation Logic năm
2013 (do TS Trần Đức Khánh hướng dẫn), đặc biệt là Nguyễn Anh Tuấn lớp Kỹ sư tài năng, K52 - Trường Đại học Bách khoa Hà Nội đã giúp đỡ tôi rất nhiều trong thời gian thực hiện luận văn Tôi cũng xin bày tỏ lòng biết ơn đến gia đình và những người bạn thân đã giúp đỡ, động viên tôi rất nhiều trong suốt quá trình học tập và làm luân văn tốt nghiệp
Do thời gian thực hiện có hạn, kiến thức chuyên môn còn nhiều hạn chế nên luận văn của tôi thực hiện chắc chắn không tránh khỏi những thiếu sót nhất định Tôi rất mong nhận được ý kiến đóng góp của các thầy, cô giáo và các bạn
Hà Nội, ngày 20 tháng 03 năm 2014
Trang 4MỤC LỤC
LỜI CAM ĐOAN 2
MỤC LỤC 4
DANH MỤC BẢNG BIỂU 8
DANH MỤC HÌNH VẼ 9
DANH MỤC THUẬT NGỮ SỬ DỤNG 10
TÓM TẮT NỘI DUNG LUẬN VĂN TỐT NGHIỆP 11
1.Lý do chọn đề tài 11
2.Lịch sử tìm hiểu 12
3.Mục đích tìm hiểu, đối tượng, phạm vi của luận văn 13
3.1Mục đích tìm hiểu 13
3.2Đối tượng tìm hiểu 14
3.3 Phạm vi tìm hiểu 14
4.Các luận điểm cơ bản và đóng góp của luận văn 15
4.1 Các luận điểm cơ bản 15
4.2 Đóng góp mới của luận văn 15
5.Phương pháp tìm hiểu 15
6.Cấu trúc của luận văn 16
CHƯƠNG 1.TỔNG QUAN 17
1.1 Hoare Logic và kiểm định phần mềm 17
1.2 Separation Logic và kiểm định phần mềm 18
1.3Kiểm chứng mô hình 19
1.4 Vai trò của Separation Logic trong tự động hóa kiểm định phần mềm 20
1.5 Kết luận chương 21
CHƯƠNG 2 CƠ SỞ LÝ THUYẾT CỦA SEPARATION LOGIC VÀ GIẢI PHÁP CHO ỨNG DỤNG KIỂM ĐỊNH PHẦN MỀM TỰ ĐỘNG 22
2.1 Logic bậc nhất 23
2.1.1 Logic mệnh đề 23
Trang 52.2.2 Logic bậc nhất 24
2.2.3 Tích liên tiếp 24
2.2 Hoare logic 25
2.2.1 Logic vị từ 25
2.2.2 Hoare logic 29
2.2.2.1 Công thức cú pháp cho chứng minh chương trình 29
2.2.2.2 Các khái niệm về tính đúng 30
2.2.2.3 Tiên đề của Hoare Logic 31
2.3 Separation logic 34
2.3.1 Cơ bản về Separation Logic 34
2.3.2 Ngôn ngữchương trình 37
2.3.2.1 Ngữ pháp 37
2.3.3 Ngôn ngữ đặc tả 39
2.3.3.1 Vị từ User-defined 41
2.3.3.2 Chú thích Well-formedness 45
2.3.3.3 Khái niệm Bag của giá trị/địa chỉ 47
2.4 Quy tắc Forward Verification 49
2.5 Quy tắc kiểm tra suy diễn Entailment Checking 52
2.5.1 Quy tắc Matching up Heap Node 55
2.5.2 Quy tắc Unfold vị từ Shape trong Atendence 55
2.5.3 Quy tắc Fold vị từ Shape trong Consequence 56
2.6 Tính đúng đắn của quy tắc suy diễn 57
2.6.1 Mô hình ngữ nghĩa 58
2.6.2 Tính đúng đắn của quy tắc Verification 59
Định lý 1 (Preservation) 60
Định lý 2 (Progress) 60
Định lý 3 (Safety) 60
2.6.3Tính đúng đắn của quy tắc Entailment 61
Định lý 1 (Soundness) 61
Trang 6Định lý 2(Termination) 61
2.7 Kết luận chương 61
CHƯƠNG3 CÀI ĐẶT THỬ NGHIỆM CÔNG CỤ KIỂM ĐỊNH TỰ ĐỘNG ỨNG DỤNG SEPARATION LOGIC 62
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 62
3.2 Kiến trúc của HIP/SLEEK 63
3.3 Hoạt động của HIP/SLEEK 64
3.3.1 File đầu vào 64
3.3.2 Kiểu dữ liệu cơ bản 65
3.3.3 Cấu trúc dữ liệu 65
3.3.4 Định dạng công thức khẳng định 65
3.3.5 Một vài tính năng đặc biệt khác 66
3.4 Kết quả của thử nghiệm 67
3.4.1 Môi trường cài đặt 67
3.4.2 Kiểm định với cấu trúc dữ liệu List 68
3.4.2.1 Mô tả cấu trúc dữ liệu danh sách 68
3.4.2.2 Dạng thức File đầu vào của danh sách 69
3.4.2.3 Kết quả kiểm định danh sách với HIP/SLEEK 72
3.4.3 Kiểm định với cấu trúc dữ liệu Tree 73
3.4.3.1 Mô tả cấu trúc dữ liệu Tree 73
3.4.3.2 Dạng thức File đầu vào của Tree 74
3.4.3.3 Kết quả kiểm địnhTree với HIP/SLEEK 78
3.4.4 Kiểm định với cấu trúc dữ liệu Queue 78
3.4.4.1 Mô tả cấu trúc dữ liệu Queue 79
3.4.4.2 Dạng thức File đầu vào của Queue 80
3.4.4.3 Kết quả kiểm địnhQueue với HIP/SLEEK 85
3.5 Kết luận chương 86
CÔNG VIỆC LIÊN QUAN 88
Trang 74.1 Dạng thức phân tích/kiểm tra Shape 88
4.2 Thuộc tính Size 88
4.3 Thuộc tính Set/Bag 89
4.4 Kỹ thuật Fold/Unfold 89
4.5 Một số ứng dụng kiểm định Logic khác 89
KẾT LUẬN 91
TÀI LIỆU THAM KHẢO 93
Trang 8DANH MỤC BẢNG BIỂU
Bảng 1 - Toán tử Separation Logic 35
Bảng 2 - Truy xuất trên vùng nhớ Heap 36
Bảng 3 - Ý nghĩa ký hiệu sử dụng trong ngôn ngữ chương trình 38
Bảng 4 - Ký hiệu định nghĩa mô hình 58
Bảng 5 - Ký hiệu ngữ nghĩa 59
Trang 9DANH MỤC HÌNH VẼ
Hình 1 - Toán hạng cơ bản logic mệnh đề 23
Hình 2 - Ngôn ngữ chương trình 37
Hình 3 - Ngôn ngữ đặc tả 41
Hình 4 - Các quy tắc kiểm tra suy diễn 54
Hình 5 - Tổng quan kiến trúc HIP/SLEEK 63
Hình 6 – Kết quả kiểm định đặc tả cấu trúc dữ danh sách nối kép 73
Hình 7 – Cấu trúc dữ liệu cây 74
Hình 8 – Kết quả kiểm định đặc tả cấu trúc dữ liệu cây 78
Hình 9 – Cấu trúc dữ liệu hàng 79
Hình 10 - Kết quả kiểm định đặc tả cấu trúc dữ liệu hàng 86
Trang 10Heap
Trang 11TÓM TẮT NỘI DUNG LUẬN VĂN TỐT NGHIỆP
1.Lý do chọn đề tài
Ngày nay, tự động hóa được ứng dụng ở rất nhiều lĩnh vực, mục đích thường rất đa dạng và tùy theo nhu cầu đặc thù của từng lĩnh vực, tuy nhiên điểm chung nhất vẫn là giảm nhân lực, thời gian và sai sót Ngành công nghệ thông tin mà cụ thể là phát triển phần mềm cũng không ngoại lệ Như chúng ta biết, để tạo ra sản phẩmcông nghệ thông tinhayphần mềm có chất lượng thì hoạt động kiểm thử phần mềm đóng vai trò rất quan trọng, trong khi đó hoạt động này lại tiêu tốn và chiếm tỷ trọng khá lớn công sức và thời gian trong một dự án Tuy nhiên, việc kiểm thử chương trình là chưa đủ vì các phương pháp kiểm thử hiện tại chỉ là kiểm tra dữ liệu đầu ra của phần mềm rồi so sánh với dữ liệu đầu vào để kiểm tra xem chương trình chạy có lỗi hay không Chúng ta không hề kiểm tra được chi tiết hoạt động của chương trình và không kiểm soát được những lỗi tiềm ẩn ngay cả khi chương trình vẫn chạy đúng Nếu phần mềm phát hành ra mà vẫn còn chứa lỗi thì nhà sản xuất phải thu hồi sản phẩm để sửa chữa Điều này làm giảm uy tín và tiêu tốn nhiều tiền của nhà sản xuất, mặt khác trong một số trường hợp còn gây nguy hại vô cùng lớn đặc biệt trong những phần mềm điều khiển yêu cầu tính chính xác cao, chỉ một sai sót nhỏ cũng có thể dẫn tới phá hủy toàn hệ thống Chúng ta hoàn toàn có thể khắc phục được những vấn đề trên bằng cách sử dụng các phương pháp kiểm định phần mềm để đặc tả và kiểm chứng những phần mềm đòi hỏi tính an toàn cao
Ngày nay nhu cầu tự động hoá quy trình kiểm định phần mềm cũng được đặt
ra do giảm được nhiều chi phí nhân lực cũng như đảm bảo ít sai sót Qua thực tế cho thấy, việc áp dụng kiểm địnhtự động hợp lý sẽ mang lại thành công cho hoạt động kiểm định phần mềm Kiểm định tự động giúp giảm bớt công sức thực hiện, tăng độ tin cậy, giảm sự nhàm chán và rèn luyện kỹ năng lập trình cho cán bộ kiểm định
Kiểm định phần mềm thể hiện trong hai dạng thức là kiểm định tĩnh và kiểm định động Kiểm định động làm việc dựa trên phân tích các yếu tố mà chương trình
Trang 12hết các trường hợp hay kết quả mà chương trình đưa ra.Kiểm địnhtĩnhlàm việc dựa trên mà nguồn của chương trình, từ đó suy diễn về những hành vi phát sinh khi chương trình thực hiện Điều này hoàn toàn không phụ thuộc vào tập dữ liệu đầu vào hay môi trường thực thi chương trình, do đó hoàn toàn có thể thực hiện song song với việc phát triển chương trình Để có thể bao quát đầy đủ hành vi của chương trình,kiểm địnhsử dụng các mô hình trừu tượng của trạng thái của chương trình, điều này có thể gây mất mát một vài thông tin.Do đó, kết quả phân tích chương trình có thể là đúng hoặc sai Mục tiêu của cộng đồng nghiên cứu đang cố gắng phát triển những công cụ kiểm định dựa trên chứng minh Logic kiểm tra tính đúng đắn chương trình hoàn toàn tự động
Việc ứng dụng Logic học vào kiểm định tự động đã được áp dụng trong nhiều công cụ kiểm định tự động hiệu quả và mạnh mẽ Tuy nhiên việc nắm bắt lý thuyết và áp dụng các công cụ này trong thực tế vẫn còn là điều khó khăn để có thể
áp dụng rộng rãi Mặt khác ứng dụng lý thuyết Logic vào kiểm định chương trình có thể bao hàm được rỗng rãi hơn các trường hợp kiểm định chưa tạo được bước đột phá, một phần nguyên nhân chính đến từ việc sử dụng các ngôn ngữ đặc tả chương trình để áp dụng các công cụ kiểm định chưa mô tả đầy đủ, toàn vẹn được các thuộc tính, phương thức của chương trình
Đó là lý tôi chọn đề tài “Nghiên cứu về Separation Logic và ứng dụng vào
hệ thống kiểm định tự động” làm luận văn tốt nghiệp
2.Lịch sử tìm hiểu
Dạng thức logic đầu tiên được ứng dụng vào xây dựng công cụ kiểm định tự
động được đưa ra bởi Floyd và Hoare, với đặc trưng bộ ba Hoare p{c}q, mô tả
trạng thái của chương trình thay đổi từ p sang q sau khi thực hiện lệnh c Tuy nhiên, khi áp dụng bộ ba Hoare đặc tả chương trình thao tác trên dữ liệu có cấu trúc phức tạp thì tính đúng đắn của chương trình không được đảm bảo, nhất là với các chương trình khai thác con trỏ dữ liệu đòi hỏi khai thác bộ nhớ bên ngoài Stack, như là bộ
Trang 13nhớ Heap; hoặc những chương trình đòi hỏi việc chia sẻ bộ nhớ dữ liệu hay tính toán song song
Để giải quyết vấn đề này, O’Hearn và Reynolds đã xây dựng lên Separation
logic, một dạng thức mở rộng của Hoare Logic thực hiện việc suy diễn về thao tác trên cấu trúc dữ liệu chia sẻ(có thể tham chiếu bởi nhiều hơn một con trỏ) Separation Logic được xây dựng với mong muốn mô tả những trạng thái của chương trình.Một khẳng định Separation Logic sẽ mô tả trạng thái được lưu trữ trong Stack và Heap, từ đó xây dựng nên các lý thuyết suy diễn có thể áp dụng chứng minh tính đúng đắn của chương trình chính xác và ngắn gọn.Separation Logic được ứng dụng trong lĩnh vực chứng minh tính dừng chương trình, tranh chấp
dữ liệu, kiểm định chương trình có cấu trúc, kiểm định các mã nguồn ở mức thấp của chương trình (mức thư viện, hệ điều hành, hệ nhúng, tính toán song song…)
Tiếp thu các thành tựu của các nhà khoa học đi trước, chúng tôi cố gắng tìm
hiểu đề tài “Nghiên cứu về Separation Logic và ứng dụng vào hệ thống kiểm định
tự động” Bởi vì các công trình nghiên cứu trên đây có tính định hướng cho luận
văn của chúng tôi
3.Mục đích tìm hiểu, đối tượng, phạm vi của luận văn
3.1Mục đích tìm hiểu
Lý thuyết về kiểm định phần mềm và những ứng dụng kiểm định tự động là
khá rộng, trong khuôn khổ luận văn của đề tài “Nghiên cứu về Separation Logic và
ứng dụng vào hệ thống kiểm định tự động” sẽ tập trung lĩnh vựckiểm định tĩnh
chương trình, trong đó chủ yếu là lý thuyết Separation Logic áp dụng kiểm định cho những thuộc tínhcấu trúc dữ liệu có sự biến động Do đó mục đích của tìm hiểu bao gồm các vấn đề sau đây:
-Nghiên cứu tổng quan vềnền tảng Separation Logic,nêu rõ vai trò của Separation Logic đối với việc phát triển các ứng dụng kiểm định phần mềm tự động
Trang 14-Nghiên cứu cơ bản về Separation Logic và kỹ thuật đặc tả chương trình mới ứng dụng Separation Logic thể hiện mô tả chương trình tốt hơn (ngắn gọn, chính xác, bao quát các tình huống kiểm định hơn) và hỗ trợ mạnh mẽ hơn cho xây dựng các công cụ kiểm định tự động
-Nghiên cứu công cụ HIP/SLEEK ứng dụng Separation Logic kiểm định các Module chương trình tự động
3.2Đối tượng tìm hiểu
Luận văn tập trung nhấn mạnh vào tìm hiểu lý thuyết về Separation Logic, để hiểu rõ được bản chất của nó, luận văn đề cập tới lý thuyết về Hoare Logic (Separation Logic là sự mở rộng của Hoare Logic)
Với mong muốn làm nổi bật ứng dụng của Separation Logic trong lĩnh vực kiểm định phần mềm tự động, luận văn đi sâu vào tìm hiểu kỹ thuật đặc tả chương trình ứng dụng Separation Logic ngắn gọn, chính xác sử dụng trong xây dựng các công cụ kiểm định phần mềm đầy đủ, toàn vẹn hơn
Ngoài ra luận văn còn tìm hiểu về công cụ HIP/SLEEK sử dụng kỹ thuật đặc
tả chương trình trên nền tảng Separation Logic, sử dụng trong kiểm định các Module chương trình thao tác trên cấu trúc dữ liệu con trỏ
3.3 Phạm vi tìm hiểu
Trên cơ sở nghiên cứu về lý thuyết các công trình nghiên cứu trước đâyvới mục đích chính là tìm hiểu về Separation Logic và ứng dụng vào hệ thống kiểm định tự động, phạm vi tìm hiểu của luận văn bao gồm các vấn đề cơ bản như sau:
- Tìm hiểu về lý thuyết cơ bản của của Logic bậc nhất, Hoare Logic cơ sở nền tảng để hiểu rõ khái niệm về Separation Logic
- Tìm hiểu về lý thuyết Separation Logic và ứng dụngkỹ thuật đặc tả chương trình ngắn gọn, chính xác, bao quát chương trình một cách toàn vẹn và đầy đủ nhất
Trang 15-Nghiên cứu áp dụng công cụ HIP/SLEEK ứng dụng Separation Logic kiểm
định tự động chương trình thực tế của nhóm các tác giả Wei-Ngan Chin, Cristina
David, Huu Hai Nguyen, Shengchao Qin
4.Các luận điểm cơ bản và đóng góp của luận văn
4.1 Các luận điểm cơ bản
Khi thiết kế một chương trình thì công việc tốn kém chi phí và thời gian nhất chính là kiểm định chất lượng của chương trình, do đó việc tìm hiểu lý thuyết về Separation Logic và kỹ thuật đặc tả chương trình chính xác, đầy đủ, toàn vẹnhứa hẹn làm nền tảng cho việc xây dựng các công cụ kiểm định chương trình hoàn toàn
tự động, loại bỏ nhiều hơn các công đoạn thủ công, đảm bảo nâng cao tính đúng đắn cho chương trình
Việc nghiên cứu ứng dụng công cụ HIP/SLEEK trong kiểm định tự động chương trình không chỉ minh họa để làm rõ hơn về ứng dụng của Separation Logic
mà còn giúp ta có thể mở rộng áp dụng công cụ này trong kiểm định các hệ thống trong thực tế hiệu quả và chính xác; đó cũng là một vấn đề đáng được lưu tâm 4.2 Đóng góp mới của luận văn
Luận văn đã trình bày làm rõ bản chất của lý thuyếtSeparation Logic, để có thể áp dụng xây dựng nên các hệ thống kiểm định tự động một cáchchính xác và đầy đủ Đồng thời nghiên cứu kỹ thuật đặc tả chương trình ứng dụng Separation Logic mô tả trạng thái chương trình toàn vẹn, đầy đủ, từ đóứng dụng xây dựng công
cụ kiểm định tự động áp dụng trong các lĩnh vực kiểm định phần mềm
5.Phương pháp tìm hiểu
Phương pháp đọc và tìm hiểu tài liệu được tiến hành chủ yếu sau khi xác định cơ sở lý luận cho đề tài Để giải quyết tốt vấn đề đặt ra của đề tài, cần tiến hành tìm hiểu lý thuyết về kiểm định chương trình cũng như một số vấn đề về lý thuyết
có liên quan đã trình bày trong phần đối tượng tìm hiểu của luận văn
Trang 166.Cấu trúc của luận văn
Ngoài phần mở đầu và kết luận cùng với định hướng về hướng phát triển của
đề tài, luận văn được trình bày chủ yếu trong 3 chương:
Chương 1: Trình bày một cách tổng quan về luận văn, nêu rõvai trò của Separation Logic trong vấn đềkiểm định phần mềm tự động;
Chương 2: Trình bày các cơ sở lý thuyết về Separation Logic và kỹ thuật đặc
tả chương trình ứng dụng Separation Logic;
Chương 3: Trình bày các vấn đề cơ bản về công cụ kiểm định phần mềm tự động HIP/SLEEK ứng dựng Separation Logic và kết quả thử nghiệm công cụ áp dụng kiểm định phần mềm
KẾT LUẬN
Trang 17CHƯƠNG 1.TỔNG QUAN
Nội dung chương 1:
Trình bày về tổng quan nền tảng lý thuyết Separation Logic
Trình bày vai trò của Separation Logic trong tự động hóa kiểm định phần
mềm
Trong những năm 60 và 70 thì các dạng thức phân tích chương trình và kiểm định chương trình đã được đề xuất bởi những tác giả tiên phong (Floyd, 1967; Hoare, 1969; Dijkstra, 1976), với mục đích thực hiện suy diễn về chương trình và đảm bảo chất lượng của phần mềm Lĩnh vực này hơn 40 năm sau đó vẫn tiếp tục phát triển mặc dù các yêu cầu trong kỹ thuật phần mềm ngày một nhiều hơn Có rất nhiều kỹ thuật khác nhau được ứng dụng cho những hoàn cảnh cụ thể, luận văn lựa chọn tìm hiểu những khái niệm cơ bản về Separation Logic (một dạng thức mở rộng của Hoare Logic thực hiện suy diễn về tính đúng đắn của chương trình, đặc biệt là các chương trình liên quan đến tính an toàn của vùng nhớ truy cập bởi con trỏ) để thực hiện nghiên cứu về lý thuyết suy diễn chương trình thông qua đặc tả chương trình và ứng dụng trong tự động hóa kiểm định phần mềm
1.1 Hoare Logic và kiểm định phần mềm
Cách tiếp cận để mô tả những hành vi của chương trình có thể tìm thấy trong hầu hết các kỹ thuật phân tích chương trình,Floyd và Hoare là những người đầu tiên sử dụng các công thức Logic để đặc tả lại các hành vi của chương trình Họ đề xuất ra một hệ thống công thức mà sử dụng các tiền đề và những quy tắc Logic cho việc suy diễn về tính đúng đắn của chương trình máy tính Hệ thống này được biết đến là lý thuyết về Hoare Logic, với tính năng trung tâm là bộ ba Hoare:
Trang 18Tiền điều kiện P và hậu điều kiện Q đặc tả những hành vi của một đoạn lệnh chương trình C Hoare Logic tiêu chuẩn chỉ thực hiện chứng minh tính đúng đắn từng phần, còn tính dừng của chương trình cần một chứng minh riêng biệt khác Tính đúng đắn của toàn bộ chương trình dựa trên việc xây dựng tính đúng đắn từng phần và chứng minh tính dừng của chương trình Những nghiên cứu về sau (Dijkstra, 1976) giới thiệu về khái niệm điều kiện trước nhất lỏng nhất, hay Burstall(1974) thực hiện việc tích hợp thao tác ngữ nghĩa của chương trình với các công thức kiểm định
Kể từ thời điểm đó, nhiều nghiên cứu về Hoare Logic được công bố, như Manna and Pnueli(1974) trình bày về tính đúng đắn toàn bộ của Logic Hoare trong một công cụ tích hợp chứng minh tính đúng đắn và tính dừng của chương trình.Những khái niệm nâng cao và hoàn chỉnh hơn được giới thiệu bởi Cook(1978), trong đó chỉ ra rằng Hoare Logic là đúng đầy đủ chỉ trong một số trường hợp, điều này có quan hệ tới mô hình ngữ nghĩa của lý thuyết Logic mà nó thực hiện suy diễn
Kiểm định và phân tích thực hiện trong luận văn này đều dựa trên các yếu tố nòng cốt cơ bản là Hoare Logic Trong các chương sau, ngữ nghĩa chương trình thông qua thực thi một cách hình thức chương trình đều dựa trên khái niệm về Separation Logic (một sự mở rộng của lý thuyết Hoare Logic)
1.2 Separation Logic và kiểm định phần mềm
Kỹ thuật của Separation Logic là mô hình về những trạng thái vùng nhớ của chương trình, trong phần này ta tìm hiểu những khái niệm nền tảng của Logic này
Khởi nguồn của Separation Logic được biết đến với khái niệm Logic Bunch (BI) được đề xuất bởi O'Hearn and Pym (1999), đó là sự kết hợp của Intuitionistic Logic và Intuitionistic Linear Logic Mô hình chứng minh mệnh đề của BI là sự kết hợp của hai loại Logic này, đồng thời mô hình này sử dụng các vị từ của Logic bậc nhất cùng với các lượng từ tồn tại
BI tồn tại chỉ giống như một mô hình lý thuyết, khó có khả năng áp dụng vào thực tế, cho đến khi Reynolds công bố các kết quả nghiên cứu của mình về suy diễn trong chương trình, về mô hình Logic thì tương tự BI Đó là sự mở rộng của cách tiếp cận Hoare Logic để chứng minh tính đúng đắn của chương trình thao tác với các cấu trúc cơ sở dữ liệu được tham chiếu bởi nhiều hơn một con trỏ Ý tưởng của
nó là sự “tách biệt độc lập” của P và Q, điều này chỉ đúng khi P và Q là đúng và có cùng một miền lưu trữ
Trang 19Sự kết hợp của O'Hearn và Reynolds sau đó đã tạo nên nền tảng của lý thuyết Separation Logic mà tập trung vào các vấn đề suy diễn trạng thái chương trình trên bộ nhớ Heap Separation Logic được thêm vào hai kết nối cơ bản: * và , ý nghĩa của P*Q là miền Heap được nắm giữ bởi P và Q là tách biệt Mô hình này
là sự kế thừa những quy tắc suy diễn của Hoare Logic, với quy tắc Frame được sử dụng suy diễn cục bộ chương trình mà không ảnh hưởng đến trạng thái Heap cục bộ:
Các nghiên cứu về Separation Logic được công bố có thể kể đến như Yang and O'Hearn(2002), trình bày về tính đúng đắn và đầy đủ của Separation Logic trong đó nhấn mạnh khái niệm Frame có khả năng suy diễn tự động, điều này giúp giảm thiểu việc viết quá nhiều chú thích đặc tả trong suy diễn Berdine (2004) đề cập tới vấn đề kiểm tra suy diễn (entailment checking) với giải thuật đúng đắn và đầy đủ, điều này đóng vai trò vô cùng quan trọng trong kỹ thuật phân tích chương trình tự động Calcagno (2007) trình bày nghiên cứu về cấu trúc ngữ nghĩa dựa trên Separation Logic với khái niệm biến đổi trạng thái trong một suy diễn cục bộ.Nhóm các tác giả Wei-Ngan Chin, Cristina David, Huu Hai Nguyen, Shengchao Qin (2008) đã phát triển công cụ HIP/SLEEK thực hiện việc kiểm thử Module chương trình hoàn toàn tự động dựa trên các quy tắc suy diễn của Separation Logic Công
cụ này được luận văn tập trung tìm hiểu kỹ trong phần tiếp theo của luận văn
1.3Kiểm chứng mô hình
Kiểm chứng mô hình (Clarke and Emerson, 1981) theo một cách tiếp cận khác được hiểu là chứng minh tính đúng đắn của chương trình Mô hình kiểm chứng đầu tiên được thiết kế và cài đặt bởi McMillan (1992), thực hiện kiểm chứng các trạng thái của hệ thống trong đó có một vài trạng thái được đặc tả bởi Logic Kỹ thuật cơ bản nhất (được coi là chìa khóa) của kiểm chứng mô hình là sử dụng vị từ trừu tượng (Ball, 2001) Thông qua việc sử dụng vị từ trừu tượng kết hợp với khả năng suy diễn trên bộ nhớ Heap thì mô hình kiểm chứng có thể mở rộng như là sự
mở rộng của các trạng thái tính toán Trong luận văn, mô hình kiểm chứng được sử dụng áp dụng trên công cụ HIP/SLEEK sẽ được trình bày ở chương kế tiếp
Trang 201.4 Vai trò của Separation Logic trong tự động hóa kiểm định phần mềm
Floyd và Hoare là những người đầu tiên tạo ra thách thức cho khoa học kiểm
định phần mềm, bởi việc phát triển công cụ Logic cung cấp khả năng tự động hóa quá trình kiểm định phần mềm (Hoare Logic), nó đảm bảo rằng chương trình đáp ứng đúng đặc tả.Đặc tính trung tâm của Hoare Logic là bộ ba Hoare, bộ ba này mô
tả những yêu cầu và ảnh hưởng của mã nguồn chương trình Tập công cụ này có thể
áp dụng trong một dải khá rộng các phần mềm, trong đó nhấn mạnh thách thức theo nghĩa rộng là việc kiểm định chương trình giải quyết vấn đề đưa ra đặc tả chính xác Công cụ này cho phép phát hiện ra những hành vi không mong muốn của chương trình để có thể đưa ra được thiết kế phù hợp
Tuy nhiên, lý thuyết của Floyd và Hoare đã không thể thiết lập được tính
đúng đắn của những chương trình làm việc với cấu trúc dữ liệu Khái niệm
“Shared” có nghĩa là cấu trúc dữ liệu có thể trỏ/tham chiếu bởi nhiều hơn một con trỏ/tham chiếu Khái niệm “Mutable” cấu trúc dữ liệu có thể bị thay đổi sau khi có
bất kỳ một sự truy cập nào đến nó Những loại chương trình này yêu cầu sự lưu trữ cho phép bên ngoài bộ nhớ Stack (là Heap) và tính đúng đắn dựa trên giới hạn phức
tạp của chia sẻ cấu trúc dữ liệu.Để giải quyết vấn đề này, O’Hearn và Reynolds đã
thiết kế ra Separation Logic, đây là một sự mở rộng của Hoare Logiccho suy diễn
về cấu trúc dữ liệu “Shared Mutable ” Mỗi một khẳng định của Separation Logic
mô tả những trạng thái được lưu trữ trong bộ nhớ Heap và Stack.Đặc tính nổi bật
của Separation Logic là sử dụng khái niệm “Shape” để đặc tả chương trình dưới hình thức của Separation Logic Trong miền “Shape” các thuộc tính cấu trúc dữ liệu được đặc tả một cách ngắn gọn và đầy đủ hơn bởi việc thêm vào các đặc tính “Size,
Length, Bag” Đặc biệt để tăng cường tính biểu hiện của ngôn ngữ đặc tả thông qua
việc cho phép người dùng có thể tự định nghĩa vị từ “User-defined”, điều này giúp
người dùng có thể định nghĩa ra các loại vị từ khác nhau mô tả quan hệ giữa các thành phần của cấu trúc dữ liệu và các tính chất lượng từ mà người dùng mong muốn.Đồng thời kế thừa thuộc tính của Hoare Logic, Separation Logic cũng có khả năng áp dụng trong kiểm định chương trình tự động
Trang 21Với các tính chất kế thừa và bổ sung những điểm mới, Separation Logic đóng vai trò hạt nhân trong việc xây dựng lên các hệ thống suy diễn thực thi kiểm định tính đúng đắn chương trình, thông qua việc xây dựng và kiểm chứng đặc tả chương trình tự động Những tính chất này sẽ được luận văn đề cập và làm rõ trong các phần tiếp theo
1.5 Kết luận chương
Trongchương này,tađivàotìmhiểu đểcócáinhìntổngquanvềnền tảng của Separation Logic để giúp người đọc có cái nhìn bao quát hơn về bắt nguồn lý thuyết này Nhằm giảm công sức và chi phí của các công đoạn kiểm định phần mềm, luận văn đề cập tới những thách thức trong vấn đề tự động hóa quá trình kiểm định phần mềm, để từ đó nêu ra vai trò của Separation Logic trong việc xây dựng các công cụ kiểm định tự động Trong phần tiếp theo, luận văn sẽ trình bày làm rõ cơ sở nền tảng của lý thuyết Separation Logic và công cụ HIP/SLEEK áp dụng những lý thuyết đưa ra thực hiện kiểm định Module chương trình hoàn toàn tự động
Trang 22CHƯƠNG 2 CƠ SỞ LÝ THUYẾT CỦA SEPARATION LOGIC VÀ GIẢI PHÁP CHO ỨNG DỤNG KIỂM ĐỊNH
PHẦN MỀM TỰ ĐỘNG
Nội dung chương 2:
Trình bày cơ sở lý thuyết nền tảng Separation Logic bao gồm: Logic bậc
nhất, Hoare Logic và Separation Logic
Trình bày kỹ thuật đặc tả chương trình dựa trên lý thuyết Separation Logicvà
các quy tắc suy diễn chương trình dựa trên kỹ thuật đặc tả Separation Logic cũng như tính đúng đắn của suy diễn Logic
Trong chương 1 đã trình bày khái quát các công đoạn liên quan tới quá trình kiểm định phần mềm cũng như các phương pháp chủ yếu ứng dụng trong việc kiểm định phần mềm Để từ đó thấy được sự cần thiết của việc xây dựng nên những công
cụ kiểm định phần mềm tự động, đảm bảo cho việc kiểm định phần mềm được thực hiện chính xác, hiệu quả, tiết kiệm chi phí, nhân lực cho công đoạn kiểm định phần mềm
Trong chương 2luận văn trình bày cơ sở lý thuyết về Separation Logic được
sử dụng làm nền tảng ứng dụng xây dựng những công cụ kiểm định phần mềm tự động.Đồng thời trình bày kỹ thuật đặc tả chương trình ứng dụng Separation Logic
Cụ thể, trong chương 2hướng tới làm rõ hơn về lý thuyết Separation Logic, luận văn
sẽ trình bày các vấn đề như sau:
-Để hiểu rõ hơn về khái niệm Separation Logic, luận văn đưa ra những khái niệm cần thiết về Logic đặc biệt trình bày các khái niệm cơ bản lý thuyết về Hoare Logic Đây được coi là cơ sở nền tảng của lý thuyết về Separation Logic
Trang 23-Trình bày về lý thuyết cơ bản về Separation Logic và trọng tâm là kỹ thuật đặc tả chương trình ứng dụng Separation Logic bao hàm các vấn đề:
Ngôn ngữ lập trình được sử dụng cho đặc tả dữ liệu và thủ tục chương trình
Ngôn ngữ đặc tả với trọng tâm nhấn mạnh tìm hiểu vị từ User-defined
2.1.1 Logic mệnh đề
Khái niệm: Logic mệnh đề thường được biết đến như là một câu và sử dụng những toán hạng để tạo ra những câu phức tạp hơn
Hình 1 -Toán hạng cơ bản logic mệnh đề
Ví dụ ta định nghĩa 2 mệnh đề p và q như sau:
Khi đó, ta có thể sử dụng những toán tử ghép nối để tạo thành những câu mới:
Trang 242.2.2 Logic bậc nhất
Logic bậc nhất là một sự mở rộng của Logic mệnh đềbởi việc thêm vào biến
Ví dụ có định nghĩa hai quan hệ như sau:
Khi đó ta có thể sử dụng toán tử và lượng từ để tạo ra một quan hệ mới:
2.2.3 Tích liên tiếp
Là một biểu thức chứng minh được đề xuất bởi Gentzen, có dạng
trong đó được coi là tập tiền đề và là tập kết luận Trong đó tập tiền đề và kết luận là dạng thức logic bậc nhất Ý nghĩa của tính toán liên tiếp là nguồn gốc của những kết luận phải bắt nguồn từ những tiền đề Đây là cú pháp cơ bản về nguồn gốc trong hệ thống chứng minh.Những quy tắc suy diễn định nghĩa làm thế nào một tính toán liên tiếp có thể được bắt nguồn từ những yếu tố khác trong một chứng minh.Những quy luật này có thể chia nhỏ thành 2 nhóm: những quy tắc chứng minh logic và những quy tắc chứng minh cấu trúc
Ví dụ về chứng minh logic:
Trang 25Quy tắc này đôi khi được ký hiệu và nó thể hiện:
1 Bất cứ khi nào đúng thì P phải là đúng
2 Bất cứ khi nào đúng thì Q phải là đúng
Sau đó ta có thể kết luận rằng bất cứ khi nào xuất phát từ là đúng, thì phải là đúng.Dạng thức này xuất hiện như là bộ 3, nhưng kết hợp quy tắc suy luận này với những suy luận tương tự chúng ta có một hệ thống cho việc đặc tả quy tắc của chứng minh toán học, và có thể sử dụng để áp dụng vào suy diễn chứng minh tự động
Ví dụ về những quy tắc cấu trúc:
Quy tắc thu gọn(Contraction) thể hiện rằng giả thiết có , P và P suy ra Q thì
ta bắt buộc phải viết dưới dạng thức thu gọn trong đó P chỉ được xuất hiện một lần
Có thể thấy rằng các quy tắc này là hiển nhiên, tuy nhiên khi chuyển sang khái niệm Separation Logic thì các quy tắc này sẽ bị biến đổi khá nhiều so với ban đầu
2.2 Hoare logic
2.2.1 Logic vị từ
Định nghĩa 1: Vị từ là một hàm nhận giá trị bool
Một vị từ thực sự là một giá trị logic được biểu hiện bằng tham số Nó có thể đúng với một số đối số, và sai với một số khác.Chẳng hạn x > 0 là một vị từ với một đối số, ta có thể đặt tên nó là gt0(x) Do vậy mà gt0(5) là đúng và gt0(0) là sai
Định nghĩa 2:Các thành phần của logic vị từ wffsgồm có các thành phần sau:
- Các định danh biến – một tập(thường là vô hạn) của các tên biến, thường là
x, x1,x2… y, y1, y2…
- Các định danh hằng – Một tập(hữu hạn, vô hạn, hoặc rỗng) của các tên hằng, thường là a, a1, a2… b, b1, b2,
Trang 26- Các định danh vị từ - một tập(không rỗng) của các tên vị từ, thường là p, p1, p2 q, q1, q2
- Các định danh hàm – một tập các tên hàm, thường là f, f1, f2… g, g1, g2…
- Mỗi định danh hàm và định vị từ có một số cố định của các các đối số mà nó chấp nhận
Định nghĩa 3: Các toán hạng của logic vị từ được định nghĩa một cách đệ quy như sau:
- Các tên biến và các tên hằng là toán hạng, và
- Nếu t1, ,tk là các toán hạng và f là một tên hàm số có số các đối số cố định
là k thì f(t1, ,tk) là một toán hạng
Một toán hạng không chứa các biến được gọi là toán hạng cơ sở
Định nghĩa 4:Các công thức đúng ngữ pháp (wffs) của logic vị từ được định nghĩa
đệ quy như sau:
- Mỗi công thức nguyên tử là một công thức đúng ngữ pháp wff, và
một công thức đúng ngữ pháp:
Hai phép toán lượng hóa cũng cấp một ngữ nghĩa không thể thiếu được để biểu diễn các khẳng đinh về các kết quả chân lý của các vị từ Sự thể hiện của mỗi phép toán trong các phép toán logic phụ thuộc vào hiểu biết về không gian từ đó các giá trị của các biến có thể được đưa ra Nếu không gian này là hữu hạn, nói rằng
, thì những phép toán logic mới này có thể được biểu thị bằng cách sử
Trang 27của các công thức đúng ngữ pháp đạt được bằng sự thay thế x bởi mỗi phần tử của
đạt được bởi sự thay thế x bằng mỗi phần tử của các phần tử của không gian
Ví dụ:
Các phép toán lượng hóa này yêu cầu ta phân biệt cách sử dung của các biến
biếnvà thể hiệnmột giá trị duy nhất – giá trị x được gọi là biên trong trường hợp trước và tự do trong trường hợp sau Nó minh họa hai vai trò khác nhau đối với các biến trong biểu thức đúng khuôn dạng logic mệnh đề do đó phải phân biệt cẩn thận
phạm vi của lượng hóa Tất cả các xuất hiện của biến mà không bị chặn là các biến
được gọi là đóng nếu nó không có sự xuất hiện của các biến tự do
Định nghĩa 6: Một thể hiện i gồm có:
- Một tập D không rỗng – miền(hoặc không gian của các giá trị)
- Một phép gán của
Mỗi tên vị từ n đối số thành một quan hệ n vị trí D,
Mỗi tên hàm n đối số thành một hàm n vị trí trong D,
Mỗi định danh hằng thành một phần tử của D
Ta viết
Một thể hiện là một toán hạng thể hiện nếu D là tất cả các toán hạng, và các phép gán đối với mỗi tên hàm là toán hạng khởi tạo tương ứng
Trang 28Định nghĩa 7: Một thể hiện được cho , một biến gán (hoặc trạng thái) là
mang một giá trị cho tất cả các toán hạng và các công thức
- Đối với toán hạng
Với một toán hạng phức hợp
- Đối với công thức
Đối với một công thức nguyên tử
Đối với các công thức phức hợp
nếu ngược lại
nếu ngược lại
Hai định nghĩa này thể hiện rằng, cho một thể hiện và một trạng thái, chỉ có một giá trị duy nhất được quyết định cho mỗi toán hạng và mỗi công thức bới việc ước lượng mỗi phép toán lo gic Điêu này cung cấp các giá trị đúng ta sử dụng phân loại các công thức
Định nghĩa 8: Cho là một biểu thức hợp khuôn dạng wff, i là một thể hiện, và
Trang 29hợp khuân dạng là đúng trên , nếu mọi trạng thái thỏa mãn dưới i, và i được gọi là mô hình của , là sai trên khi i nếu i không có trạng thái nào thỏa mã dưới i Một thể hiển được gọi là mô hình của một tập các biểu thức hợp khuân dạng nếu nó là mô hình của từng biểu thức hợp khuân dạng wff trog tập, và nếu nó
là một thể hiện toán hạng, thì nó được gọi là mô hình toán hạng
Định nghĩa 9: Một công thức đúng ngữ pháp wff là đúng logic(công thức hằng đúng) nếu nó đúng trên mọi thể hiện, có thể thỏa mãn nếu tồn tại một thể hiện và trạng thái thỏa mãn nó, và ngược lại nếu nó là không thỏa mãn
Định nghĩa 10:Một công thức đúng ngữ pháp wff là một hệ quả logic của một tập
2.2.2 Hoare logic
2.2.2.1 Công thức cú pháp cho chứng minh chương trình
Các công thức ta viết sẽ xác nhận các thuộc tính của các chương trình(các đoạn chương trình thực sự) Do vậy, các công thức phải bao gồm các xác nhận và chương trình tới công thức mà nó gắn liền Các xác nhận chương trình(wffs) có dạng
Gồm có 3 thành phần:
- P là một đoạn chương trình – một lệnh(có thể phức hợp) và
của chương trình, các hiệu {,} là các siêu ký hiệu được sử dụng để biểu thị bắt đầu
và kết thúc của các công thức vị từ, và không nên hiểu như là các kỹ hiệu trong
Trang 30ngôn ngữ lập trình Công thức logic gọi là điều kiện trước, và được gọi là điều kiện sau
2.2.2.2 Các khái niệm về tính đúng
là các trạng thái đầu và trạng thái sau của chương trình
bất kỳ trạng thái thỏa P thì sau khi thực hiện đoạn lệnh S chương trình sẽ dừng lại tại trạng thái thỏa mãn Q
xuất phát từ bất kỳ trạng thái thỏa P thì khi thực hiện đoạn lệnh S, nếu việc xử lý dừng thì trạng thái cuối thỏa Q (tính dừng của S chưa được khẳng định)
của S, tính đúng của S dựa trên điều kiện cần P, điều kiện đủ Q với giả định tính dừng đã có của S
Ví dụ 1:
Ví dụ 2:
Là một thể hiện sai, vì nếu x = 1> 0(thỏa mãn trạng thái ban đầu P) thì sau khi thực
Trang 312.2.2.3 Tiên đề của Hoare Logic
Để thực hiện chứng minh hình thức tính đúng đắn của một đoạn chương trình, cần một tiền đề mô tả tác động của các thao tác xử lý cơ bản (lệnh cơ bản) của các ngôn ngữ dùng viết chương trình Sau đây là các quy tắc bổ sung được của các
hệ luật suy diễn Hoare Logic
Tiên đề của phép gán
một biểu thức thích hợp Tiên đề của phép gán nằm dưới hệ thống logic để chứng minh các chương trình không điều kiện
Trong đó P là một công thức logic vị từ, X là một biến, là một biểu thức,
bước chứng minh được xác nhận bởi việc chứng minh cú pháp công thức tương ứng Tuy nhiên ta không phân biệt các công thức mà chúng tương đương logic
Ví dụ tính đúng có điều kiện của các đặc tả sau được khẳng định dựa vào các tiên
đề gán:
Độ mạnh của các công thức đúng ngữ pháp
một xác nhận mạnh hơn Q, và Q thì yếu hơn P Một điều kiện mạnh hơn là một điều kiện mà nhiều hơn các giá trị thỏa mãn một điều kiện ít mạnh hơn
Tiên đề Skip
Trang 32Với P là một công thức logic mệnh đề bất kỳ Bằng trực giác, vì skip không làm gì, nên cái gì đúng sau sự thực hiện của nó cũng như là cái đã đúng trước đó
Độ mạnh của điều kiện trước
Đó là quy tắc đầu tiên của các quy tắc suy luận trong hệ chứng minh chương trình Ý kiến một cách trực quan là nếu một xác nhận chương trình có thể được chứng minh, thì điều kiện trước có thể được thay thế bởi bất kù công thức nào kép theo nó
πLà một đoạn chương trình bất kỳ
Ví dụ sau minh họa cho quy tắc trên kiểm chứng tính đúng có điều kiện:
dụng quy tắc trên ta có được
Độ yếu của điều kiện sau
Đó là quy tắc tiếp theo của các quy tắc suy luận trong hệ thống chứng minh chương trình Ý kiến một cách trực quan là nếu một xác nhận chương trình có thể được chứng minh, thì điều kiện sau có thể được thay thế bới bất kỳ công thức nào
nó kéo theo
πLà một đoạn chương trình bất kỳ
Ví dụ sau minh họa cho kiểm chứngtính đúng có điều kiện áp dụng quy tắc này:
Trang 33Giả sử ta có , với x là biến nguyên dương nên có
Áp dụng luật tuần tự ta được
Quy tắc điều kiện
Để minh họa cho quy tắc này, xem xét ví dụ kiểm chứng cho đặc tả sau:
Chứng minh: Có
Trang 34Do đúng với mọi S và Q nên
Quy tắc While
Luật này thể hiện rằngnếu P không bị thay đổi bởi bất cứ lần nào thực hiện lệnh Cthì nó cũng sẽ không thay đổi bởi toàn bộ lệnh lặp While, với ý nghĩa này P
được gọi là bất biến của vòng lặp
S từ một trạng thái thỏa mãn P thì sẽ chỉ kết thúc trong các trạng thái thỏa mãn Q
2.3 Separation logic
2.3.1 Cơ bản về Separation Logic
Separation Logic là lý thuyết căn bản được sử dụng để xây dựng lên ngôn ngữ đặc tả chương trình được ứng dụng trong công cụ kiểm định được trình bày trong luận văn Seaparation Logic được thiết kế cho việc suy diễn về chương trình
mà sử dụng kiểu cấu trúc dữ liệu con trỏ Tính năng khác biệt của của Separation Logic là suy diễn cục bộ về cấu trúc dữ liệu được liên kết bởi các con trỏ và cấp phát trong vùng nhớ Heap, điều đó có nghĩa là suy diễn về một lệnh sẽ chỉ được chú trọng tới một phần bộ nhớ heap mà lệnh đó truy cập Separation Logic thể hiện khả năng suy diễn chặt chẽ hơn thông qua hai kỹ thuật chính:
- Bổ sung toán tử Conjuntion: conjuntion* và implication-*
- Mở rộng bộ ba Hoare chặt chẽ hơn
Trang 35Trong suy diễn Logic về chương trình của Separation Logic chủ yếu quan tâm tới những chương trình thao tác trên bộ nhớ Heap, do đó bộ nhớ heap mà phần chương trình sử dụng là một phần của mô hình Separation Logic hướng tới Mỗi quan hệ ngữ nghĩa một công thức Separation Logic trong một trạng thái chương trình với bộ nhớ heap và stack được thể hiện theo dạng thức sau:
Trong đó s là mô hình của bộ nhớ Stack của chương trình và h là phần bộ nhớ heap của chương trình thao tác
Separation Logic bổ sung các toán tử các toán tử suy diễn trên bộ nhớ heap chương trình như sau:
Toán tử emp thể hiện heap là rỗng, có nghĩa là không có
dữ liệu hoặc đối tượng trong vùng nhớ heap
4
Bảng 1 - Toán tử Separation Logic Separation Logic là sử mở rộng cơ bản từ Hoare Logic, trong đóbộ 3 Hoare
không gặp lỗi truy cậpbộ nhớ nếu chương trình được bắt đầu tại trạng thái thỏa mãn
Trang 36đảm bảo rằng tất cả địa chỉ vùng nhớ đều có thể truy cập bởi lệnh hay đều được cấp phát trước khi thao tác bởi các lệnh Trong thiết lập của Separation Logic, một địa
vùng nhớHeap được mô tả như sau:
1
Đọc giá trị từ ô nhớ Heap, trong đó
res là một biến đặc biệt biểu thị giá
trị kết quả của một biểu thức
2
Ghi giá trị xuống ô nhớ Heap
Bảng2 - Truy xuất trên vùng nhớ Heap Các tiền đề trên thể hiện các đặc điểm chính của Separation Logic Để phân tích một lệnh truy cập vùng nhớ Heap, cần phải chứng minh rõ ràng rằng địa chỉ vùng nhớ Heap phải được cấp phát và các địa chỉ Heap khác ngoài chương trình phải được bỏ qua Để thực hiện việc suy diễn cục bộ về chương trình, Separation
Logic bổ sung thêm quy tắc Frame:
không bao hàm thay đổi về trường vànhững biến thường sử dụng những trường này
thực hiện việc suy diễn mà không ảnh hưởng tới những phần khác của chương trình
Trang 372.3.2 Ngôn ngữchương trình
2.3.2.1 Ngữ pháp
Ngôn ngữ lập trìnhmục tiêu được sử dụng trong hệ thống của là loại ngôn ngữhoàn toàn hướng đối tượng có thể được xem như là thể hiện chocác ngôn ngữ lập trình phổ biến như C/C++, Java hay C# Ngữ pháp của nó được định nghĩanhưsau:
Hình2 - Ngôn ngữ chương trình Một chương trình sẽ bao gồm một danh sách kiểu dữ liệu được khai báo
dưới đây mô tả ý nghĩa của các ký hiệu cơ bản trong ngôn ngữ chương trình sử dụng:
Trang 387 Ký hiệu khai báo vị từ Shape (Sẽ được trình bày ở
chương tiếp theo)
Bảng3 - Ý nghĩa ký hiệu sử dụng trong ngôn ngữ chương trình
Để đơn giản trong cách trình bày nội dung mà không làm mất đi những thể hiện đặc trưng của ngôn ngữ chương trình sử dụng, trong luận văn thể hiện chương trình và những công thức đặc tả chương trình có dạng well-typed (sẽ được trình bày
Trong luận văn sử dụng khai báo dữ liệu node để thể hiện cho hầu hết các ví dụ:
pháp của nó sẽ được đề cập trong các phần tiếp theo của luận văn, ý nghĩa của việc
sử dụng cặp mô tả tiền/hậu điều kiện cho thủ tục là: Nếu một thủ tục được gọi trong trạng thái hiện tại của chương trình thỏa mãn tiền điều kiện của thủ tục, thì thủ tục
sẽ không truy xuất tới vùng bộ nhớ lỗi (vùng nhớ null hoặc con trỏ treo); hay nói cách khác, nếu thủ tục dừng thì nó sẽ dừng trong trạng thái chương trình thỏa mãn hậu điều kiện của thủ tục Vì thế nếu trạng thái chương trình không thỏa mãn tiền điều kiện thì sẽ dẫn đến phát sinh lỗi.Để đơn giản hóa vấn đề, quy định tên biến trong một thủ tục không được phép trùng lặp
Trong mỗi thủ tục, những tham số được truyền bởi tham trị sẽ được ký hiệu
Trang 39các ngôn ngữ lập trình hiện nay, ví dụ sau minh họa cho việc truyền tham trị mà
Sau đây là mô tả cho thuật toán sắp xếp chèn được sử dụng để minh họa cho các phần lý thuyết được trình bày trong luận văn:
Thủ tục insert sẽ thực hiện việc sắp xếp danh sách x và node vn vào đúng vị trí trong danh sách x Thủ tục insertion_sort thực hiện lời gọi đệ quytới phần đuôi của danh sách thông qua y.next, trước khi thực hiện việc chèn node đầu tiên của danh sách(y) thì danh sách đã được sắp xếp Phần đặc tả cho phương thức ký hiệu
làmspecsẽ được mô tả chi tiết trong mục kế tiếp
2.3.3 Ngôn ngữ đặc tả
Như đã trình bày ở phần trước, một chương trình P được khai báo bao gồm
danh sách kiểu dữ liệu tdecl và danh sách các thủ tục meth, những khai báo này có thể là những vị từ Shape spred hoặc những kiểu đối tượng objt.Mỗi thủ tục được thể
hiện dưới dạng:
Từ đó ta có một tập các cặp tiền/hậu điều kiện, mỗi cặp này được đặc tả dưới dạng nhiều vị từ Shape khác nhau từ đó cho ta thấy được cái nhìn tổng quan hành vi của mỗi thủ tục Ý nghĩa của một cặp tiền/hậu điều kiện là mỗi khi thủ tục được gọi
tục dừng hoặc kết thúc thì trạng thái chương trình tại thời điểm đó phải thỏa mãn
Trang 40hậu điều kiện , chúng ta sử dụng cách đặc tả tương tự cho thể hiện vòng lặp và các phương thức khởi tạo khác
Sử dụng một chú thích cơ bản để thể hiện giá trị hiện tại của những biến cục
bộ và thường hay xuất hiện trong hậu điều kiện của các vòng lặp