1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Phương pháp phân tích mã nguồn và sinh dữ liệu kiểm thử cho các dự án c c++

68 93 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 68
Dung lượng 3,61 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ƯƠNG PHÁP PHÂN TÍCH MÃ NGUỒN VÀ SINH DỮ LIỆU KIỂM THỬ CHO CÁC DỰ Á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ƯƠNG PHÁP PHÂN TÍCH MÃ NGUỒN VÀ SINH DỮ LIỆU KIỂM THỬ CHO CÁC DỰ Á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ương pháp nghiên cứu, kĩ giao tiếp, kĩ làm việc nhóm, kĩ trình bày Thầy cịn 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ểm thử 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ểm thử 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 .1 Tổng quan kĩ thuật kiểm thử tự động định hướng 2.1 Dữ liệu kiểm thử 2.2 Các tiêu chí độ phủ sử dụng kĩ thuật kiểm thử tự động định hướng 2.3 Đồ thị dòng điều khiển .6 2.4 Cây cú pháp trừu tượng 2.5 Quy trình chung kĩ thuật kiểm thử tự động định hướng Phương pháp kiểm thử tự động dự án C/C++ sử dụng kĨ thuật kiểm thử tự động định hướng 3.1 Tổng quan phương phá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 sinh liệu kiểm thử .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ệu kiểm thử môi trường chạy 26 3.5 Tối ưu hóa pha sinh liệu kiểm thử 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ệu kiểm thử .28 3.6 Xuất mã nguồn kiểm thử theo chuẩn Google Test 29 Công cụ thực nghiệm 30 4.1 Giới thiệu công cụ kiểm thử tự động CFT4Cpp 30 4.2 Thư viện hỗ trợ sử dụng công cụ kiểm thử 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ân tích mã 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ệu kiểm thử độ phủ với KLEE, CAUT, CREST, PathCrawler 35 4.3.2 Sinh liệu kiểm thử vòng lặp 40 4.3.3 So sánh thời gian biên dịch thực thi liệu kiểm thử 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 đủ Tên viết tắt Dynamic Symbolic Execution DSE Mô tả Kĩ thuật kiểm thử động Static Testing Kĩ thuật kiểm thử tĩnh Concolic Testing Kĩ thuật kiểm thử 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 Solver Theories SMT-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ệu kiểm thử Test data Dữ liệu kiểm thử Test path Đường thi hành (sinh từ đồ thị CFG) Modified condition/ coverage decision MC/DC Độ 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ểm thử tiêu chí độ phủ số liệu kiểm thử .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 Sinh liệu kiểm thử 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ệu kiểm thử 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 tốn LDFS sinh liệu kiểm thử 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ương phá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ểm thử 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 sinh liệu kiểm thử cho hàm Divide 32 Hình 4.5 Biên kiểm thử 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ỒN Mã nguồn 3.1 Ví dụ phần mã nguồn dự á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ểm thử khác áp dụng khiến chi phí kiểm thử tăng cao Trong đó, kiểm thử đơ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ểm thử đơn vị vấn đề chi phí tăng cao dự án lớn kĩ thuật kiểm thử 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ểm thử đơn vị nên tự động hóa hồn toàn Bởi thế, luận văn hướng đến xây dựng giải pháp kiểm thử tự động mức đơn vị cho dự án C/C++ Tư tưởng phương pháp đề xuất dựa kĩ thuật kiểm thử tự động định hướng Hiện nay, kĩ thuật kiểm thử tự động định hướng chứng minh tính hiệu toán kiểm thử tự động Tuy vậy, vấn đề tồn cần giải kĩ thuật kiểm thử tự động định hướng gồm vấn đề sinh liệu kiểm thử chưa đủ tốt, sinh tập liệu kiểm thử 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 sinh liệu kiểm thử dựa thơng tin phân tích mã nguồn thay áp dụng kĩ thuật sinh ngẫu nhiên truyền thống kĩ thuật kiểm thử tự động định hướng Để giảm thiểu số lượng liệu kiểm thử đạt độ phủ cao, thuật toán LDFS đề xuất Để chứng minh tính hiệu phương pháp đề xuất, công cụ CFT4Cpp xây dựng dựa phương pháp đề xuất tiến hành so sánh với phương pháp kiểm thử 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ương pháp đề xuất 44 KẾT LUẬN Luận văn trình bày phương pháp phân tích mã nguồn sinh liệu kiểm thử tự động cho dự á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ương phá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 đề sinh liệu kiểm thử kiểm thử kĩ thuật kiểm thử tự động định hướng, đề xuất phương pháp sinh tập liệu kiểm thử số lượng nhỏ đạt độ phủ tối đa Thứ nhất, để giải vấn đề sinh liệu kiểm thử đầu tiên, phương pháp đề xuất tiến hành phân tích chương trình để sinh liệu kiểm thử thay sinh ngẫu nhiên Bởi thế, trình thực thi liệu kiểm thử gây lỗi so với phương pháp sinh 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ệu kiểm thử nhỏ mà đạt độ phủ tối đa, luận văn đề xuất thuật tốn LDFS Tư tưởng thuật toán LDFS sinh liệu kiểm thử cho trường hợp đơn giản hết mức để giảm thiểu chi phí phân tích mã nguồn mà đạt độ phủ tối đa Cụ thể, tập liệu kiểm thử 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 sinh liệu kiểm thử 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 sinh liệu kiểm thử 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ân tích mã 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 để sinh liệu kiểm thử 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

Ngày đăng: 30/07/2020, 10:12

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w