1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tìm hiểu về Java Path Fide ( JPF)

49 638 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Cấu trúc

  • MỞ ĐẦU

  • CHƯƠNG 1- CƠ SỞ LÝ LUẬN

    • 1.1 Tổng quan kiểm định phần mềm

    • 1.2 Các nhóm kiểm định phần mềm

  • CHƯƠNG 2- JAVA PATH FINDER VÀ THỰC THI TƯỢNG TRƯNG

    • 2.1 Giới thiệu về JPF

      • 2.1.1 JPF có thể kiểm tra những chương trình gì?

      • 2.1.2 Kiến trúc mức cao của JPF

      • 2.1.3 Khả năng mở rộng của JPF

      • 2.1.4 Một số mở rộng của JPF

    • 2.2 Thực thi tượng trưng để sinh dữ liệu kiểm thử

      • 2.2.1 Thực thi tượng trưng là gì?

      • 2.2.2 Thực thi tượng trưng với JPF

      • 2.2.3 Hướng dẫn thực thi tượng trưng với JPF

        • 2.2.3.1 Một ví dụ đơn giản

        • 2.2.3.2 Lọc các trường hợp kiểm thử

        • 2.2.3.3 Bổ sung tiền điều kiện

        • 2.2.3.4 Các tham số thực

        • 2.2.3.5 Các thuộc tính của đối tượng

      • 2.2.4 Hạn chế

  • CHƯƠNG 3- MICROSOFT Z3

    • 3.1 SMT là gì

    • 3.2 Z3 là gì

    • 3.3 Tại sao lại là Z3?

    • 3.4 Kiến trúc của Z3

    • 3.5 Định dạng đầu vào

    • 3.6 Định dạng SMT-LIB

      • 3.6.1 Các chức năng chính của SMT-LIB.

    • 3.7 Các quan hệ, phương thức, và hằng số.

      • 3.7.1 Tất cả các phương thức là tuyệt đối ( total)

      • 3.7.2 Uninterpreted function và hằng số

      • 3.7.3 Phương thức đệ quy

    • 3.8 Số học

      • 3.8.1 Sô học tuyến tính thực

      • 3.8.2 Số hoc tuyến tính nguyên

      • 3.8.3 Trộn giữa số nguyên và số thực.

      • 3.8.4 Số học phi tuyến tính

    • 3.9 Kiểu dữ liệu

      • 3.9.1 Kiểu bản ghi

      • 3.9.2 Kiểu liệt kê ( enumeration)

      • 3.9.3 Kiểu dữ liệu đệ qui.

    • 3.10 Ví dụ về Z3

    • 3.11 Một vài ứng dụng của Z3

  • CHƯƠNG 4- TÍCH HỢP Z3 VỚI JPF

    • 4.1 Nghiên cứu đánh giá các giải pháp

    • 4.2 Kiến trúc hệ thống

    • 4.3 Chuyển đổi dữ liệu

    • 4.4 Thiết kế và cài đặt

    • 4.5 Kết quả và đánh giá

  • KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN CỦA ĐỀ TÀI

  • TÀI LIỆU THAM KHẢO

Nội dung

Tìm hiểu về Java Path Fide ( JPF)

