Luận văn: Kiểm chứng chương trình dựa trên SMT - ĐH Công nghệ, ĐHQGHN

Luận văn thạc sĩ: Nghiên cứu kiểm chứng chương trình bằng phương pháp dựa trên SMT. Phân tích, đánh giá tính đúng đắn và hiệu quả của chương trình.

Chuyên ngành

Công Nghệ Thông Tin

Người đăng

Ẩn danh

Thể loại

Luận văn thạc sĩ

2014

82
1
0

Phí lưu trữ

30 Point

Mục lục chi tiết

LỜI CAM ĐOAN

LỜI CẢM ƠN

MỤC LỤC

BẢNG CÁC THUẬT NGỮ VIẾT TẮT

DANH MỤC HÌNH VẼ

1. Chƣơng 1: Đảm bảo chất lƣợng phần mềm

1.1. Mục tiêu của luận văn

1.2. Nội dung luận văn

2. Chƣơng 2: KIỂM CHỨNG CHƢƠNG TRÌNH VÀ THỰC THI TƢỢNG TRƢNG

2.1. KIỂM CHỨNG CHƢƠNG TRÌNH

2.2. Tổng quan về kiểm chứng chương trình

2.3. Kiểm chứng mô hình

2.4. Thực thi tƣợng trƣng

2.5. Tổng quan về thực thi tượng trưng

2.6. Kỹ thuật thực thi tượng trưng động

2.7. Thực thi tƣợng trƣng động và giải pháp

3. SATISFIABILITY MODULO THEORIES (SMT)

3.1. Bài toán SAT

3.2. Thuật toán DPLL cho SAT

3.3. Bài toán của SMT

3.4. Thuật toán DPLL cho SMT

3.5. SMT solver Boolector, Z3, và STP

4. KIỂM CHỨNG DỰA TRÊN KLEE

4.1. Giới thiệu về khung làm việc của KLEE

4.2. Đầu vào của KLEE

4.3. Tối ưu hóa tập các ràng buộc với KLEE

4.4. Giải ràng buộc tự động với metaSMT

4.5. Độ bao phủ mã nguồn của ca kiểm thử đƣợc sinh bởi KLEE

4.6. Thực thi tƣơng trƣng động với KLEE

4.7. Thực thi tƣợng trƣng động và giải pháp của KLEE

4.8. Một số bài toán kiểm chứng và kiểm thử tự động dựa trên KLEE

4.9. Kiểm tra lỗi chia cho 0 trong chương trình

4.10. Phát hiện lỗi truy cập ra ngoài kích thước của mảng

4.11. Phát hiện lỗi hàm khi đột ngột gọi hàm abort

4.12. Sinh dữ liệu kiểm thử tự động

Tóm tắt

I. Tổng quan về Kiểm Chứng Chương Trình Dựa trên SMT

