Luận Văn Thạc Sĩ: Phương Pháp Phân Tích Mã Nguồn và Sinh Dữ Liệu Kiểm Thử cho Dự Án C/C++

Luận văn thạc sĩ VNU UET trình bày 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 và luận văn thạc sĩ máy tính 604801.

Chuyên ngành

Công nghệ thông tin

Người đăng

Ẩn danh

Thể loại

Luận văn thạc sĩ

2017

68
5
0

Phí lưu trữ

30 Point

Mục lục chi tiết

LỜI CẢM ƠN

LỜI CAM ĐOAN

1. GIỚI THIỆU

2. 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 trong kĩ thuật kiểm thử 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ểm thử tự động định hướng

3. 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

3.3. Xây dựng cây cấu trúc từ dự án C/C++

3.4. Chèn các câu lệnh đánh dấu vào hàm

3.5. Pha sinh dữ liệu kiểm thử

3.6. Xây dựng đồ thị dòng điều khiển từ mã nguồn

3.7. Xếp hạng đường thi hành

3.8. Xây dựng hệ ràng buộc từ đường thi hành

3.9. Mô hình bộ nhớ sử dụng trong kĩ thuật thực thi tượng trưng

3.10. 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

3.11. Giải hệ ràng buộc sử dụng bộ giải SMT-Solver

3.12. Biên dịch và thực thi dữ liệu kiểm thử trong môi trường chạy

3.13. Tối ưu hóa pha sinh dữ liệu kiểm thử

3.14. Đơn giản hóa hệ ràng buộc

3.15. Tăng tốc thời gian biên dịch và thực thi dữ liệu kiểm thử

3.16. Xuất mã nguồn kiểm thử theo chuẩn Google Test

4. CÔNG CỤ VÀ THỰC NGHIỆM

4.1. Giới thiệu công cụ kiểm thử tự động CFT4Cpp

4.2. Thư viện hỗ trợ sử dụng trong công cụ kiểm thử tự động CFT4Cpp

4.3. Thư viện giải hệ ràng buộc Z3

4.4. Thư viện phân tích mã nguồn CDT

4.5. Thư viện tính giá trị biểu thức Jeval

4.6. Kết quả thực nghiệm

4.7. So sánh số lượng bộ dữ liệu kiểm thử và độ phủ với KLEE, CAUT, CREST, PathCrawler

4.8. Sinh dữ liệu kiểm thử vòng lặp

4.9. So sánh thời gian biên dịch và thực thi dữ liệu kiểm thử

TÀI LIỆU THAM KHẢO

DANH SÁCH KÝ HIỆU, CHỮ VIẾT TẮT

DANH SÁCH BẢNG BIỂU

DANH SÁCH THUẬT TOÁN

DANH SÁCH HÌNH VẼ

DANH SÁCH MÃ NGUỒN

TÓM TẮT

Tóm tắt

I. Tổng quan về Phương Pháp Phân Tích Mã Nguồn và Sinh Dữ Liệu Kiểm Thử cho Dự Án C C

Phương pháp phân tích mã nguồn và sinh dữ liệu kiểm thử là một phần quan trọng trong quy trình phát triển phần mềm, đặc biệt là trong các dự án C/C++. Việc áp dụng các phương pháp này giúp đảm bảo chất lượng mã nguồn và phát hiện lỗi sớm trong quá trình phát triển.

1.1. Khái niệm về Phân Tích Mã Nguồn

Phân tích mã nguồn là quá trình kiểm tra và đánh giá mã nguồn của phần mềm để phát hiện lỗi và cải thiện chất lượng. Nó bao gồm việc sử dụng các công cụ và kỹ thuật để phân tích cú pháp, cấu trúc và logic của mã.

1.2. Tầm quan trọng của Sinh Dữ Liệu Kiểm Thử

Sinh dữ liệu kiểm thử là quá trình tạo ra các bộ dữ liệu đầu vào cho các bài kiểm thử. Điều này giúp đảm bảo rằng phần mềm hoạt động đúng với các điều kiện khác nhau và phát hiện lỗi tiềm ẩn.

II. Vấn đề và Thách thức trong Kiểm Thử Phần Mềm C C

Trong quá trình kiểm thử phần mềm C/C++, có nhiều thách thức cần phải đối mặt. Những vấn đề này có thể ảnh hưởng đến hiệu quả và độ chính xác của quá trình kiểm thử.

2.1. Chi phí Kiểm Thử Cao

Chi phí kiểm thử có thể tăng cao do số lượng hàm và điều kiện cần kiểm tra. Điều này đặc biệt đúng trong các dự án lớn, nơi mà việc kiểm thử từng thành phần nhỏ có thể tốn nhiều thời gian và nguồn lực.