1 MỤC LỤC DANH MỤC CÁC HÌNH 2 MỞ ĐẦU 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ử, kiểm chứng 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. 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 chứng và 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à 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 chứng 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 chương trình 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 3 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 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 đề 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à JPF để 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: Cơ sở lý luận Chương 2: JPF và Thực thi tượng trưng Nội dung: Giới thiêu JPF là gì? Kiến trúc của JPF, cách mở rộng, phát triển trên JPF. Ngoài ra còn một phần rất quan trọng đó là giới thiệu về thực thi tượng trưng để sinh dữ liệu kiểm thử cho chương trình trong JPF. Mở rộng này sẽ cho phép sinh tự động dữ liệu kiểm thử chương trình Java. Chương 3: Microsoft Z3 Nội dung: Giới thiệu về lý thuyết tính thỏa được SMT, Z3, các lý thuyết được hỗ trợ trên Z3, các API của Z3 để tích hợp với JPF, các ứng dụng của Z3. Chương 4: Tích hợp JPF với Z3 Nội dung: Nghiên cứu, đánh giá các giải pháp. Sau khi đã có giải pháp 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ả. 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, triển khai và hướng phát triển tiếp theo. 4 CHƯƠNG 1- CƠ SỞ LÝ LUẬN 1.1 Tổng quan kiểm định phần mềm Như chúng ta đã biết, việc kiểm thử phần mềm là một khâu không thể thiếu trong các bước phát triển phần mềm, đặc biệt các phần mềm lớn, nhiều module do nhiều người phát triển, dễ sinh ra các lỗi tiềm ẩn mà nhà phát triển không thể lường trước. Trong lĩnh vực kiểm định chất lượng phần mềm hiện nay trên thế giới, hiện có nhiều kỹ thuật nhưng tựu chung có thể phân theo ba nhóm chính: Phân tích mã nguồn tĩnh (static code analysis), kiểm thử dữ liệu động (dynamic data testing) và kỹ thuật hình thức dựa trên mô hình (model-based verification). Hai nhóm đầu tập trung vào việc nâng cao chất lượng phần mềm tại mức mã nguồn, trong khi nhóm cuối cùng xử lý phần mềm tại mức trừu tượng cao hơn – mô hình. 1.2 Các nhóm kiểm định phần mềm Phân tích mã nguồn tĩnh là kỹ thuật phát hiện lỗi chương trình mà không yêu cầu chạy chương trình đó. Không giống như kỹ thuật kiểm thử dữ liệu động đòi hỏi phải chạy chương trình với dữ liệu đầu vào thật, kỹ thuật phân tích mã nguồn tĩnh chỉ xem xét mã nguồn của chương trình. Kỹ thuật kiểm thử phần mềm dựa trên mô hình: khác với hai nhóm ở trên ở điểm đối tượng được kiểm thử là các mô hình được trừu tượng hóa từ hệ thống được xem xét. Quá trình trừu tượng hóa là việc lược bỏ những chi tiết của hệ thống trong khi chỉ giữ lại những thông tin/khía cạnh quan trọng cần được lưu tâm. Kỹ thuật trừu tượng hóa đơn giản hóa hệ thống được xem xét và do đó giảm không gian tìm kiếm và thời gian phân tích chương trình đi nhiều lần so với lúc thực hiện công việc phân tích đó trên mã nguồn. 5 Khi xây dựng xong phần mềm, chúng ta phải sử dụng các testcase (trường hợp kiểm thử) cho việc kiểm thử. Chất lượng của việc kiểm thử phụ thuộc rất lớn vào tập hợp các testcase mà chúng ta sử dụng. Hai tiêu chí chính của việc đánh giá chất lượng kiểm thử đó là hiệu quả cho chất lượng phần mềm được kiểm thử là độ phủ dòng chảy (control flow coverage) và độ phủ dữ liệu (data coverage). Tiêu chí thứ nhất tập trung vào việc kiểm thử tất cả các điểm điều khiển trên chương trình (ví dụ: các nhánh rẽ khả đạt trong cấu trúc chương trình – reachable control points). Trong khi tiêu chí thứ hai tập trung vào tập dữ liệu kiểm thử ứng với mỗi điểm điều khiển trong cấu trúc chương trình. Bằng kỹ thuật phân tích chương trình dựa trên mô hình sau khi trừu tượng hóa mã nguồn của chương trình được kiểm thử, việc phân tích cấu trúc logic của chương trình và tập dữ liệu ứng với mỗi điểm điều khiển trong chương trình sẽ dễ dàng hơn. Qua đó, quá trình sinh ra tập các testcase sẽ nhanh chóng và chính xác, đảm bảo các tiêu chí control flow và data coverage tốt hơn nhiều so với cách tiếp cận ở mức mã nguồn truyền thống. Hơn nữa, nếu quá trình này được thực hiện một cách tự động sẽ giảm thiểu nhiều công sức cho các chuyên gia kiểm thử chương trình. Với cách tiếp cận như vậy, phần mềm có thể được kiểm thử một cách tự động bằng máy, đem lại kết quả chuẩn hơn, xét được nhiều trường hợp hơn, đặt biệt là các lỗi logic, tiết kiệm chi phí sản xuất. Đánh giá tập dữ liệu kiểm thử: Ngoại trừ những chương trình đơn giản, sẽ là không thực tế nếu kiểm chứng phần mềm trên tập tất cả dữ liệu đầu vào có thể. Ngay cả khi chỉ tính tổ hợp của các dữ liệu đầu vào hoặc tổ hợp của các hàm, số lượng đầu vào và số lượng các trạng thái cũng là quá lớn. Khi hệ thống có bộ nhớ lớn, các dữ liệu đầu vào, đầu ra sẽ được log lại để theo dõi trạng thái. Trong khi không có một công cụ để tạo ra một thiết kế phần mềm chuẩn, hoàn chỉnh và chắc chắn thì việc kiểm thử là một khâu không thể thiếu để có thể đánh giá được chất lượng phần mềm. Vì thế người ta phải tìm cách chọn được một tập dữ liệu nhỏ mà có thể kiểm thử mang lại được độ tin cậy cao với mỗi hệ thống. Độ phủ hay mức độ đầy đủ bằng trực quan đánh giá được phạm vi hay mức độ kiểm thử. Nếu kiểm thử không đầy đủ được hết mọi khía cạnh của phần mềm đồng nghĩa với việc chúng ta bỏ sót nhiều lỗi. Các tấn suất của các trường hợp cũng không giống nhau. Khái niệm ca kiểm thử đơn giản là kiểm chứng các trạng thái đưa ra thể hiện cho hoạt động của hệ thống. Chúng ta có thể tạo ra ca kiểm thử đề đạt được trạng thái có thể bằng cách đưa vào các biến đặc biệt, trạng thái để điều khiển hệ thống. 6 CHƯƠNG 2- JAVA PATH FINDER VÀ THỰC THI TƯỢNG TRƯNG Trong chương này sẽ bao gồm hai 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. 2.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 [5]. 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 2-1 mô tả mô hình hoạt động của JPF. 7 Hình 2.: Mô hình hoạt động của JPF 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 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. 2.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.java 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); 8 int b = random.nextInt(3); // (3) System.out.println(" b=" + b); int c = a/(b+a -2); // (4) System.out.println(" c=" + c); } } Hình 2.: Sơ đồ trạng thái trong quá trình kiểm thử 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 khoang tương ứng la [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 vẽ bên dưới: Nhìn hình vẽ trên ta có thể thấy nếu chạy chương trình java bình thường thì ta chỉ có thể nhân được 1 trong 6 kết quả trên, do vậy khả năng lớn là không phát hiện được ra lỗi ( Đường bôi đỏ là ví dụ). Tuy nhiên JPF sẽ tìm ra tất cả các đường đi của chương trình sau đó kiểm tra chúng. Ta sẽ thấy có 2 trường hợp lỗi gây ra bởi phép chia cho 0. 9 2.1.2 Kiến trúc mức cao của JPF Hình 2.: Kiến trúc mức cao Hình 2-3 biểu diễn sơ đồ kiến trúc mức cao của JPF. JPF được thiết kế thành 2 thành phần chính đó là: JVM, và Search. JVM là một bộ sinh trạng thái cụ thể Java. Bằng việc thực hiện các chỉ thị Java bytecode. Search chịu trách nhiệm lựa chọn trạng thái mà JVM nên xử lý, hoặc hướng JVM sinh trạng thái tiếp theo, hoặc yêu cầu JVM quay trở lại một trạng thái trước đó. Nói một các khác Search có thể coi như các driver cho các đối tượng JVM. Search cũng cấu hình và đánh giá các đối tượng thuộc tính. Các cài đặt chính của Search bao gồm tìm kiếm theo độ sâu (DFSearch) và HeuristicSearch. Một cài đặt Search sẽ cung cấp một phương thức Search đơn giản bao gồm một vòng lặp chính sẽ duyệt qua tất cả các không gian trạng 10 thái liên quan cho đến khi nó duyệt xong tất cả hoặc tìm ra một vi phạm thuộc tính (property violation). 2.1.3 Khả năng mở rộng của JPF Hình 2.: Mẫu Listener JPF có thể được coi như là một Framework mà tại đó bất kỳ nhà phát triển nào đều có thể mở rộng để phục vụ cho một mục đích cụ thể. JPF cung cấp một cơ chế mở rộng để cho phép thêm vào các chức năng mới mà không phải thay đổi trực tiếp cài đặt của Search hoặc VM. Yêu cầu về khả năng mở rộng có thể đạt được bằng cách sử dụng mẫu Listerner trên hình 2-4. Các thể hiện sẽ tự đăng ký hoặc đăng ký với đối tượng Search/VM, nhận thông báo khi một đối tượng (Subject) tương ứng thực thi một hoạt động nhất định, và sau đó có thể tương tác với đối tượng để truy vấn các thông tin bổ sung hoặc điểu khiển hành vi của đối tượng. [...]... Int) (declare-fun is_int (Real) Bool) (= 4.0 (to_real 4)) (= 4 (to_int 4.5)) (iff (is_int x) (= x (to_real (to_int x)))) 3.8.4 Số học phi tuyến tính Z3 hỗ trợ số học phi tuyến tính: Ví dụ: (declare-funs (( x Int) (y Int) (z Int))) (assert (= (* x x) (+ x 2))) (assert (= (* x y) x)) (assert (= (* (- y 1) z) 1)) (check-sat) ; unsat Ví dụ trên sẽ kiểm tra (x*x = 2*x AND x*y = x AND (y-1)*z = 1) Kết quả là... dụ: (declare-funs (( x Int) (y Int) (z Int))) (push) (assert (> (+ x y) (* 2 z))) 33 (assert ( x 2) (> = y x) ( (+ x y) (* 2.0 z))) (assert ( x 2.0)) (assert (> = y x)) (assert ((x >=2 )(= ( fib x) *+ (fix (- x 1) (- x 3))))))) 3.8 Số học Z3 chứa các thủ tục quyết định cho số học tuyến... dụng z3 để kiểm chứng biểu thức này bằng cách sử dụng dòng lệnh z3 /m example1.smt (benchmark example1 :status sat :logic QF_LIA :extrafuns((x1 Int)(x2 Int)(x3 Int)(x4 Int)(x5 Int)) :formula (and (> = (- x1 x2) 1) (=1) && (( x1 - x2) = (- x1 x2) 1) ( . ngữ khác như Java? Trong quá trình nghiên cứu về kiểm chứng chương trình 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. Random(42); // (1 ) int a = random.nextInt(2); // (2 ) System.out.println("a=" + a); 8 int b = random.nextInt(3); // (3 ) System.out.println(" b=" + b); int c = a/(b+a. Java. 2.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 [5]. 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

Ngày đăng: 25/07/2015, 18:32

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w