Máy tính và phần mềm máy tính ngày càng đóng vai trò quan trọng trong nhiều lĩnh vực. Đảm bảo chất lượng phần mềm trở nên thiết yếu, đặc biệt trong các lĩnh vực như y tế và hàng không vũ trụ, nơi sai sót nhỏ có thể gây ra hậu quả nghiêm trọng. Nhiều kỹ thuật được nghiên cứu và sử dụng để khẳng định tính đúng đắn của hệ thống. Hai kỹ thuật truyền thống là kiểm thử phần mềm và kiểm chứng phần mềm. Tuy nhiên, kiểm thử chỉ giảm thiểu lỗi mà không chứng minh được hệ thống không có lỗi. Kiểm chứng mô hình là một lựa chọn hiệu quả nhưng gặp vấn đề bùng nổ trạng thái khi thực hiện với các hệ thống lớn, phức tạp. Luận văn trình bày phương pháp kiểm chứng dựa trên SMT (SAT Modulo Theories) sử dụng thực thi tượng trưng (symbolic execution), một phương pháp thay thế cho kiểm chứng mô hình khi thực hiện với các hệ thống phức tạp. Mục tiêu của luận văn là tìm hiểu và trình bày về phương pháp kiểm chứng dựa trên SMT, có nhiều ưu điểm cho vấn đề bùng nổ trạng thái của kiểm chứng mô hình. Luận văn sẽ trình bày về công cụ KLEE, một công cụ kiểm chứng tự động sử dụng thực thi tượng trưng kết hợp với ba SMT solver hiệu quả: Z3, Boolector và STP. Tiếp theo, luận văn sẽ trình bày về ứng dụng của KLEE trong kiểm chứng một số thuộc tính của chương trình như phát hiện lỗi chia cho 0, lỗi tràn vùng đệm, lỗi truy cập ra ngoài kích thước của mảng,… Theo nghiên cứu của Lê Thị Hằng trong Luận văn Thạc Sĩ, "Việc đảm bảo chất lượng phần mềm trong các lĩnh vực như dịch vụ y tế hay vũ trụ hàng không lại càng được coi trọng. Bởi chỉ một sai sót nhỏ của hệ thống có thể gây ra những tổn thất to lớn về tính mạng con người cũng như về kinh tế". Luận văn gồm 4 chương, trong đó phần giới thiệu được trình bày trong chương 1. Chương 2 trình bày về kiểm chứng chương trình, thực thi tượng trưng và một số kỹ thuật thực thi tượng trưng hiện đại đang được áp dụng trong các công cụ kiểm chứng. Chương 3 trình bày về SMT, một công cụ giải các công thức logic trên lý thuyết vị từ cấp I và việc áp dụng SMT, thực thi tượng trưng để kiểm chứng chương trình trên một số lý thuyết cụ thể. Chương 4 trình bày về công cụ KLEE, thực nghiệm trên công cụ KLEE và các ứng dụng của nó trong việc kiểm chứng và phát hiện những lỗi của chương trình.

1.1. Mục tiêu của Luận Văn Thạc Sĩ về Kiểm Chứng SMT

Mục tiêu chính của luận văn là làm rõ phương pháp kiểm chứng chương trình dựa trên SMT. Phương pháp này được kỳ vọng sẽ giải quyết vấn đề bùng nổ trạng thái thường gặp trong các phương pháp kiểm chứng truyền thống như kiểm chứng mô hình. Luận văn đi sâu vào phân tích công cụ KLEE, một công cụ kiểm chứng tự động sử dụng thực thi tượng trưng kết hợp với các SMT solver mạnh mẽ như Z3, Boolector và STP. Bên cạnh đó, luận văn cũng sẽ trình bày các ứng dụng thực tế của KLEE trong việc phát hiện các lỗi phổ biến trong chương trình, bao gồm lỗi chia cho 0, lỗi tràn bộ đệm và lỗi truy cập mảng ngoài giới hạn. Bằng cách khám phá những khía cạnh này, luận văn hướng đến việc cung cấp một cái nhìn toàn diện về vai trò và tiềm năng của SMT trong việc nâng cao chất lượng và độ tin cậy của phần mềm. Việc sử dụng KLEE trong kiểm chứng giúp tự động hóa quy trình và đảm bảo độ bao phủ mã nguồn cao hơn.

1.2. Nội dung Chi Tiết của Nghiên Cứu Kiểm Chứng Chương Trình

Luận văn được cấu trúc thành bốn chương, mỗi chương tập trung vào một khía cạnh cụ thể của kiểm chứng chương trình. Chương đầu tiên giới thiệu tổng quan về chủ đề và đặt ra các mục tiêu nghiên cứu. Chương thứ hai đi sâu vào kiểm chứng chương trình, thực thi tượng trưng, và các kỹ thuật thực thi tượng trưng tiên tiến được sử dụng trong các công cụ kiểm chứng hiện đại. Chương thứ ba tập trung vào SMT, trình bày cơ sở lý thuyết và cách SMT solver giải quyết các công thức logic trong lý thuyết vị từ cấp I. Chương này cũng thảo luận về việc áp dụng SMTthực thi tượng trưng để kiểm chứng chương trình trên các lý thuyết cụ thể. Cuối cùng, chương thứ tư trình bày công cụ KLEE, cung cấp các kết quả thực nghiệm và minh họa các ứng dụng của KLEE trong việc kiểm chứng và phát hiện lỗi chương trình. Cấu trúc này được thiết kế để cung cấp một sự hiểu biết sâu sắc về kiểm chứng dựa trên SMT, từ lý thuyết cơ bản đến ứng dụng thực tế.

