Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 68 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
68
Dung lượng
4,35 MB
Nội dung
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ Nguyễn Đức Anh PHƯƠNGPHÁPPHÂNTÍCHMÃNGUỒNVÀSINHDỮLIỆUKIỂMTHỬCHOCÁCDỰÁN C/C++ LUẬN VĂN THẠC SĨ: KỸ THUẬT PHẦN MỀM HÀ NỘI – 2017 I ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ Nguyễn Đức Anh PHƯƠNGPHÁPPHÂNTÍCHMÃNGUỒNVÀSINHDỮLIỆUKIỂMTHỬCHOCÁCDỰÁN C/C++ Ngành: Công nghệ thông tin Chuyên ngành: Kỹ thuật phần mềm Mã số: 60480103 LUẬN VĂN THẠC SĨ: KỸ THUẬT PHẦN MỀM Cán hướng dẫn: PGS TS Phạm Ngọc Hùng HÀ NỘI - 2017 II LỜI CẢM ƠN Đầu tiên, xin gửi lời cám ơn chân thành tới Tiến sĩ Phạm Ngọc Hùng – giảng viên môn Công Nghệ Phần Mềm – người hướng dẫn tận tình, tỉ mỉ, chu đáo suốt hai năm làm luận văn Quãng thời gian thầy hướng dẫn giúp học hỏi, đúc kết nhiều kinh nghiệm phươngpháp nghiên cứu, kĩ giao tiếp, kĩ làm việc nhóm, kĩ trình bày Thầy truyền cho tơi lửa yêu nghiên cứu khoa học, niềm tin vượt qua khó khăn sống dạy tơi cách vượt qua khó khăn Tơi cảm thấy tự hào may mắn học viên thầy hướng dẫn năm tháng cao học Ngoài ra, xin gửi lời cám ơn chân thành đến nhóm nghiên cứu giúp đỡ tơi nhiệt tình để hoàn thành luận văn cho đạt hiệu cao Cám ơn nhóm nghiên cứu giúp đỡ tơi hành động, lời nói tơi gặp khó khăn, thất bại Hai năm bên khơng phải dài tôi, quãng thời gian tuyệt vời quên Tiếp theo, xin gửi lời cảm ơn đến thầy cô giảng viên Trường Đại học Công Nghệ - Đại học Quốc Gia Hà Nội – người tận tâm truyền đạt kiến thức quý báu làm tảng để tiếp tục xa lĩnh vực công nghệ thông tin Cuối cùng, xin cảm ơn gia đình ni tơi khơn lớn để trở thành người có ích cho xã hội, giúp tơi có điểm tựa vững để n tâm học hành suốt bao năm qua Tôi xin gửi lời cám ơn chân thành tới cha, mẹ, em gái động viên cổ vũ tơi gặp khó khăn thử thách Hà Nội, ngày 25 tháng 11 năm 2017 Học viên Nguyễn Đức Anh III LỜI CAM ĐOAN Tôi xin cam đoan nghiên cứu kiểmthử tự động cho chương trình C/C++ trình bày luận văn chưa nộp báo cáo luận văn trường Đại học Công Nghệ - Đại học Quốc Gia Hà Nội trường đại học khác Những tơi viết khơng chép từ tài liệu, không sử dụng kết người khác mà khơng trích dẫn cụ thể Tơi xin cam đoan công cụ kiểmthử tự động trình bày khố luận tơi tự phát triển, không chép mãnguồn người khác Nếu sai tơi hồn tồn chịu trách nhiệm theo quy định trường Đại học Công Nghệ - Đại học Quốc Gia Hà Nội Hà Nội, ngày 25 tháng 11 năm 2017 Học viên Nguyễn Đức Anh IV MỤC LỤC Giới thiệu Tổng quan kĩ thuật kiểmthử tự động định hướng 2.1 Dữliệukiểmthử 2.2 Các tiêu chí độ phủ sử dụng kĩ thuật kiểmthử tự động định hướng 2.3 Đồ thị dòng điều khiển 2.4 Cây cú pháp trừu tượng 2.5 Quy trình chung kĩ thuật kiểmthử tự động định hướng Phươngphápkiểmthử tự động dựán C/C++ sử dụng kĨ thuật kiểmthử tự động định hướng 3.1 Tổng quan phươngpháp đề xuất 3.2 Pha tiền xử lý mãnguồn 10 3.2.1 Xây dựng cấu trúc từ dựán C/C++ 10 3.2.2 Chèn câu lệnh đánh dấu vào hàm 13 3.3 Pha sinhliệukiểmthử 14 3.3.1 Xây dựng đồ thị dòng điều khiển từ mãnguồn 16 3.3.2 Xếp hạng đường thi hành 18 3.3.3 Xây dựng hệ ràng buộc từ đường thi hành 19 a Mơ hình nhớ sử dụng kĩ thuật thực thi tượng trưng 20 b Xây dựng hệ ràng buộc từ đường thi hành sử dụng kĩ thuật thực thi tượng trưng 22 3.3.4 Giải hệ ràng buộc sử dụng giải SMT-Solver 24 3.4 Biên dịch thực thi liệukiểmthử môi trường chạy 26 3.5 Tối ưu hóa pha sinhliệukiểmthử 27 3.5.1 Đơn giản hóa hệ ràng buộc 27 V 3.5.2 Tăng tốc thời gian biên dịch thực thi liệukiểmthử 28 3.6 Xuất mãnguồnkiểmthử theo chuẩn Google Test 29 Công cụ thực nghiệm 30 4.1 Giới thiệu công cụ kiểmthử tự động CFT4Cpp 30 4.2 Thư viện hỗ trợ sử dụng công cụ kiểmthử tự động CFT4Cpp 33 4.2.1 Thư viện giải hệ ràng buộc Z3 33 4.2.2 Thư viện phântíchmãnguồn CDT 34 4.2.3 Thư viện tính giá trị biểu thức Jeval 35 4.3 Kết thực nghiệm 35 4.3.1 So sánh số lượng liệukiểmthử độ phủ với KLEE, CAUT, CREST, PathCrawler 35 4.3.2 Sinhliệukiểmthử vòng lặp 40 4.3.3 So sánh thời gian biên dịch thực thi liệukiểmthử 42 Kết luận 44 Tài liệu tham khảo 48 VI DANH SÁCH KÝ HIỆU, CHỮ VIẾT TẮT Tên đầy đủ Dynamic Symbolic Execution Tên viết tắt DSE Mô tả Kĩ thuật kiểmthử động Static Testing Kĩ thuật kiểmthử tĩnh Concolic Testing Kĩ thuật kiểmthử tự động định hướng Abstract Syntax Tree AST Cây cú pháp trừu tượng Control Flow Graph CFG Đồ thị dòng điều khiển C/C++ Development Tooling CDT Satisfiability Modulo Theories SMT-Solver Solver Boolean Satisfiability Problem SAT Symbolic Execution SE Kĩ thuật thực thi tượng trưng Path selection strategy Chiến thuật chọn đường thi hành (trong DSE) Test driver Bộ thực thi liệukiểmthử Test data Dữliệukiểmthử Test path Đường thi hành (sinh từ đồ thị CFG) Modified condition/ decision MC/DC coverage Độ phủ cấp ba (hoặc phủ điều kiện con) VII DANH SÁCH BẢNG BIỂU Bảng 3.1 Danh sách quan hệ phụ thuộc lơ-gic điển hình 10 Bảng 3.2 Luật chèn câu lệnh đánh dấu vào hàm 13 Bảng 4.1 Thông tin công cụ so sánh thực nghiệm 35 Bảng 4.2 Thơng tin cấu hình ví dụ thực nghiệm 36 Bảng 4.3 Thông tin hàm kiểmthử tiêu chí độ phủ số liệukiểmthử 37 Bảng 4.4 Kết so sánh công cụ CFT4Cpp với KLEE PathCrawler 38 Bảng 4.5 Kết so sánh công cụ CFT4Cpp với CREST CAUT 39 Bảng 4.6 Sinhliệukiểmthử vòng lặp 41 Bảng 4.7 Bảng so sánh thời gian biên dịch thực thi liệukiểmthử kĩ thuật cải tiến kĩ thuật truyền thống 43 DANH SÁCH THUẬT TỐN Thuật tốn 3.1 Thuật toán LDFS sinhliệukiểmthử 15 Thuật toán 3.2 Thuật toán xây dựng hệ ràng buộc từ đường thi hành 23 DANH SÁCH HÌNH VẼ Hình 2.1 Các cấu trúc điều khiển phổ biến C/C++ Hình 3.1 Tổng quan phươngpháp đề xuất Hình 3.2 Ví dụ cấu trúc dựán C/C++ điển hình 12 Hình 3.3 Minh họa đồ thị CFG phủ câu lệnh/nhánh 17 Hình 3.4 Minh họa đồ thị CFG phủ MC/DC 18 Hình 3.5 Mơ hình nhớ sử dụng kĩ thuật thực thi tượng trưng 21 Hình 3.6 Quy trình xây dựng biểu thức SMT-Lib từ ràng buộc 25 Hình 3.7 Quá trình biến đổi hệ ràng buộc chuẩn SMTLib 25 Hình 3.8 Kĩ thuật tạo thực thi ca kiểmthử tổng quát 28 VIII Hình 4.1 Kiến trúc cơng cụ CFT4Cpp 30 Hình 4.2 Giao diện cơng cụ CFT4Cpp 31 Hình 4.3 Giao diện bước cấu hình cơng cụ CFT4Cpp 32 Hình 4.4 Giao diện sinhliệukiểmthửcho hàm Divide 32 Hình 4.5 Biên kiểmthử xuất công cụ CFT4Cpp cho hàm Divide 33 Hình 4.6 Minh họa kết giải hệ ràng buộc sử dụng Z3 34 DANH SÁCH MÃNGUỒNMãnguồn 3.1 Ví dụphầnmãnguồndựán C/C++ 12 Mãnguồn 3.2 Ví dụ hàm checkFirstSubject sau chèn câu lệnh đánh dấu 14 Mãnguồn 3.3 Mãnguồn hàm average 17 Mãnguồn 4.1 Minh họa hệ ràng buộc theo chuẩn SMT-Lib 34 IX TÓM TẮT Để đảm bảo chất lượng phần mềm, nhiều kĩ thuật kiểmthử khác áp dụng khiến chi phí kiểmthử tăng cao Trong đó, kiểmthử đơn vị kĩ thuật áp dụng rộng rãi công ty phần mềm để kiểm tra chất lượng mã nguồn, đặc biệt phần mềm nhúng viết ngôn ngữ C/C++ Kĩ thuật giúp phát sớm nhiều vấn đề tiềm ẩn quy trình xây dựng phần mềm Tuy nhiên, nhược điểm kĩ thuật kiểmthử đơn vị vấn đề chi phí tăng cao dựán lớn kĩ thuật kiểmthử xem xét tính đắn thành phần nhỏ mãnguồn Để giảm thiểu tốn chi phí, quy trình kiểmthử đơn vị nên tự động hóa hồn tồn Bởi thế, luận văn hướng đến xây dựng giải phápkiểmthử tự động mức đơn vị chodựán C/C++ Tư tưởng phươngpháp đề xuất dựa kĩ thuật kiểmthử tự động định hướng Hiện nay, kĩ thuật kiểmthử tự động định hướng chứng minh tính hiệu toán kiểmthử tự động Tuy vậy, vấn đề tồn cần giải kĩ thuật kiểmthử tự động định hướng gồm vấn đề sinhliệukiểmthử chưa đủ tốt, sinh tập liệukiểmthử có số lượng nhỏ đạt độ phủ cao Do đó, luận văn tập trung giải toán Cụ thể, luận văn đề xuất kĩ thuật sinhliệukiểmthử dựa thơng tin phântíchmãnguồn thay áp dụng kĩ thuật sinh ngẫu nhiên truyền thống kĩ thuật kiểmthử tự động định hướng Để giảm thiểu số lượng liệukiểmthử đạt độ phủ cao, thuật toán LDFS đề xuất Để chứng minh tính hiệu phươngpháp đề xuất, công cụ CFT4Cpp xây dựng dựa phươngpháp đề xuất tiến hành so sánh với phươngphápkiểmthử khác gồm KLEE, PathCrawler, CAUT, CREST Kết nghiên cứu đăng hai hội nghị NICS 2016 SoICT 2017 với đánh giá khả quan tính thực tiễn phươngpháp đề xuất 44 KẾT LUẬN Luận văn trình bày phươngphápphântíchmãnguồnsinhliệukiểmthử tự động chodựán C/C++ Kết nghiên cứu luận văn thực hóa cơng cụ CFT4Cpp Tính đắn hiệu phươngpháp đề xuất chứng minh thực nghiệm qua so sánh với KLEE, PathCrawler, CUTE, CREST, CAUT Hiện tại, kết nghiên cứu trình bày hai hội nghị gồm NICS 2016 SoICT 2017 Mục tiêu luận văn hướng đến giải vấn đề sinhliệukiểmthửkiểmthử kĩ thuật kiểmthử tự động định hướng, đề xuất phươngphápsinh tập liệukiểmthử số lượng nhỏ đạt độ phủ tối đa Thứ nhất, để giải vấn đề sinhliệukiểmthử đầu tiên, phươngpháp đề xuất tiến hành phântích chương trình để sinhliệukiểmthử thay sinh ngẫu nhiên Bởi thế, trình thực thi liệukiểmthử gây lỗi so với phươngphápsinh ngẫu nhiên, đặc biệt với chương trình thao tác với vùng nhớ trỏ, xâu, v.v Thứ hai, để sinh số lượng liệukiểmthử nhỏ mà đạt độ phủ tối đa, luận văn đề xuất thuật tốn LDFS Tư tưởng thuật tốn LDFS sinhliệukiểmthửcho trường hợp đơn giản hết mức để giảm thiểu chi phí phântíchmãnguồnmà đạt độ phủ tối đa Cụ thể, tập liệukiểmthửsinh thỏa mãn lặp vòng lặp tối đa lần, tức nhánh sai câu lệnh điều kiện qua Sau bước này, độ phủ đạt chưa tối đa, LDFS tiến hành sinhliệukiểmthử thỏa mãn lặp vòng lặp tối đa lần (tức theo nhánh sai câu lệnh điều kiện), sau lặp lần, lần, v.v đến số lần lặp tối đa cấu hình từ trước Quá trình sinhliệukiểmthử dừng lại độ phủ đạt tối đa, hết thời gian chạy, LDFS đạt đến số lần lặp tối đa vòng lặp Cơng cụ CFT4Cpp cần tiếp tục phát triển để ngày hoàn thiện Thứ nhất, CFT4Cpp nâng cấp để hỗ trợ đầy đủ cú pháp chuẩn C++98, C++03, C++11, C++14 Để làm điều này, kĩ thuật phântíchmãnguồn cần cải tiến Thứ hai, nhiều trường hợp dựán C/C++ cần xử lý thêm template, dynamic invocation, overloading, v.v Thứ ba, thuật toán thực thi tượng trưng chưa giải vấn đề sử dụng nhớ không tường minh sử 45 dụng hàm liên quan nhớ memmove, strncat Kĩ thuật thực thi tượng trưng chưa mơ đầy đủ xác thay đổi biến câu lệnh kiểu gọi Thứ tư, công cụ cần cải tiến để sinhliệukiểmthửcho độ phủ khác bên cạnh ba độ phủ hỗ trợ sẵn gồm độ phủ nhánh, độ phủ câu lệnh độ phủ MC/DC Cuối cùng, công cụ hướng tới hỗ trợ nhiều trình biên dịch khác tảng khác 46 PHỤ LỤC // Hàm calculateAge struct Date { int date; int month; int year;}; int calculateZodiac(Date born) { int date1 = born.date; int month1 = born.month; int year1 = born.year; int t; if (((month1 == 3) && (date1 >= 21) && (date1 = 20) && (date1