Kiểm tra tự động các phép tính số học trong chương trình c và java

168 43 0
Kiểm tra tự động các phép tính số học trong chương trình c và java

Đ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

ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƢỜNG ĐẠI HỌC BÁCH KHOA - THÁI ĐẮC VINH KIỂM TRA TỰ ĐỘNG CÁC PHÉP TÍNH SỐ HỌC TRONG CHƢƠNG TRÌNH C VÀ JAVA Chun ngành: Khoa học máy tính LUẬN VĂN THẠC SĨ TP HỒ CHÍ MINH, tháng 06 năm 2010 CƠNG TRÌNH ĐƢỢC HỒN THÀNH TẠI TRƢỜNG ĐẠI HỌC BÁCH KHOA ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH Cán hƣớng dẫn khoa học: TS QUẢN THÀNH THƠ Cán chấm nhận xét 1: Cán chấm nhận xét 2: Luận văn thạc sĩ đƣợc bảo vệ Trƣờng Đại học Bách Khoa, ĐHQG Tp HCM ngày 25 tháng 08 năm 2010 Thành phần hội đồng đánh giá luận văn thạc sĩ gồm: PGS.TS TRẦN VĂN LĂNG TS BÙI HOÀI THẮNG TS NGUYỄN HỨA PHÙNG TS NGUYỄN ĐỨC CƢỜNG TS QUẢN THÀNH THƠ Xác nhận Chủ tịch Hội đồng đánh giá LV Bộ môn lý chuyên ngành sau luận văn đƣợc sửa chữa Chủ tịch Hội đồng đánh giá LV Bộ môn quản lý chuyên ngành TRƢỜNG ĐẠI HỌC BÁCH KHOA TP HCM PHÒNG ĐÀO TẠO SĐH - CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc - Tp HCM, ngày tháng năm NHIỆM VỤ LUẬN VĂN THẠC SĨ Họ tên học viên: THÁI ĐẮC VINH Ngày, tháng, năm sinh: 20/06/1983 Chuyên ngành: Khoa học máy tính Phái: Nam Nơi sinh: Hịa Thành – Tây Ninh MSHV: 00708217 I- TÊN ĐỀ TÀI: Kiểm tra tự động phép tính số học chương trình C Java II- NHIỆM VỤ VÀ NỘI DUNG:  Nhiệm vụ:  Xây dựng hệ thống kiểm chứng tập lập trình C Java cho sinh viên  Hỗ trợ việc kiểm chứng chƣơng trình số thực  Hỗ trợ việc tìm lỗi phản ví dụ việc kiểm chứng chƣơng trình số thực  Nội dung:  Tìm hiểu kiểm chứng hình thức chƣơng trình  Nghiên cứu khó khăn xử lý số thực kiểm chứng chƣơng trình đề xuất giải pháp khắc phục  Xây dựng hệ thống kiểm chứng dựa web  Xây dựng giải thuật nguyên hóa chƣơng trình số thực thực chƣơng trình chuyển đổi  Tích hợp giải pháp khắc phục vào hệ thống  Tổng hợp, nhận xét đề hƣớng phát triển tƣơng lai III- NGÀY GIAO NHIỆM VỤ: 25/01/2010 IV- NGÀY HOÀN THÀNH NHIỆM VỤ: 02/07/2010 V- CÁN BỘ HƢỚNG DẪN: TS QUẢN THÀNH THƠ CÁN BỘ HƢỚNG DẪN TS Quản Thành Thơ CN BỘ MÔN QL CHUYÊN NGÀNH Lời cảm ơn Tôi xin chân thành cảm ơn giảng dạy, hƣớng dẫn giúp đỡ tận tình tất Thầy Cô giảng dạy sau đại học - khoa Khoa học Kỹ thuật máy tính trƣờng đại học Bách Khoa thành phố Hồ Chí Minh Xin chân thành cảm ơn giảng dạy tận tình Thầy TS Nguyễn Hứa Phùng, ngƣời giảng dạy trực tiếp mơn học ―Ngun lý ngơn ngữ lập trình‖ giới thiệu cho đề tài nghiên cứu thú vị kiểm chứng hình thức chƣơng trình Đặc biệt xin chân thành cảm ơn Thầy TS Quản Thành Thơ, giảng viên hƣớng dẫn luận văn Thạc Sĩ - ngƣời giảng dạy trực tiếp môn học ―Hệ thống thơng minh‖ - trƣởng nhóm nghiên cứu Prove mà tơi tham gia, tận tình hƣớng dẫn, giúp đỡ, dẫn dắt ngày đầu tham gia nhóm, định hƣớng nghiên cứu ln cho tơi giải pháp để xử lý gặp trở ngại trình nghiên cứu làm luận văn Thạc Sĩ Tơi biết ơn Thầy với bạn nhóm nghiên cứu Prove cung cấp cho nhiều kiến thức lĩnh vực Kiểm chứng chƣơng trình mà tơi thực đề tài luận văn Ngoài ra, xin cảm ơn bạn học lớp cao học khóa 2008, bạn bè, đồng nghiệp, ngƣời thân gia đình giúp đỡ, trao đổi kiến thức, tin tƣởng, động viên tơi nhiều suốt q trình học thực luận văn Xin chân thành cảm ơn! Tp HCM, ngày 17 tháng 06 năm 2010 Học viên Thái Đắc Vinh -i- Abstract Software verification is a form of using logic and reasoning to show that the program will meet (or not) the requirements after executed without running tests on the computer Currently, researchs in this area are facing two major difficulties in verifying automatically the accuracy of programs; those are loop processing and handling floating-point Because of loop obstacles, system proving certainly has to take a long time to become a commercial product and be widely used in the field of computer science in general However, in education we absolutely can limit the problem in a narrow range, in which the verifying of a loop-program would become feasible However, problems of proving floating-point programs are blocking the implementation of projects applied in schools If we limit exercises in level of integer data type, the exercises given to students become less diverse and the teacher forced to skip a class of highly educational problems such as: calculating the circular perimeter or area; solving quadratic equations; or examining the conditions of the triangle In this thesis I study the difficulties in verifying floating-point-program and implement a solution of converting program source code to support the automatic verification of floating-point-program in the field of education To illustrate for my work, I implement a software verification system, which includes solutions for floating-point problems, used to verify a simple C and Java program in the range of exercises for junior students Experimental results on some samples also showed the effectiveness of innovative solutions in handling of floating-point data type problems - ii - Tóm tắt Kiểm chứng hình thức chƣơng trình cách dùng logic suy luận để chƣơng trình thỏa mãn (hoặc khơng) yêu cầu đề sau đƣợc thực thi mà khơng cần chạy kiểm nghiệm máy tính Hiện tại, nghiên cứu lĩnh vực gặp hai khó khăn lớn việc kiểm chứng tự động đắn chƣơng trình, xử lý vịng lặp xử lý số thực Với trở ngại lặp, chắn phải lâu việc kiểm chứng tự động chƣơng chƣơng trình trở thành sản phẩm thƣơng mại đƣợc sử dụng rộng rãi lĩnh vực khoa hoc máy tính tổng quát Tuy nhiên, giáo dục ta hồn tồn giới hạn toán vào phạm vi hạn hẹp mà việc kiểm chứng chƣơng trình có lặp trở nên khả thi Tuy vậy, trở ngại kiểm chứng số thực cản trở việc triển khai dự án kiểm chứng chƣơng trình trƣờng học Nếu dừng lại mức số nguyên, tập đƣa cho sinh viên trở nên đa dạng ngƣời giảng viên buộc phải bỏ qua lớp toán hay, mang tính giáo dục cao nhƣ: tính chu vi, diện tích hình trịn; giải phƣơng trình bậc hai; kiểm tra điều kiện tam giác … Trong đề tài luận văn tơi nghiên cứu khó khăn kiểm chứng chƣơng trình số thực thực giải pháp chuyển đổi mã nguồn giúp tự động kiểm chứng chƣơng trình số thực lĩnh vực giáo dục Để minh họa cho dự án mình, tơi thực hệ thống dùng để kiểm chứng cách tự động chƣơng trình C Java phạm vi tập lập trình sinh viên năm nhất, có xử lý đƣợc tập số thực Kết thực nghiệm số tập mẫu hiệu giải pháp cải tiến việc xử lý vấn đề số thực - iii - Mục lục Lời cảm ơn i Mục lục iv Danh mục hình viii Danh mục bảng x CHƢƠNG I Giới thiệu 1.1 Giới thiệu kiểm chứng hình thức chƣơng trình .2 1.2 Giới thiệu vấn đề xử lý số thực kiểm chứng chƣơng trình 1.3 Mục tiêu động lực nghiên cứu CHƢƠNG II Tổng thuật cơng trình nghiên cứu kiểm chứng chƣơng trình xử lý vấn đề số thực 2.1 Các nghiên cứu kiểm chứng hình thức chƣơng trình (formal verification) 2.2 Giới thiệu số cơng cụ dùng kiểm chứng chƣơng trình .12 2.2.1 Công cụ Caduceus 12 2.2.2 Công cụ Frama-C 14 2.2.3 Công cụ Krakatoa 16 2.2.4 Công cụ Why 17 2.2.4 Công cụ Gappa 20 2.3 Giới thiệu số prover 21 2.3.1 Nhóm trợ giúp chứng minh tƣơng tác (interactive proof assistants) 21 2.3.2 Nhóm chứng minh lý thuyết tự động (automatic theorem provers) 29 2.4 Các nghiên cứu xử lý số thực kiểm chứng chƣơng trình .33 2.4.1 Nghiên cứu kết hợp Coq Gappa để xử lý số thực việc kiểm chứng hình thức chƣơng trình 33 2.4.2 Nghiên cứu dùng Redlog để xử lý phép tính số 38 2.4.3 Nghiên cứu giải số thực nhóm tác giả Frama-C 39 2.4.4 Các phân tích hƣớng nghiên cứu 40 - iv - CHƢƠNG III Cơ sở lý thuyết 46 3.1 Cở sở lý thuyết chứng minh kiểm chứng chƣơng trình 46 3.2 Cơ sở lý thuyết việc xử lý số thực kiểm chứng chƣơng trình 52 3.3 Cơ sở lý thuyết cách biểu diễn số thực theo chuẩn IEEE 754-1985 chƣơng trình C Java 54 3.3.1 Định dạng 55 3.3.2 Định dạng mở rộng 56 3.3.3 Chuẩn biểu diễn liệu 56 3.3.4 Cách làm tròn 57 3.3.5 Thực phép tính so sánh 58 3.4 Lý thuyết ngơn ngữ lập trình 59 3.4.1 Ngữ nghĩa hình thức chƣơng trình (Formal Semantics) 59 3.4.2 Ngôn ngữ lập trình hàm lập trình logic 60 3.5 Lập trình sinh lexer parser ngơn ngữ lập trình Ocaml 64 3.5.1 Giới thiệu ngơn ngữ lập trình Caml Ocaml 64 3.5.2 Lập trình sinh lexer parser (ocamllex, ocamlyacc) 65 3.6 Lý thuyết model checking .71 3.6.1 Quy trình xử lý model checking 73 3.6.2 Các đặc điểm model checking 74 Chƣơng IV Giải pháp đề xuất cho việc ngun hóa chƣơng trình 77 4.1 Định nghĩa thuật ngữ đƣợc sử dụng việc nguyên hóa .77 4.1.1 Định nghĩa Scale: 77 4.1.2 Định nghĩa Scale degree: 78 4.1.3 Định nghĩa Scale level: 78 4.1.4 Một số nhận xét: 79 4.2 Các thao tác xử lý việc nguyên hóa 79 4.2.1 Cách xử lý định danh kiểu floating-point chƣơng trình 79 4.2.2 Cách scale up scale down 80 4.2.3 Xử lý tham số biến kiểu floating-point 80 4.2.4 Xử lý trị floating-point 81 4.2.5 Xác định scale degree 81 4.2.6 Cách nhận scale level 82 4.2.7 Cân level 83 -v- 4.2.8 Xử lý toán tử gán 83 4.2.9 Đổi tên biến, tham số cân lại level lần thứ hai 84 4.2.10 Xử lý phép casting số nguyên 85 4.2.11 Xử lý hàm đƣợc sử dụng chƣơng trình 85 4.2.12 Xác định scale level giá trị trả 85 4.2.13 Xử lý hàm chƣơng trình biểu thức return 87 4.2.14 Giải việc trùng tên 88 4.3 Giải thuật nguyên hóa 88 4.3.1 Thể bƣớc thực 88 4.3.2 Thể giai đoạn thực 92 Chƣơng V Hiện thực: Xây dựng hệ thống tự động kiểm chứng tập lập trình C Java sinh viên 95 5.1 Giới thiệu hệ thống 96 5.2 Hiện thực tích hợp thành phần chuyển đổi vào hệ thống 98 5.2.1 Chức tiền xử lý nhằm hỗ trợ kiểm chứng số thực 99 5.2.2 Chức ngun hóa nhằm hỗ trợ tìm điểm sai phản ví dụ 103 5.2.3 Chi tiết thực thành phần chuyển đổi 105 Chƣơng VI Thực nghiệm đánh giá kết 107 6.1 Hệ thống kiểm chứng chƣơng trình website 107 6.2 Đánh giá cải tiến hỗ trợ xử lý số thực 110 6.3 Đánh giá kết giải pháp hỗ trợ tìm điểm sai phản ví dụ 112 Chƣơng VII Kết luận hƣớng phát triển tƣơng lai 115 7.1 Kết luận .115 7.1.1 Những đóng góp luận văn 115 7.1.2 Những giới hạn thực luận văn hạn chế hệ thống 115 7.2 Hƣớng phát triển tƣơng lai .117 Tài liệu tham khảo 120 Phụ lục A - Chú giải thuật ngữ P1 Phụ lục B - Các tập thử nghiệm P3 - vi - Phụ lục C - Một số trƣờng hợp kiểm chứng thành công nhờ cải tiến tiền sử lý kiểm chứng số thực P14 Phụ lục D – Minh họa số kết ngun hóa chƣơng trình P17 Phụ lục E - Giới thiệu chức hệ thống kiểm chứng web P23 Phụ lục F - Cài đặt hệ thống kiểm chứng Why công cụ hỗ trợ kiểm chứng P31 - vii - Phụ lục - 19 /*@ requires \valid(i_f_1) && \valid(j_f_1) ; @ ensures *i_f_1 == \old(*j_f_1) && *j_f_1 == \old(*i_f_1);*/ void swap_v_2_0(int* i_f_1,int* j_f_1) { int t_f_1 = *i_f_1; *i_f_1 = *j_f_1; *j_f_1 = t_f_1; } Bài tập 27: kiểm tra cạnh tam giác #pragma JessieIntegerModel(math) /*@ requires a_f_1 > (0)*(100) && b_f_1 > (0)*(100) && c_f_1 > (0)*(100); @ ensures ((a_f_1 + b_f_1 > c_f_1 && a_f_1 +c_f_1 > b_f_1 && b_f_1 + c_f_1 > a_f_1) && \result == (1)*(100))|| @ (!(a_f_1 + b_f_1 > c_f_1 && a_f_1 +c_f_1 > b_f_1 && b_f_1 + c_f_1 > a_f_1) && \result == (0)*(100)); @ */ int triangle_f_2_1(int a_f_1, int b_f_1, int c_f_1 ) { if (a_f_1 + b_f_1 > c_f_1 && a_f_1 +c_f_1 > b_f_1 && b_f_1 + c_f_1 > a_f_1) return (1)*(100); else return (0)*(100); } Bài tập 28: tính diện tích hình chữ nhật dựa vào chu vi cạnh bên #pragma JessieIntegerModel(math) /*@ requires p_d_1 > (0)*(100) && d_d_1 > (0)*(100) && p_d_1 > d_d_1; @ ensures \result == ( p_d_1 / - d_d_1 ) * d_d_1; @ */ long area_rec_d_2_2(long p_d_1,long d_d_1) { return ( p_d_1 / - d_d_1 ) * d_d_1; } Bài tập 29: tính diện tích tam giác vng #pragma JessieIntegerModel(math) /*@ requires a_d_1 >= (0)*(100) && b_d_1 >= (0)*(100) && c_d_1 >= (0)*(100); @ ensures ((\result == b_d_1 * c_d_1 / 2) && (a_d_1 >= b_d_1 && a_d_1 >= c_d_1)) || @ ((\result == a_d_1 * c_d_1 / 2) && (b_d_1 >= a_d_1 && b_d_1 >= c_d_1)) || @ ((\result == a_d_1 * b_d_1 / 2) && (c_d_1 >= a_d_1 && c_d_1 >= b_d_1)) ; */ long rtriangle_d_2_2(long a_d_1, long b_d_1, long c_d_1){ if(a_d_1>=b_d_1 && a_d_1>=c_d_1) return b_d_1 * c_d_1 / 2; if(b_d_1>=a_d_1 && b_d_1>=c_d_1) return a_d_1 * c_d_1 / 2; return a_d_1 * b_d_1 / 2; HVTH: THÁI ĐẮC VINH MSHV: 00708217 GVHD: TS QUẢN THÀNH THƠ Phụ lục - 20 } Bài tập 30: tính diện tích tam giác dựa vào cạnh theo công thức Heron #pragma JessieIntegerModel(math) /*@ @ ensures \result == \sqrt (x); @ */ double sqrt(double x); /*@ requires a_d_1 >= (0)*(100) && b_d_1 >= (0)*(100) && c_d_1 >= (0)*(100); @ ensures \result == (\sqrt ( (((a_d_1 + b_d_1 + c_d_1) / 2) * ( ((a_d_1 + b_d_1 + c_d_1) / 2) - a_d_1 ) * ( ((a_d_1 + b_d_1 + c_d_1) / 2) - b_d_1 ) * ( ((a_d_1 + b_d_1 + c_d_1) / 2) - c_d_1 ))/(100*100*100*100) )*100); @ */ long triangle_area_Heron_d_2_1 (long a_d_1, long b_d_1, long c_d_1){ long p_d_1 = ( a_d_1 + b_d_1 + c_d_1 ) / 2; return (sqrt ( (p_d_1 * ( p_d_1 - a_d_1 ) * ( p_d_1 b_d_1 ) * ( p_d_1 - c_d_1 ))/(100*100*100*100) )*100) ; } Bài tập 31: tính diện tích hình trịn #pragma JessieIntegerModel(math) /*@ requires r_f_1 >= (0)*(100); @ ensures \result == r_f_1 * r_f_1 * 314; @ */ long area_d_2_3(int r_f_1) { return r_f_1 * r_f_1 * 314; } Bài tập 32: tính giá trị trung bình hai số #pragma JessieIntegerModel(math) /*@ ensures \result == (a_d_1 + b_d_1) / ; */ long avg_d_2_1(long a_d_1, long b_d_1){ return (a_d_1 + b_d_1) / 2; } Bài tập 33: xác định tính chất lệch hay lệch dƣới nhóm số #pragma JessieIntegerModel(math) /*@ ensures ((\result == a) && (b = c)) || @ ((\result == b) && (a = c)) || @ ((\result == c) && (a = b)) ; */ double middle(double a, double b, double c); /*@ ensures @ ( (\result == 1) && ( ((a_d_1 + b_d_1 + c_d_1) / > a_d_1 && (a_d_1 + b_d_1 + c_d_1) / > b_d_1) || ((a_d_1 + b_d_1 + c_d_1) / > a_d_1 && (a_d_1 + b_d_1 + c_d_1) / > HVTH: THÁI ĐẮC VINH MSHV: 00708217 GVHD: TS QUẢN THÀNH THƠ Phụ lục - 21 c_d_1) || ((a_d_1 + b_d_1 + c_d_1) / > b_d_1 && (a_d_1 + b_d_1 + c_d_1) / > c_d_1) ) ) || @ ( (\result == -1) && ( ((a_d_1 + b_d_1 + c_d_1) / < a_d_1 && (a_d_1 + b_d_1 + c_d_1) / < b_d_1) || ((a_d_1 + b_d_1 + c_d_1) / < a_d_1 && (a_d_1 + b_d_1 + c_d_1) / < c_d_1) || ((a_d_1 + b_d_1 + c_d_1) / < b_d_1 && (a_d_1 + b_d_1 + c_d_1) / < c_d_1) ) ) || @ ( (\result == 0) && ((a_d_1 + b_d_1 + c_d_1) / == a_d_1 || (a_d_1 + b_d_1 + c_d_1) / == b_d_1 || (a_d_1 + b_d_1 + c_d_1) / == c_d_1) ) ; */ int bias_i_2_0(long a_d_1, long b_d_1, long c_d_1){ long avg_d_1 = (a_d_1 + b_d_1 + c_d_1) / 3; long mid_d_1 = (middle((a_d_1)/(100), b_d_1, c_d_1)*100); if(avg_d_1 > mid_d_1) return 1; if(avg_d_1 < mid_d_1) return -1; return 0; } Bài tập 34: tính cạnh huyền tam giác vuông dựa cạnh gốc kề #pragma JessieIntegerModel(math) /*@ @ ensures \result == \cos (x); @ */ float cos(float x); /*@ requires side_f_1 >= (0)*(100) && (\cos ((angle_f_1)/(100))*100) != (0)*(100); @ ensures \result == (side_f_1 / (\cos ((angle_f_1)/(100))*100))*(100); @ */ int hypotenuse_f_2_1(int side_f_1, int angle_f_1) { return (side_f_1 / (cos ((angle_f_1)/(100))*100))*(100); } Bài tập 35: tính cạnh huyền tam giác vuông dựa hai cạnh gốc vuông #pragma JessieIntegerModel(math) /*@ @ ensures \result == \sqrt (x); @ */ float sqrt(float x); /*@ requires width_f_1 >= (0)*(100) && height_f_1 >= (0)*(100); @ ensures \result == (\sqrt ( (width_f_1 * width_f_1 + height_f_1 * height_f_1)/(100*100))*100); @ */ int hypotenuse_f_2_1(int width_f_1, int height_f_1) { return (sqrt ((width_f_1 * width_f_1 + height_f_1 * height_f_1)/(100*100))*100); } HVTH: THÁI ĐẮC VINH MSHV: 00708217 GVHD: TS QUẢN THÀNH THƠ Phụ lục - 22 Bài tập 36: tìm vị trí phần tử mảng #pragma JessieIntegerModel(math) /*@ requires \valid_range(t_f_1,0,n_i-1); @ ensures @ (0 t_f_1[\result] == v_f_1) && @ (\result == n_i ==> \forall int i_i; t_f_1[i_i] != v_f_1) ; @*/ int index_i_2_0(int t_f_1[], int n_i, int v_f_1) { int i_i = 0; /*@ loop invariant =1 && \valid_range(t_f_1, 0, n_i - 1); @ ensures \forall int i_i; 0

Ngày đăng: 15/02/2021, 07:45

Tài liệu cùng người dùng

Tài liệu liên quan