II. Kiểm Chứng và Thực Thi Tượng Trưng Hướng Dẫn Chi Tiết

Kiểm chứng chương trình là một trong những vấn đề quan trọng quyết định đến chất lượng phần mềm. Chương này trình bày về kiểm chứng chương trình, kỹ thuật kiểm chứng mô hình. Đồng thời trình bày về thực thi tượng trưng (symbolic execution), thực thi tượng trưng động và một số giải pháp khắc phục những vấn đề phát sinh trong thực thi tượng trưng. Hai kỹ thuật chủ yếu được áp dụng để đảm bảo chất lượng phần mềm hiện nay đó là kỹ thuật kiểm thử (Software testing) và kỹ thuật kiểm chứng (Software verification). Trong khi các kỹ thuật kiểm thử chỉ được thực hiện khi đã có mã nguồn hệ thống và cũng chỉ có khả năng phát hiện những lỗi hoặc khiếm khuyết của hệ thống mà không thể khẳng định được là chương trình không còn lỗi. Do đó, áp dụng kỹ thuật kiểm thử không thôi thì chưa đủ để đảm bảo chất lượng của hệ thống. Các kỹ thuật kiểm chứng có thể giải quyết được vấn đề này. Kiểm chứng là hoạt động giúp đánh giá một hệ thống phần mềm bằng cách xác định sản phẩm ở các pha phát triển có thỏa mãn các đặc tả yêu cầu phần mềm hoặc các thuộc tính của chương trình có thỏa mãn hay không?

2.1. Phân Tích Chi Tiết về Thực Thi Tượng Trưng Động Dynamic SE

Ý tưởng chính của các kỹ thuật thực thi tượng trưng động (dynamic symbolic execution) là sự xen kẽ giữa việc thực thi với các giá trị tượng trưng và thực thi với các giá trị cụ thể. Hai kỹ thuật thể hiện khá hiệu quả ý tưởng trên là Concolic Testing và Execution - Generated Testing (EGT). Concolic Testing là kỹ thuật kiểm tra theo hướng tự động ngẫu nhiên. Thực hiện việc động hóa thực thi tượng trưng. Trong chương trình thực thi trên một vài giá trị đầu vào cụ thể Concolic Testing sẽ duy trì đồng thời một trạng thái cụ thể và một trạng thái tượng trưng trong đó: Tập trạng thái cụ thể sẽ ánh xạ tất cả các biến có giá trị cụ thể. Tập trạng thái tượng trưng sẽ ánh xạ tất cả các biến không có giá trị cụ thể. Concolic Testing bắt đầu thực thi với một số đầu vào nhất định cho trước hoặc ngẫu nhiên. Tập các ràng buộc được tạo bởi đầu vào tượng trưng của câu lệnh điều kiện cũng được thực hiện. Execution Generated Testing (EGT) là kỹ thuật thực hiện với giá trị đầu vào cụ thể và giá trị đầu vào tượng trưng theo hai cách khác nhau của cùng một chương trình. EGT sẽ thực hiện hòa trộn giữa thực thi với giá trị cụ thể và thực thi với giá trị tượng trưng. Lợi thế chính của chúng nằm ở tính năng hòa trộn một cách thích hợp giữa thực thi cụ thể với thực thi tượng trưng. Một trong những lợi thế chính trong việc hòa trộn giữa thực thi tượng trưng với thực thi cụ thể là làm giảm thời gian chờ trong khi giải các ràng buộc của các SMT solver.

2.2. Vượt Qua Thách Thức của Bùng Nổ Đường Thực Thi