2.2. Khó khăn trong Phân Tích Mã Nguồn

Phân tích mã nguồn C/C++ có thể gặp khó khăn do tính phức tạp của ngôn ngữ và các cú pháp khác nhau. Điều này có thể dẫn đến việc bỏ sót các lỗi quan trọng trong mã.

III. Phương Pháp Kiểm Thử Tự Động Định Hướng cho Dự Án C C

Phương pháp kiểm thử tự động định hướng là một giải pháp hiệu quả để giảm thiểu chi phí và thời gian kiểm thử. Phương pháp này sử dụng các kỹ thuật phân tích mã nguồn để sinh dữ liệu kiểm thử một cách tự động.

3.1. Kỹ Thuật Kiểm Thử Tự Động

Kỹ thuật kiểm thử tự động giúp tự động hóa quá trình sinh dữ liệu kiểm thử, từ đó giảm thiểu sự can thiệp của con người và tăng độ chính xác của quá trình kiểm thử.

3.2. Quy Trình Sinh Dữ Liệu Kiểm Thử

Quy trình sinh dữ liệu kiểm thử bao gồm việc phân tích mã nguồn, xây dựng đồ thị dòng điều khiển và áp dụng các thuật toán để tạo ra các bộ dữ liệu kiểm thử hiệu quả.

IV. Ứng Dụng Thực Tiễn và Kết Quả Nghiên Cứu

Việc áp dụng phương pháp phân tích mã nguồn và sinh dữ liệu kiểm thử đã cho thấy nhiều kết quả tích cực trong các dự án C/C++. Các công cụ như CFT4Cpp đã được phát triển để hỗ trợ quá trình này.

4.1. Công Cụ CFT4Cpp

CFT4Cpp là một công cụ kiểm thử tự động được phát triển để hỗ trợ sinh dữ liệu kiểm thử cho các dự án C/C++. Công cụ này giúp tối ưu hóa quy trình kiểm thử và nâng cao độ chính xác.

4.2. Kết Quả So Sánh với Các Phương Pháp Khác

Kết quả nghiên cứu cho thấy phương pháp đề xuất có hiệu quả cao hơn so với các phương pháp kiểm thử khác như KLEE và PathCrawler, đặc biệt trong việc giảm thiểu chi phí và thời gian kiểm thử.

V. Kết Luận và Tương Lai của Phương Pháp Kiểm Thử

Phương pháp phân tích mã nguồn và sinh dữ liệu kiểm thử cho dự án C/C++ đã chứng minh được tính hiệu quả và cần thiết trong quy trình phát triển phần mềm. Tương lai của phương pháp này hứa hẹn sẽ tiếp tục phát triển với sự hỗ trợ của công nghệ mới.

5.1. Hướng Phát Triển Tương Lai

Các nghiên cứu tiếp theo sẽ tập trung vào việc cải thiện các thuật toán sinh dữ liệu kiểm thử và mở rộng khả năng hỗ trợ cho các ngôn ngữ lập trình khác.

5.2. Tác Động Đến Ngành Công Nghiệp Phần Mềm

Việc áp dụng các phương pháp này sẽ giúp nâng cao chất lượng phần mềm và giảm thiểu rủi ro trong quá trình phát triển, từ đó tạo ra những sản phẩm phần mềm tốt hơn cho người dùng.

22/07/2025

Trích đoạn nội dung tài liệu

ĐẠ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 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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 bộ hướng dẫn: PGS. Phạm Ngọc Hùng HÀ NỘI - 2017 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com II LỜI CẢM ƠN Đầu tiên, tôi 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 bộ môn Công Nghệ Phần Mềm – người đã hướng dẫn tận tình, tỉ mỉ, chu đáo tôi trong suốt hai năm làm luận văn. Quãng thời gian được thầy hướng dẫn đã giúp tôi học hỏi, đúc kết được nhiều kinh nghiệm về phương pháp nghiên cứu, kĩ năng giao tiếp, kĩ năng làm việc nhóm, kĩ năng trình bày. Thầy còn truyền cho tôi ngọn lửa yêu nghiên cứu khoa học, niềm tin vượt qua những khó khăn trong cuộc sống và dạy tôi cách vượt qua những khó khăn đó.

Tôi cảm thấy tự hào và may mắn khi là một học viên được thầy hướng dẫn trong những năm tháng cao học. Ngoài ra, tôi 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 sao cho đạt hiệu quả cao nhất. Cám ơn nhóm nghiên cứu đã giúp đỡ tôi bằng hành động, bằng lời nói mỗi khi tôi gặp khó khăn, thất bại. Hai năm bên nhau không phải là dài nhưng đối với tôi, đây là quãng thời gian tuyệt vời nhất và không thể nào quên.

