Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 55 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
55
Dung lượng
1,3 MB
Nội dung
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ PHÙNG THANH SƠN MỞ RỘNG JAVAPATHFINDER VỚI Z3 ĐỂ SINH TỰ ĐỘNG DỮ LIỆU KIỂM THỬ CHƯƠNG TRÌNH JAVA LUẬN VĂN THẠC SĨ Hà Nội - 2010 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ PHÙNG THANH SƠN MỞ RỘNG JAVAPATHFINDER VỚI Z3 ĐỂ SINH TỰ ĐỘNG DỮ LIỆU KIỂM THỬ CHƯƠNG TRÌNH JAVA NGÀNH: CÔNG NGHỆ THÔNG TIN CHUYÊN NGÀNH: CÔNG NGHỆ PHẦN MỀM MÃ SỐ: 60 48 10 LUẬN VĂN THẠC SĨ NGƢỜI HƢỚNG DẪN KHOA HỌC: TIẾN SĨ TRƢƠNG ANH HOÀNG Hà Nội - 2010 MỤC LỤC MỞ ĐẦU 1 CHƢƠNG 1- JPF VÀ THỰC THI TƢỢNG TRƢNG 3 1.1 Giới thiệu về JPF 3 1.1.1 JPF có thể kiểm tra những chương trình gì? 4 1.1.2 Kiến trúc mức cao của JPF 5 1.1.3 Khả năng mở rộng của JPF 6 1.1.4 Một số mở rộng của JPF 8 1.2 Thực thi tượng trưng để sinh dữ liệu kiểm thử 9 1.2.1 Thực thi tượng trưng là gì? 9 1.2.2 Thực thi tượng trưng với JPF 10 1.2.3 Hướng dẫn thực thi tượng trưng với JPF 11 1.2.4 Hạn chế 19 CHƢƠNG 2- MICROSOFT Z3 21 2.1 SMT là gì 21 2.2 Z3 là gì 21 2.3 Tại sao lại là Z3? 22 2.4 Kiến trúc của Z3 22 2.5 Định dạng đầu vào 24 2.6 Định dạng SMT-LIB 24 2.6.1 Các chức năng chính của SMT-LIB. 24 2.7 Các quan hệ, hàm, và hằng số. 25 2.7.1 Tất cả các hàm là tuyệt đối (total) [10] 25 2.7.2 Hàm không dịch (uninterpreted function) và hằng số 26 2.7.3 Hàm đệ quy 27 2.8 Số học 27 2.8.1 Số học tuyến tính thực 27 2.8.2 Số học tuyến tính nguyên 27 2.8.3 Trộn giữa số nguyên và số thực. 28 2.8.4 Số học phi tuyến tính 28 2.9 Kiểu dữ liệu 29 2.9.1 Kiểu bản ghi 29 2.9.2 Kiểu liệt kê (enumeration) 29 2.9.3 Kiểu dữ liệu đệ qui. 29 2.10 Ví dụ về Z3 30 2.11 Một vài ứng dụng của Z3 30 CHƢƠNG 3- MỞ RỘNG JPF VỚI Z3 32 3.1 Nghiên cứu, đánh giá các giải pháp 32 3.2 Kiến trúc hệ thống 32 3.3 Chuyển đổi dữ liệu 33 3.4 Thiết kế và cài đặt 37 3.5 Kết quả và đánh giá 39 CÁC NGHIÊN CỨU LIÊN QUAN 44 KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN CỦA ĐỀ TÀI 45 TÀI LIỆU THAM KHẢO 47 DANH MỤC CÁC BẢNG BIỂU VÀ HÌNH VẼ Hình 1-1: Mô hình hoạt động của JPF [6] 3 Hình 1-2: Sơ đồ trạng thái trong quá trình kiểm thử 5 Hình 1-3: Kiến trúc mức cao [6] 6 Hình 1-4: Mẫu Listener [6] 7 Hình 1-5: Ví dụ về thực thi tượng trưng 10 Hình 1-6: Đầu ra trên Eclipse cho MyClass1 [6] 13 Hình 2-1: Kiến trúc của Z3 [11] 23 Hình 3-1: Kiến trúc hệ thống 33 Hình 3-2: Sơ đồ mức gói 37 Hình 3-3: Biểu đồ trình tự 38 Hình 3-4: Sơ đồ lớp tổng quát 38 Hình 3-5: Kết quả với Choco - số học tuyến tính 40 Hình 3-6: Kết quả với Z3 - số học tuyến tính. 41 Hình 3-7: Kết quả với Choco – số học phi tuyến tính 42 Hình 3-8: Kết quả với Z3 – số học phi tuyến tính 43 BẢNG KÝ HIỆU CÁC TỪ VIẾT TẮT Viết tắt Thuật Ngữ Giải thích JPF JavaPathFinder Tên một phần mềm mã nguồn mở được sử dụng trong luận văn SMT Satisfiability Modulo Theories Lý thuyết tính thỏa được PC Path Condition Điều kiện đường đi trong 1 chương trình phần mềm SMT - LIB Satisfiability Modulo Theories Library Một thư viện chuẩn được sử dụng cho lý thuyết tính thỏa được JVM Java Virtual Machine Máy ảo Java 1 MỞ ĐẦU ĐẶT VẤN ĐỀ Trong những năm gần đây, việc phát triển phần mềm ngày càng được chuyên nghiệp hóa. Các phần mềm được phát triển ngày càng có quy mô lớn. Yêu cầu đảm bảo chất lượng phần mềm là một trong những mục tiêu quan trong nhất, đặc biệt trong một số lĩnh vực như y khoa, ngân hàng, hàng không… Việc kiểm thử phần mềm một cách thủ công chỉ đảm bảo được phần nào chất lượng của phần mềm. Vì vậy rất nhiều các tổ chức, công ty đã nghiên cứu và phát triển các lý thuyết cũng như công cụ để kiểm chứng, kiểm thử phần mềm một cách tự động. Kiểm thử tự động không chỉ giúp giảm chi phí phát triển phần mềm mà còn làm tăng tính linh động của các phần mềm hiện đại. Người ta ước lượng rằng chi phí cho các dự án phần mềm thất bại ở Mỹ là khoảng 60 tỉ USD hàng năm, và việc cải tiến các phương thức để kiểm thử phần mềm có thể tiết kiệm được 1/3 chi phí trên [12]. Xuất phát từ nhu cầu thực tế trên, tác giả đã nghiên cứu một số lý thuyết, công cụ trong việc kiểm thử phần mềm. Một lý thuyết nền tảng rất quan trọng đó là lý thuyết về tính thỏa được, viết tắt là SMT (Satisfiability Modulo Theories). Lý thuyết về tính thỏa được đã được ứng dụng để giải quyết nhiều bài toán trong công nghệ phần mềm như: Kiểm chứng chương trình Khám phá chương trình Mô hình hóa phần mềm Sinh các ca kiểm thử Hiện nay Microsoft Z3 là một công cụ tìm lời giải cho SMT đang được áp dụng trong nhiều dự án của Microsoft như: Pex, Spec#, SLAM/SDV, Yogi. Z3 được đánh giá là một trong những công cụ tìm lời giải mạnh nhất hiện nay. Tuy nhiên Z3 chỉ được áp dụng cho các ngôn ngữ của Microsoft. Vì vậy tác giả đặt ra vấn đề: Liệu có thể sử dụng Z3 để kiểm thử cho các chương trình viết bằng ngôn ngữ khác như Java? Trong quá trình nghiên cứu về kiểm chứng, kiểm thử phần mềm tác giả cũng có tìm hiểu về JavaPathFinder (JPF). JPF là một dự án mã nguồn mở được phát triển trên ngôn ngữ Java. Hiện nay có một mở rộng của JPF trong việc sinh tự động dữ liệu đầu vào để kiểm thử chương trình. Tuy nhiên còn rất nhiều hạn chế, vì vậy tác giả đã nghĩ đến việc làm sao để tích hợp được Z3 với JPF để có thể sinh tự động dữ liệu kiểm thử chương trình. Nếu việc tích hợp thành công thì sẽ dẫn tới 2 việc giải quyết được lớp bài toán rộng hơn. Điều này là rất có ý nghĩa đối với thực tế. MỤC TIÊU CỦA ĐỀ TÀI Mục tiêu của đề tài là nghiên cứu nắm bắt rõ về Z3 và JPF. Sau đó bước đầu tích hợp thành công Z3 vào JPF (mở rộng JPF với Z3) để có thể sinh tự động dữ liệu kiểm thử chương trình Java cho các bài toán mà hiện nay JPF không thể thực hiện được. (ví dụ: sinh tự động dữ liệu cho số học phi tuyến tính). CẤU TRÚC CỦA LUẬN VĂN Luận văn bao gồm các phần sau: Mở đầu: Giới thiệu về đề tài, tính cấp thiết cũng như mục tiêu của đề tài Chƣơng 1: JPF và Thực thi tượng trưng Nội dung: Trong chương này tác giả sẽ trình bày những hiểu biết về JPF và thực thi tượng trưng, JPF sẽ thực thi tượng trưng để sinh dữ liệu kiểm thử ra sao. Ngoài ra tác giả cũng giới thiệu một số mở rộng của JPF đang được phát triển hiện nay. Chƣơng 2: Microsoft Z3 Nội dung: Giới thiệu về dự án của Microsoft đang được quan tâm hiện nay đó là Z3. Trong phần này tác giả sẽ trình bày các chức năng chính và một số ứng dụng của Z3, cũng như các API mà Z3 hỗ trợ để từ đó có thể tích hợp với JPF. Chƣơng 3: Mở rộng JPF với Z3 Nội dung: Dựa trên kết quả của chương 1 và 2, trong phần này tác giả sẽ đánh giá và đưa ra các giải pháp để mở rộng JPF với Z3. Sau khi đã có giải pháp sẽ tiến hành thiết kế kiến trúc hệ thống, sau đó chi tiết hóa sang mức gói, mức lớp cuối cùng là cài đặt và đánh giá kết quả. Các nghiên cứu liên quan Phần này tác giả sẽ trình bày một số nghiên cứu khác liên quan đến luận văn, đó là các công cụ Pex, AgitarOne, Cute trong việc tự động kiểm thử chương trình. Kết luận và hƣớng phát triển của luận văn Trình bày kết quả sau khi nghiên cứu, những hạn chế và hướng phát triển tiếp theo. 3 CHƢƠNG 1- JPF VÀ THỰC THI TƢỢNG TRƢNG Trong chương này sẽ bao gồm 2 phần chính. Phần 1 giới thiệu về JPF, một dự án mã nguồn mở được viết bằng ngôn ngữ Java để kiểm chứng mô hình. Phần 2 giới thiệu một mở rộng của JPF đó là thực thi tượng trưng trong việc sinh tự động dữ liệu để kiểm thử chương trình Java. 1.1 Giới thiệu về JPF JPF là một bộ kiểm tra mô hình phần mềm trạng thái tường minh cho Java [6]. Hiểu một cách cơ bản JPF là một máy ảo thực thi chương trình Java không chỉ một lần (giống như các máy ảo thông thường), mà thực thi trong tất cả các nhánh, các đường đi có thể. JPF sẽ kiểm tra các vi phạm thuộc tính như khóa chết hoặc các ngoại lệ không thể bắt được xuyên xuốt các đường thực thi tiềm năng. Hình 1-1 mô tả mô hình hoạt động của JPF. Hình 1-1: Mô hình hoạt động của JPF [6] Về lý thuyết điều này là rất khả thi, tuy nhiên với việc tăng kích cỡ của ứng dụng, phần mềm kiểm chứng mô hình phải đối mặt với nhiều thách thức. JPF cũng không là ngoại lệ. Câu trả lời của chúng ta đó là tăng sự linh hoạt của JPF để thích 4 nghi với một ứng dụng cụ thể. Chúng ta có thể coi JPF như là một Framework và từ đó phát triển mở rộng để có thể giải quyết được bài toán cụ thể mà chúng ta muốn. 1.1.1 JPF có thể kiểm tra những chƣơng trình gì? JPF có thể kiểm tra tất cả các chương trình Java. JPF có thể tìm ra các khóa chết hoặc ngoại lệ. Ngoài ra chúng ta có thể tự phát triển mở rộng để kiểm tra các thuộc tính khác. Để hiểu rõ hơn về JPF chúng ta có thể xét ví dụ sau: Tạo một lớp là Rand như bên dưới, sau đó chúng ta sẽ dùng JPF để kiểm tra xem có lỗi không. import java.util.Random; public class Rand { public static void main (String[] args) { Random random = new Random(42); // (1) int a = random.nextInt(2); // (2) System.out.println("a=" + a); int b = random.nextInt(3); // (3) System.out.println(" b=" + b); int c = a/(b+a -2); // (4) System.out.println(" c=" + c); } } Hoạt động của lớp trên đó là khởi tạo 2 biến a và b một cách ngẫu nhiên trong các khoảng tương ứng là [0,2] và [0,3]. Sau đó có một biến c có giá trị được xác định bằng công thức c = a/(b+a-2). Nếu ta chạy chương trình Java này thông thường thì có thể thấy kết quả là: a = 1, b =0, và c = -1. Như vậy chương trình là không có lỗi. Tuy nhiên nếu ta sử dụng JPF để kiểm tra chương trình trên thì sẽ thấy như hình 1-2: [...]... với JPF Thực thi tượng trưng là một mở rộng của JPF Mở rộng này của JPF sẽ thực thi tượng trưng các chương trình java Một trong những ứng dụng chính của mở rộng này, đó là tự động sinh dữ liệu kiểm thử bao phủ toàn bộ chương trình của mã nguồn [6] 11 Mở rộng này phối hợp thực thi tượng trưng với kiểm chứng mô hình và các ràng buộc giải quyết để sinh dữ liệu kiểm thử Trong công cụ này, các chương trình. .. chính của mở rộng này là cải tiến khả năng của JPF, nó có thể được sử dụng để sinh ra môi trường giả định cho kiểm chứng mô hình UML, để xác định các trình tự sự kiện đúng numeric - Numeric Property Verification Mở rộng này được sử dụng để kiểm chứng các thuộc tính của số học Ban đầu mở rộng được sử dụng như như một tập các lớp chỉ thị số học để phát hiện tràn bộ nhớ, sau đó được mở rộng để kiểm chứng... sánh dấu phẩy động chính xác (floating point comparison) statechart - UML State Chart Model Checking Mục đích của mở rộng này là kiểm tra lược đồ chuyển trạng thái UML Trong mở rộng này mỗi một biểu đồ chuyển trạng thái sẽ được biểu diễn tương ứng với một lớp Java (hoặc nhiều lớp) Sau đó quá trình kiểm tra sẽ là kiểm tra các lớp Java đó 9 1.2 Thực thi tượng trưng để sinh dữ liệu kiểm thử 1.2.1 Thực... các chương trình Swing và AWT Mở rộng này được cài đăt như một thư viện chuẩn được mô hình hóa MJI (MJI Là viết tắt của: Model Java Interface) nhằm thay thế các chức năng của Swing và AWT để mà các ứng dụng giao diện sử dụng chuẩn của Java có thể được kiểm thử với các đầu vào khác nhau symbc - Symbolic Test Data Generation Mở rộng này sử dụng BytecodeFactory để ghi đè lõi (core) JPF bytecodes nhằm sinh. .. này là ta có thể thực thi tại bất kỳ điểm nào trong chương trình và có thể trộn giữa đầu vào tượng trưng với đầu vào cụ thể Phương pháp này sẽ cho ta các điều kiện đường đi của chương trình, và với việc sử dụng các công cụ tìm lời giải cho các điều kiện đường đi (coi mỗi điều kiện đường đi là một biểu thức) sẽ sinh ra dữ liệu kiểm thử cho chương trình Tuy nhiên phương pháp này cũng có giới hạn đó là... bytecodes nhằm sinh ra các ca kiểm thử riêng biệt Nói tóm lại nó hoạt động bằng cách sử dụng các thuộc tính/ trường của JPF để thu thập các điều kiện đường đi PC, sau đó được đưa các PC vào một hệ thống tìm lời giải theo định dạng của hệ thống đó để đưa ra dữ liệu kiểm thử Mở rộng này sẽ được trình bày chi tiết hơn ở phần 1.2 cv - Compositional Verification Framework Mở rộng này là một thuật toán học máy... của nó để lấy các thông tin cài đặt cụ thể 8 Internal - listener cư trú trong các gói cài đặt Subject riêng biêt và truy cập các thông tin riêng của gói (private) 1.1.4 Một số mở rộng của JPF Với kiến trúc mở rộng linh hoạt, hiện nay đã có một số mở rộng được phát triển cho JPF ui - User Interface Model Checking Đây là mở rộng cho việc kiểm tra mô hình một lớp đặc biệt của các ứng dụng Java đó... của chương trình và biểu diễn chúng như là các biểu thức và sử dụng các công cụ tìm lời giải để xác định những đầu vào để kiểm thử Z3 là một sự phù hợp tốt cho thực thi tương trưng bởi vì các ngữ nghĩa của hầu hết các câu lệnh có thể được mô hình hóa dễ dàng bằng cách sử dụng các lý thuyết được hỗ trợ bởi các công cụ đó Kiểm chứng mô hình chương trình Thực thi tượng trưng tự động sẽ tìm các đầu vào để. .. nghĩ đến việc làm sao mở rộng được JPF bằng cách sử dụng công cụ lời giải khác mạnh hơn Qua quá trình tìm hiểu các công cụ tìm lời giải hiện nay, Z3 nổi lên là một trong những công cụ tìm lời giải tốt nhất Trong chương tiếp theo của luận văn sẽ trình bày chi tiết về Microsoft Z3 21 CHƢƠNG 2- MICROSOFT Z3 Z3 là một công cụ tìm lời giải cho SMT đang được Microsoft phát triển Hiện nay Z3 được đánh giá là... các kiểu dữ liệu trên Z3 còn hỗ trợ nhiều kiểu dữ liệu khác như kiểu bit-vector, kiểu mảng…Chi tiết về những kiểu này có thể tham khảo ở tài liệu [10] 2.10 Ví dụ về Z3 Z3 có khả năng đưa ra mô hình như một phần của đầu ra Các mô hình sẽ gán các giá trị cho các hằng số trong đầu vào và sinh các lược đồ chức năng từng phần cho các ký hiệu vị từ và ký hiệu phương thức Sau đây là một ví dụ về Z3, giả sử . NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ PHÙNG THANH SƠN MỞ RỘNG JAVAPATHFINDER VỚI Z3 ĐỂ SINH TỰ ĐỘNG DỮ LIỆU KIỂM THỬ CHƯƠNG TRÌNH JAVA LUẬN VĂN THẠC SĨ Hà Nội. NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ PHÙNG THANH SƠN MỞ RỘNG JAVAPATHFINDER VỚI Z3 ĐỂ SINH TỰ ĐỘNG DỮ LIỆU KIỂM THỬ CHƯƠNG TRÌNH JAVA NGÀNH: CÔNG NGHỆ THÔNG TIN CHUYÊN NGÀNH: CÔNG NGHỆ. một mở rộng của JPF. Mở rộng này của JPF sẽ thực thi tượng trưng các chương trình java. Một trong những ứng dụng chính của mở rộng này, đó là tự động sinh dữ liệu kiểm thử bao phủ toàn bộ chương