Kỹ thuật thực thi tượng trưng động sinh ra một lượng rất lớn các đường thực thi, đặc biệt với các chương trình lớn trong thực tế. Hai kỹ thuật chính được sử dụng để giải quyết vấn đề này là: Sử dụng kỹ thuật dựa trên kinh nghiệm để lựa chọn những đường thực thi tốt nhất và ưu tiên duyệt qua những đường này. Sử dụng kỹ thuật phân tích chương trình để làm giảm độ phức tạp của những đường đang duyệt. Xét ví dụ, cho trước tập ràng buộc trên một đường thực thi hiện tại của chương trình (kí hiệu là PC) như sau: PC = (x + y > 10) ∧ (z > 0) ∧ (y < 12). Chương trình tiếp tục duyệt đến câu lệnh điều kiện có ràng buộc (x – y < 2). Trong trường hợp này tập mới được ra (kí hiệu là PC’) có kết quả như sau: PC’ = (x + y > 10) ∧ (y < 12)  (x – y < 2). Trong đó, ràng buộc z > 0 đã bị loại bỏ vì không liên quan đến ràng x – y < 2. Trong thực tế, những tập ràng buộc sinh ra trong suốt quá trình thực thi tượng trưng động đôi khi giống nhau vì thế có cùng một cách giải quyết. Điều này có thể được cải thiện để làm tăng tốc độ giải các ràng buộc bằng cách sử dụng lại các kết quả của các truy vấn trước đó.Ví dụ, tiến hành giải tập ràng buộc sau: (x + y < 10) ∧ (x > 5) được kết quả là {x = 6, y = 3}. Ta tiến hành lưu kết quả này vào bộ nhớ phụ. Sau đó, khi gặp các tập con hoặc tập cha của tập này ta có thể sử dụng lại kết quả. Ví dụ {x = 6, y = 3} cũng thỏa mãn: (x + y < 10) ∧( x > 5) ∧ (y ≥ 0).

III. SMT Satisfiability Modulo Theories Giải Pháp Kiểm Chứng

Satisfiability Modulo Theories (SMT) được biết đến như là sự mở rộng của SAT đối với từng lý thuyết (Theory) nhất định. Trong việc xây dựng các công cụ kiểm chứng tự động SMT là thành phần được sử dụng nhiều và mang lại hiệu quả to lớn. SMT dựa trên tư tưởng của SAT solving nhưng cho các công thức của lý thuyết vị từ cấp I thay vì Logic mệnh đề của SAT solving. Trong chương này luận văn sẽ trình bày cụ thể hơn về SAT cũng như về SMT. Cụ thể hơn, luận văn sẽ đi sâu trình bày về bài toán SAT, thuật toán để giải bài toán SAT từ đó, mở rộng trình bày cho bài toán SMT và thuật toán để giải bài toán SMT dựa trên tư tưởng của SAT.

3.1. Ứng dụng Thuật Toán DPLL trong SMT Solver

Thủ tục DPLL (Davis Putnam Logemann Loveland năm 1962) mô tả các bước giải bài toán SAT. DPLL được sử dụng để tìm một phép gán thỏa mãn cho công thức F có dạng CNF. Phép gán được xác định dần từng bước một. Phép gán thành phần ở bước tiếp theo được xác định dựa trên phép gán thành phần ở bước hiện tại. Nếu việc tìm kiếm thất bại hoặc gặp phải trường hợp xung đột thì áp dụng luật backtrack (quay lui) ngay tại vị trí tìm kiếm thất bại. DPLL chính là thuật toán tìm kiếm theo chiều sâu. Với những cải tiến nhất định để khắc phục vấn đề về không gian trạng thái. Thủ tục DPLL thực hiện với đầu vào là một biểu thức F có định dạng CNF và thực hiện tính toán một chuỗi hữu hạn các trạng thái là các phép gán thỏa mãn cho các mệnh đề con của F. Trong đó, dl là biến kiểm tra để quyết định có quay lui không. Thủ tục DPLL áp dụng luật unit propagate để suy luận phép gán tiếp theo từ phép gán M hiện tại và công thức CNF hiện tại F. Luật decide được áp dụng khi không thể xác định được giá trị của một literal trong công thức F thông qua luật unit propagate. Luật Fail và luật backtrack được áp dụng khi xảy ra trường hợp không thỏa mãn khi một hoặc nhiều mệnh đề của công thức CNF F nhận giá trị sai trong phép gán hiện tại M.

3.2. So Sánh Boolector Z3 và STP Các SMT Solver Ưu Việt