Tiếp theo, tôi xin gửi lời cảm ơn đến các thầy cô giảng viên Trường Đại học Công Nghệ - Đại học Quốc Gia Hà Nội – những người đã tận tâm truyền đạt những kiến thức quý báu làm nền tảng để tôi tiếp tục đi xa hơn nữa trong lĩnh vực công nghệ thông tin. Cuối cùng, tôi xin được cảm ơn gia đình đã nuôi tôi khôn lớn để trở thành người có ích cho xã hội, giúp tôi có một điểm tựa vững chắc để yên tâm học hành trong 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 đã luôn động viên và cổ vũ tôi mỗi khi tôi gặp khó khăn và thử thách. Hà Nội, ngày 25 tháng 11 năm 2017 Học viên Nguyễn Đức Anh LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com III LỜI CAM ĐOAN Tôi xin cam đoan rằng những nghiên cứu về kiểm thử tự động cho chương trình C/C++ được trình bày trong luận văn này là của tôi và chưa từng được nộp như một báo cáo luận văn tại trường Đại học Công Nghệ - Đại học Quốc Gia Hà Nội hoặc bất kỳ trường đại học khác.

Những gì tôi viết ra không sao chép từ các tài liệu, không sử dụng các kết quả của 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 tôi trình bày trong khoá luận là do tôi tự phát triển, không sao chép mã nguồn của người khác. Nếu sai tôi hoàn toàn chịu trách nhiệm theo quy định của 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 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com IV MỤC LỤC Giới thiệu.

1 Tổng quan kĩ thuật kiểm thử tự động định hướng. Dữ liệu kiểm thử. Các tiêu chí độ phủ sử dụng trong kĩ thuật kiểm thử tự động định hướng 5 2. Đồ thị dòng điều khiển.

Cây cú pháp trừu tượng. Quy trình chung kĩ thuật kiểm thử tự động định hướng. 7 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. Tổng quan phương pháp đề xuất.

Pha tiền xử lý mã nguồn. Xây dựng cây cấu trúc từ dự án C/C++. Chèn các câu lệnh đánh dấu vào hàm. Pha sinh dữ liệu kiểm thử.

Xây dựng đồ thị dòng điều khiển từ mã nguồn. Xếp hạng đường thi hành. Xây dựng hệ ràng buộc từ đường thi hành. Mô hình bộ nhớ sử dụng trong kĩ thuật thực thi tượng trưng.

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. Giải hệ ràng buộc sử dụng bộ giải SMT-Solver. Biên dịch và thực thi dữ liệu kiểm thử trong môi trường chạy. Tối ưu hóa pha sinh dữ liệu kiểm thử.

Đơn giản hóa hệ ràng buộc. 27 LUAN VAN CHAT LUONG download : add luanvanchat@agmail. Tăng tốc thời gian biên dịch và thực thi dữ liệu kiểm thử. Xuất mã nguồn kiểm thử theo chuẩn Google Test.

29 Công cụ và thực nghiệm. Giới thiệu công cụ kiểm thử tự động CFT4Cpp. Thư viện hỗ trợ sử dụng trong công cụ kiểm thử tự động CFT4Cpp. Thư viện giải hệ ràng buộc Z3.

Thư viện phân tích mã nguồn CDT. Thư viện tính giá trị biểu thức Jeval. Kết quả thực nghiệm. So sánh số lượng bộ dữ liệu kiểm thử và độ phủ với KLEE, CAUT, CREST, PathCrawler.

Sinh dữ liệu kiểm thử vòng lặp. So sánh thời gian biên dịch và thực thi dữ liệu kiểm thử. 44 Tài liệu tham khảo. 48 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com VI DANH SÁCH KÝ HIỆU, CHỮ VIẾT TẮT Tên đầy đủ Tên viết tắt Mô tả Dynamic Symbolic Execution DSE 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 Theories SMT-Solver Solver Boolean Satisfiability Problem SAT Symbolic Execution SE Kĩ thuật thực thi tượng trưng Chiến thuật chọn đường thi hành (trong Path selection strategy DSE) Test driver Bộ thực thi dữ 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/ decision MC/DC Độ phủ cấp ba (hoặc phủ điều kiện con) coverage LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com VII DANH SÁCH BẢNG BIỂU Bảng 3.

Danh sách quan hệ phụ thuộc lô-gic điển hình. Luật chèn câu lệnh đánh dấu vào hàm. Thông tin các công cụ so sánh trong thực nghiệm. Thông tin cấu hình các ví dụ trong thực nghiệm.

Thông tin các hàm kiểm thử về tiêu chí độ phủ và số bộ dữ liệu kiểm thử. Kết quả so sánh công cụ CFT4Cpp với KLEE và PathCrawler. Kết quả so sánh công cụ CFT4Cpp với CREST và CAUT. Sinh dữ liệu kiểm thử vòng lặp.