Đối với một công cụ kiểm chứng tự động các SMT solver đóng vai trò quyết định hiệu suất thực hiện của công cụ đó. Trong phần tiếp theo luận văn trình bày một vài SMT solver được đánh giá là mang lại hiệu quả to lớn trong lĩnh vực kiểm chứng phần mềm. Cụ thể, phần tiếp theo trình bày ba SMT solver Boolecter, Z3, STP là những SMT solver được đánh giá cao về tốc độ xử lý trên nền tảng lý thuyết bitvector và mảng mở rộng. Boolector là bộ giải SMT miễn phí rất hiệu quả trên nền tảng lý thuyết không chứa phép lượng tử hóa tồn tại (), mọi () của Bit-Vector kết hợp với lý thuyết mở rộng của mảng. Boolector cung cấp mô hình cụ thể cho Bit-Vector và mảng. Boolector được đánh giá là SMT solver có hiệu suất thực hiện nhanh hơn so với Z3 khi tham gia cuộc thi giữa các SMT vào năm 2008 và 2009. Z3 là SMT solver mới được xây dựng bởi trung tâm nghiên cứu của Microsoft với mục tiêu là giải quyết các vấn đề phát sinh trong kiểm chứng và phân tích phần mềm. Do đó, nó tích hợp hỗ trợ một loạt các lý thuyết. STP được đánh giá SMT solver hiệu quả và có tốc độ thực thi nhanh so với các SMT solver khác.

IV. Ứng Dụng KLEE Trong Kiểm Chứng và Phát Hiện Lỗi

Trong chương này, luận văn trình bày công cụ kiểm chứng tự động KLEE, một công cụ sử dụng thực thi tượng trưng động kết hợp với các SMT solver để kiểm chứng một số thuộc tính của chương trình. Một số ứng dụng của KLEE sẽ được trình bày trong chương này bao gồm phát hiện lỗi chia cho không trong chương trình, phát hiện lỗi truy cập ngoài kích thước của mảng.

4.1. Tổng Quan Về Khung Làm Việc và Kiến Trúc của KLEE

KLEE được biết đến như là một công cụ thực thi tượng trưng mới có nhiều cải tiến so với các công cụ kiểm chứng dựa trên thực thi tượng trưng trước đây. Với khả năng tự động tạo ra các ca kiểm thử đảm bảo được độ bao phủ mã nguồn cao trên một môi trường cụ thể . Có khá nhiều lỗi khác nhau có thể kể đến như lỗi hàm hay lỗi chức năng và khó có thể chỉ ra những lỗi này mà không thực thi toàn bộ hoặc một phần mã nguồn. Khi chương trình thực thi với các giá trị tượng trưng thay vì chỉ đi theo một nhánh nhất định tùy thuộc vào giá trị cụ thể được đưa vào. Theo lý thuyết hệ thống sẽ thực hiện trên tất cả các nhánh có thể có, trên mỗi nhánh này duy trì một tập các ràng buộc được gọi là điều kiện rẽ nhánh (path condition). Khi kết thúc một đường thực thi gặp câu lệnh return hoặc gặp lỗi, một ca kiểm thử sẽ được sinh ra bằng cách giải một tập ràng buộc trên đường thực thi hiện tại.

4.2. Chi Tiết về Đầu Vào của KLEE và Quy Trình Biên Dịch

KLEE tiến hành kiểm chứng tự động trên mã nguồn của C và C++ với giá trị đầu vào tượng trưng thông quá trình biên dịch LLVM (LLVM complier) và môi trường tượng trưng hóa (Symbolic Environment) về dạng Bit – Vector để làm đầu vào cho KLEE. LLVM là một hạ tầng biên dịch được viết bởi ngôn ngữ C++ và STL [26]. LLVM được thực hiện với mục tiêu tối ưu hóa, tích hợp trình biên dịch AOT (ahead of time), JIT (just in time), thông dịch. Kiến trúc của trình biên dịch LLVM gồm 3 thành phần: LLVM suite, Clang front end và LLDB.

24/09/2025
Luận văn thạc sĩ kiểm chứng chương trình dựa trên smt

Trích đoạn nội dung tài liệu

chương 1. Chương 2 trình bày về kiểm chứng chương trình, thực thi tượng trưng và một số kỹ thuật thực thi tượng trưng hiện đại đang được áp dụng trong các công cụ kiểm chứng. Chương 3 trình bày về SMT một công cụ giải các công thức logic trên lý thuyết vị từ cấp I và việc áp dụng SMT, thực thi tượng trưng để kiểm chứng chương trình trên một số lý thuyết cụ thể. Chương 4 trình bày về công cụ KLEE, thực nghiệm trên công cụ KLEE và các ứng dụng của nó trong việc kiểm chứng và phát hiện những lỗi của chương trình.

Phần kết luận trình bày kết luận quá trình nghiên cứu, đưa ra các kết quả đạt được và hướng nghiên cứu tiếp theo. TIEU LUAN MOI download : skknchat@gmail.com 3 Chƣơng 2. KIỂM CHỨNG CHƢƠNG TRÌNH VÀ THỰC THI TƢỢNG TRƢNG Kiểm chứng chương trình là một trong những vấn đề quan trọng quyết định đến chất lượng phần mềm. Trong chương này luận văn trình bày về kiểm chứng chương trình, kỹ thuật kiểm chứng mô hình.

Đồng thời luận văn cũng trình bày về thực thi tượng trưng (symbolic execution), thực thi tượng trưng động và một số giải pháp khắc phục những vấn đề phát sinh trong thực thi tượng trưng. Kiểm chứng chƣơng trình Kiểm chứng chương trình là một trong những giai đoạn quan trọng trong quy trình sản xuất phần mềm. Các vấn đề tổng quan về kiểm chứng chương trình, kỹ thuật kiểm chứng mô hình sẽ được trình bày ngay sau đây. Tổng quan về kiểm chứng chƣơng trình Hai kỹ thuật chủ yếu được áp dụng để đảm bảo chất lượng phần mềm hiện nay đó là kỹ thuật kiểm thử (Software testing) và kỹ thuật kiểm chứng (Software verification).

Trong khi các kỹ thuật kiểm thử chỉ được thực hiện khi đã có mã nguồn hệ thống và cũng chỉ có khả năng phát hiện những lỗi hoặc khiếm khuyết của hệ thống mà không thể khẳng định được là chương trình không còn lỗi. Do đó, áp dụng kỹ thuật kiểm thử không thôi thì chưa đủ để đảm bảo chất lượng của hệ thống. Các kỹ thuật kiểm chứng có thể giải quyết được vấn đề này. Kiểm chứng [1] là hoạt động giúp đánh giá một hệ thống phần mềm bằng cách xác định sản phẩm ở các pha phát triển có thỏa mãn các đặc tả yêu cầu phần mềm hoặc các thuộc tính của chương trình có thỏa mãn hay không? Sản phẩm ở đây có thể hiểu là sản phẩm trung gian như: Đặc tả yêu cầu, thiết kế chi tiết, mã nguồn.

Những hoạt động kiểm tra tính đúng đắn của các pha phát triển được gọi là hoạt động kiểm chứng. Kiểm chứng trả lời cho câu hỏi “Hệ thống TIEU LUAN MOI download : skknchat@gmail.com 4 được xây dựng có đúng với đặc tả”. Mục đích của hoạt động kiểm chứng là xác thực xem đã xây dựng đúng sản phẩm. Về cơ bản, kiểm chứng hệ thống là kỹ thuật được áp dụng để xác minh tính đúng đắn của một thiết kế, một sản phẩm.

Đó là những đặc tả quy định các hành vi đã thực hiện của hệ thống và những gì hệ thống không thực hiện từ đó tạo cơ sở cho hoạt động kiểm chứng. Hệ thống được coi là đúng nếu nó thỏa mãn tất cả các thuộc tính thu được từ các đặc tả cụ thể của nó. Sơ đồ minh họa quá trình kiểm chứng được trình bày trong hình 2. Đặc tả (System Specification) Các thuộc tính (Properties) Quy trình thiết kế (Design Process) Kiểm chứng Sản phẩm hoặc bản thử (Verification) (product of prototype) Phát hiện lỗi Không tìm thấy (bug (s) found) lỗi (no bugs found) Hình 2.