Bảng so sánh thời gian biên dịch và thực thi dữ liệu kiểm thử giữa kĩ thuật cải tiến và kĩ thuật truyền thống. 43 DANH SÁCH THUẬT TOÁN Thuật toán 3. Thuật toán LDFS sinh dữ liệu kiểm thử. 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. Các cấu trúc điều khiển phổ biến trong C/C++. Tổng quan phương pháp đề xuất. Ví dụ cây cấu trúc của một dự án C/C++ điển hình.

Minh họa đồ thị CFG phủ câu lệnh/nhánh. Minh họa đồ thị CFG phủ MC/DC. Mô hình bộ nhớ sử dụng trong kĩ thuật thực thi tượng trưng. Quy trình xây dựng biểu thức SMT-Lib từ ràng buộc.

Quá trình biến đổi hệ ràng buộc về chuẩn SMTLib. Kĩ thuật tạo bộ thực thi ca kiểm thử tổng quát. 28 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com VIII Hình 4. Kiến trúc công cụ CFT4Cpp.

Giao diện chính của công cụ CFT4Cpp. Giao diện bước cấu hình công cụ CFT4Cpp. Giao diện sinh dữ liệu kiểm thử cho hàm Divide. Biên bản kiểm thử xuất bởi công cụ CFT4Cpp cho hàm Divide.

Minh họa kết quả giải hệ ràng buộc sử dụng Z3. 34 DANH SÁCH MÃ NGUỒN Mã nguồn 3. Ví dụ một phần mã nguồn trong dự án C/C++. Ví dụ hàm checkFirstSubject sau khi chèn câu lệnh đánh dấu.

Mã nguồn hàm average. Minh họa một hệ ràng buộc theo chuẩn SMT-Lib. 34 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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 nhau được áp dụng khiến chi phí kiểm thử tăng cao. Trong đó, kiểm thử đơn vị là một trong những kĩ thuật được áp dụng rộng rãi trong các công ty phần mềm để kiểm tra chất lượng mã nguồn, đặc biệt đối với các phần mềm nhúng viết bằng ngôn ngữ C/C++.

Kĩ thuật này giúp phát hiện sớm nhiều vấn đề tiềm ẩn trong quy trình xây dựng phần mềm. Tuy nhiên, nhược điểm của kĩ thuật kiểm thử đơn vị là vấn đề chi phí tăng cao đối với những dự án lớn bởi vì kĩ thuật kiểm thử này xem xét tính đúng đắn của từng thành phần nhỏ nhất trong mã nguồn. Để giảm thiểu bài toán chi phí, quy trình kiểm thử đơn vị nên được tự động hóa hoàn toàn. Bởi thế, luận văn hướng đến xây dựng một giải pháp kiểm thử tự động mức đơn vị cho các dự án C/C++.

Tư tưởng chính của phương pháp đề xuất dựa trên 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 đã được chứng minh tính hiệu quả trong bài toán kiểm thử tự động. Tuy vậy, các vấn đề còn tồn tại cần giải quyết của kĩ thuật kiểm thử tự động định hướng gồm vấn đề sinh dữ liệu kiểm thử đầu tiên chưa đủ tốt, sinh tập dữ liệu kiểm thử có số lượng nhỏ nhưng đạt độ phủ cao. Do đó, luận văn tập trung giải quyết các bài toán này.

Cụ thể, luận văn đề xuất kĩ thuật sinh dữ liệu kiểm thử đầu tiên dựa trên thông tin phân tích mã nguồn thay vì áp dụng kĩ thuật sinh ngẫu nhiên truyền thống trong kĩ thuật kiểm thử tự động định hướng. Để giảm thiểu số lượng bộ dữ liệu kiểm thử trong khi vẫn đạt độ phủ cao, thuật toán LDFS được đề xuất. Để chứng minh tính hiệu quả của phương pháp đề xuất, công cụ CFT4Cpp được xây dựng dựa trên phương pháp đề xuất và tiến hành so sánh với các phương pháp kiểm thử khác gồm KLEE, PathCrawler, CAUT, CREST. Kết quả nghiên cứu đã được đăng trong hai hội nghị NICS 2016 và SoICT 2017 với đánh giá khả quan về tính thực tiễn của phương pháp đề xuất.

LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 1 GIỚI THIỆU Kiểm thử đơn vị là một trong những pha quan trọng nhất để đảm bảo chất lượng của phần mềm, đặc biệt các phần mềm nhúng. Hai phương pháp được sử dụng phổ biến gồm kiểm thử hộp đen và kiểm thử hộp trắng.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