Sơ đồ của hệ thống kiểm chứng [3] 2. Kiểm chứng mô hình Các kỹ thuật kiểm chứng đang được sử dụng hiện nay đó là áp dụng các phương pháp hình thức (formal methods). Mục đích của các phương pháp này là cố gắng chứng minh một cách tự động rằng chương trình sẽ thực thi đúng đắn TIEU LUAN MOI download : skknchat@gmail.com 5 trên mọi môi trường được đặc tả. Có thể kể đến một số phương pháp như: Phương pháp suy diễn (deductive methods), kiểm chứng mô hình (model checking), định kiểu chương trình (program typing), phân tích chương trình tĩnh (static program analysis).

Trong số các phương pháp kể trên, phương pháp kiểm chứng mô hình (model checking) là phương pháp ra đời khá sớm. Tuy nhiên, nó còn hạn chế là chỉ áp dụng được cho các hệ thống nhỏ. Phần tiếp theo sẽ tập trung trình bày về kỹ thuật này. Kỹ thuật kiểm chứng mô hình [3] là kỹ thuật mô tả những hành vi có thể có của hệ thống dưới dạng các công thức toán học rõ ràng, chính xác và biểu diễn hệ thống dưới dạng các trạng thái.

Kiểm chứng mô hình là kỹ thuật phát hiện lỗi chương trình theo cách thức vét cạn tất cả các trạng thái có thể có của hệ thống. Các công cụ kiểm chứng phần mềm mà sử dụng kỹ thuật kiểm chứng mô hình sẽ tiến hành kiểm tra tất cả những kịch bản có thể có của hệ thống. Bằng cách này, nó có thể chỉ ra rằng mô hình hệ thống có thật sự thỏa mãn các thuộc tính nhất định. Những thuộc tính của chương trình được kiểm tra bằng cách sử dụng mô hình có tính chất định tính như: Kết quả sinh ra liệu có chính xác.

Liệu hệ thống có gặp phải tình huống deadlock, ví dụ hai tiến trình cùng tiến hành chờ đợi nhau dẫn đến sự bế tắc của hệ thống. Kiểm chứng mô hình đòi hỏi phải có một khẳng định chính xác về các thuộc tính đã được kiểm tra của hệ thống. Việc mô hình hóa hệ thống một cách chính xác thường phát hiện được những lỗi tiềm ẩn của hệ thống. Các mô hình hệ thống thường được tự động tạo ra từ một mô tả về mô hình được thể hiện cho từng ngôn ngữ lập trình như C, Java hoặc ngôn ngữ mô tả phần cứng như Verilog.

Cần lưu ý rằng đặc tả thuộc tính quy định cái gì hệ thống nên làm và cái gì hệ thống không nên làm. Trong khi mô hình hóa hệ thống lại kiểm tra tất cả các trạng thái liên quan để kiểm tra xem chúng có thỏa mãn cái mà thuộc tính mong muốn. Phản ví dụ (Counterexample) mô tả một đường thực thi từ trạng thái khởi tạo của hệ thống tới trạng thái vi phạm thuộc TIEU LUAN MOI download : skknchat@gmail.com 6 tính đang được kiểm chứng. Cùng với sự trợ giúp của mô phỏng người sử dụng có thể xem lại kịch bản vi phạm, theo cách này thu thập thông tin gỡ lỗi hữu ích và phù hợp với mô hình.

Cách tiếp cận về kiểm chứng mô hình xem hình 2. Đặc tả Hệ thống (requirements) (System) (Hình thức Mô hình hóa hóa) (Modeling) Formalizing Đặc tả thuộc tính Mô hình hóa hệ (Property Specification) thống (System model) Kiểm chứng mô hình (Model Checking) Vi phạm + phản Mô phỏng Thỏa mãn ví dụ (Violated (Simulation) (Satisfied) + counterexample ) Lỗi cụ thể (local error) Hình 2. Mô hình hóa cách tiếp cận của kiểm chứng mô hình [3] Quy trình thực hiện của kiểm chứng mô hình được thể hiện qua các pha sau đây: TIEU LUAN MOI download : skknchat@gmail.com 7  Pha mô hình hóa (modeling phase): Điều kiện tiên quyết của các đầu vào của kiểm chứng mô hình là mô hình của hệ thống đang được xem xét và đặc trưng hình thức hóa của các thuộc tính được kiểm tra. Mô hình của hệ thống mô tả hành vi của hệ thống một cách rõ ràng chính xác.

Nó thường thể hiện bằng ôtômát hữu hạn bao gồm một tập hữu hạn các trạng thái và hàm chuyển tương ứng. Trạng thái bao gồm thông tin về các giá trị hiện tại của các biến, câu lệnh được thực hiện trước đó. Hàm chuyển mô tả cách thức để chuyển từ trạng thái hiện thời sang trạng thái khác. Để việc kiểm chứng cho kết quả đúng, các thuộc tính ở đầu vào cũng nên được mô tả một cách chính xác và rõ ràng.

Để làm được điều này thì sử dụng ngôn ngữ đặc tả thuộc tính. Sử dụng logic thời gian (temporal logic) là cách thức hiệu quả để đặc tả thuộc tính.  Pha thực thi: Chạy bộ công cụ kiểm chứng để kiểm tra tính hợp lệ của các thuộc tính trong mô hình hệ thống.  Pha phân tích: + Nếu một thuộc tính thỏa mãn thì tiếp tục với thuộc tính tiếp (nếu có).

+ Nếu thuộc tính vi phạm thực hiện: - Phân tích và sinh ra phản ví dụ bằng mô phỏng. - Cải tiến mô hình, cải tiến thiết kế hoặc thuộc tính. - Lặp lại toàn bộ thủ tục. + Nếu truy nhập ngoài bộ nhớ thì cố gắng giảm thiểu mô hình và thử lại.

Như đã trình bày ở trên, kỹ thuật kiểm chứng mô hình [16] được đánh giá là kỹ thuật hiệu quả được sử dụng nhiều trong các công cụ kiểm chứng với những ưu điểm sau: - Là kỹ thuật có thể thực hiện hoàn toàn tự động. - Thuật toán kiểm chứng mô hình sẽ kết thúc với câu trả lời đúng và đưa ra một mô hình cụ thể. Hoặc chỉ ra một phản ví dụ (counterexamples) là lý do tại sao biểu thức là không thỏa mãn. Các TIEU LUAN MOI download : skknchat@gmail.com 8 phản ví dụ đóng vai trò đặc biệt quan trọng trong việc phát hiện các lỗi của các hệ thống chuyển phức tạp.

- Thực hiện nhanh, cụ thể nó có thể thực hiện trên từng phần của hệ thống. Do đó, có thể tập trung vào những phần có nguy cơ phát sinh lỗi cao trước. Khi một trường hợp là không thỏa mãn, các công thức khác không thuộc trường hợp đó có thể được kiểm tra để xác định nguồn gốc của lỗi. - Cuối cùng, lý thuyết logic được sử dụng trong kỹ thuật này đóng vai trò quan trọng.

Nó thể hiện nhiều tính chất cần thiết cho lý luận về hệ thống hiện thời. Tuy nhiên kiểm chứng mô hình (model checking) cũng có những điểm hạn chế như sau: - Phương pháp này chủ yếu thích hợp với các ứng dụng điều khiển hơn là các ứng dụng hướng dữ liệu bởi vì dữ liệu thường vượt quá các miền vô hạn. - Nó chỉ kiểm tra các yêu cầu đã được trạng thái hóa. Nó không đảm bảo tính toàn vẹn.

Tính hợp lý của các thuộc tính không được kiểm chứng có thể không được đảm bảo. - Phương pháp này gặp phải trở ngại lớn nhất đó là vấn đề bùng nổ không gian trạng thái, số các trạng thái cần cho mô hình hệ thống có thể vượt quá bộ nhớ của máy vi tính. - Nó không đảm bảo cho ra kết quả chính xác hoàn toàn vì cũng như các công cụ khác thì bộ kiểm chứng cũng là một phần mềm và có thể có lỗi.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