Tổng quan nghiên cứu
Tình trạng sao chép mã nguồn trong đào tạo lập trình và phát triển phần mềm đang gia tăng nhanh chóng, gây ảnh hưởng nghiêm trọng đến tính liêm chính học thuật. Theo các khảo sát thực tế tại các trường đại học đào tạo công nghệ thông tin, tỷ lệ bài tập lập trình cơ sở như ngôn ngữ C có dấu hiệu sao chép dao động từ 25% đến 40%. Những công cụ phát hiện truyền thống chủ yếu dựa trên so khớp chuỗi ký tự hoặc phân tích token tuyến tính thường dễ dàng bị vô hiệu hóa bởi các kỹ thuật làm rối mã nguồn cơ bản như đổi tên biến, thay đổi cấu trúc rẽ nhánh, hay hoán đổi vị trí các đoạn mã độc lập.
Vấn đề cốt lõi đặt ra là làm thế nào để nhận diện chính xác hành vi sao chép ở mức độ ngữ nghĩa (semantic level) mà không phụ thuộc vào cách trình bày bề mặt của văn bản nguồn. Mục tiêu chính của luận văn là nghiên cứu, thiết kế và triển khai một giải pháp phát hiện sao chép mã nguồn chương trình C dựa trên kỹ thuật phân rã chương trình (Program Decomposition / Program Slicing). Phương pháp này phân tích sâu vào cấu trúc đồ thị phụ thuộc dữ liệu và luồng điều khiển để trích xuất các lát cắt logic cốt lõi của thuật toán.
Nghiên cứu được thực hiện trong phạm vi các chương trình viết bằng ngôn ngữ C thu thập từ các kỳ thi lập trình và hệ thống nộp bài trực tuyến trong giai đoạn từ năm 2022 đến năm 2024. Kết quả nghiên cứu đóng góp một khung giải pháp toàn diện giúp nâng cao độ chính xác phát hiện (Precision) đạt mức 94,5%, đồng thời kéo giảm tỷ lệ báo động giả (False Positive Rate) xuống dưới 4,2%, tạo tiền đề vững chắc cho việc ứng dụng vào các hệ thống chấm điểm tự động quy mô lớn.
Cơ sở lý thuyết và phương pháp nghiên cứu
Khung lý thuyết áp dụng
Nghiên cứu xây dựng trên nền tảng lý thuyết phân rã chương trình (Program Slicing Theory) do Mark Weiser khởi xướng, kết hợp cùng mô hình Đồ thị phụ thuộc chương trình (Program Dependence Graph - PDG). Kỹ thuật này cho phép phân tách một chương trình phức tạp thành các lát cắt tĩnh (Static Slices) chứa các câu lệnh ảnh hưởng trực tiếp hoặc gián tiếp đến giá trị của một biến tại điểm quan tâm cụ thể.
Bên cạnh đó, nghiên cứu tích hợp lý thuyết Cây cú pháp trừu tượng (Abstract Syntax Tree - AST) và Đồ thị luồng điều khiển (Control Flow Graph - CFG) nhằm chuẩn hóa cấu trúc mã nguồn. Khung phân tích tập trung vào năm khái niệm cốt lõi:
- Lát cắt chương trình tĩnh (Static Program Slice): Tập hợp con các câu lệnh thực thi có thể tác động đến trạng thái tính toán tại một điểm xác định.
- Đồ thị phụ thuộc chương trình (PDG): Cấu trúc dữ liệu biểu diễn tường minh cả phụ thuộc dữ liệu (Data Dependency) và phụ thuộc điều khiển (Control Dependency).
- Chuỗi token chuẩn hóa (Canonical Token Stream): Mã nguồn sau khi được loại bỏ yếu tố định danh bề mặt và quy chuẩn về các dạng nguyên tử.
- Độ tương đồng cấu trúc ngữ nghĩa (Semantic Structural Similarity): Thước đo mức độ tương đồng giữa hai đồ thị hoặc hai tập lát cắt dựa trên cấu trúc giải thuật.
- Phân rã hàm chức năng (Functional Decomposition): Quá trình chia nhỏ mã nguồn thành các khối chức năng độc lập nhằm giảm độ phức tạp tính toán khi so khớp.
Phương pháp nghiên cứu
Nguồn dữ liệu thực nghiệm bao gồm 2.500 tệp mã nguồn C với quy mô hơn 180.000 dòng lệnh (LOC), được trích xuất từ kho lưu trữ bài tập lớn và các cuộc thi lập trình sinh viên. Cỡ mẫu này đảm bảo tính đại diện cho nhiều phong cách lập trình từ sơ cấp đến nâng cao.
Phương pháp chọn mẫu được áp dụng là lấy mẫu phân tầng ngẫu nhiên (Stratified Random Sampling). Dữ liệu được chia thành 5 nhóm tương ứng với 5 mức độ phức tạp của bài toán: cấu trúc tuần tự rẽ nhánh, vòng lặp lồng nhau, thao tác mảng và con trỏ, cấu trúc dữ liệu tự định nghĩa (struct), và xử lý tệp tin kết hợp đệ quy. Việc phân tầng này giúp kiểm tra khả năng phát hiện của thuật toán trên đa dạng các dạng biến đổi cấu trúc.
Lý do lựa chọn phương pháp phân tích đồ thị phụ thuộc và phân rã chương trình thay vì các mô hình học máy đen (Black-box Machine Learning) là tính tường minh, khả năng giải thích rõ ràng căn nguyên của sự sao chép và khả năng chống chịu vượt trội trước các kỹ thuật đổi tên hàm, thay đổi cấu trúc lặp (chuyển đổi giữa for, while, do-while) hay chèn mã rác. Quy trình nghiên cứu được triển khai xuyên suốt 18 tháng qua bốn giai đoạn: tiền xử lý mã nguồn và xây dựng AST, phân rã và trích xuất lát cắt PDG, tính toán ma trận tương đồng, và đánh giá thực nghiệm đối sánh.
Kết quả nghiên cứu và thảo luận
Những phát hiện chính
Quá trình kiểm nghiệm thực nghiệm trên bộ dữ liệu kiểm thử độc lập đã chứng minh tính hiệu quả vượt bậc của phương pháp phân rã chương trình so với các phương pháp tiếp cận truyền thống:
- Khả năng chống kỹ thuật làm rối định danh và hoán đổi lệnh: Hệ thống đạt độ nhạy (Recall) lên tới 96,8% đối với các trường hợp mã nguồn bị cố tình đổi tên biến, thay đổi kiểu dữ liệu tương đương và đảo vị trí các lệnh độc lập. Con số này cao hơn 21,5% so với công cụ so khớp chuỗi token tiêu chuẩn (đạt 75,3%).
- Nhận diện biến đổi cấu trúc điều khiển nâng cao: Khi tác giả mã nguồn cố tình biến đổi cấu trúc vòng lặp hoặc tách hàm thành nhiều hàm con, phương pháp phân rã vẫn duy trì chỉ số F1-Score ở mức 93,2%, trong khi các phương pháp dựa trên cây cú pháp AST thuần túy chỉ đạt 72,1%.
- Hiệu năng xử lý và tối ưu hóa tài nguyên: Nhờ cơ chế phân rã cục bộ trước khi so khớp đồ thị, thời gian tính toán trung bình cho một cặp tệp nguồn 500 dòng lệnh giảm 38,4%, chỉ mất khoảng 0,18 giây so với mức 0,29 giây của các thuật toán so khớp toàn phần đồ thị đẳng cấu (Graph Isomorphism).
Thảo luận kết quả
Nguyên nhân cốt lõi giúp kỹ thuật phân rã đạt kết quả vượt trội nằm ở việc phương pháp này đã triệt tiêu hoàn toàn sự phụ thuộc vào thứ tự xuất hiện cục bộ của các dòng lệnh. Bằng cách tập trung vào luồng dữ liệu thực sự chảy qua các biến và luồng điều khiển quyết định việc thực thi, các lát cắt chương trình phản ánh trung thực bản chất logic của giải thuật. Do đó, các hành vi sao chép tinh vi như chèn mã vô thưởng vô phạt (Dead Code) hay bao bọc khối lệnh trong các biểu thức điều kiện luôn đúng đều bị phát hiện và loại bỏ trong bước trích xuất lát cắt.
Dữ liệu thực nghiệm được trực quan hóa thông qua ma trận nhầm lẫn (Confusion Matrix) với các thông số phân định rõ ràng giữa mã nguồn nguyên bản và mã nguồn đạo văn. Biểu đồ đường cong ROC (Receiver Operating Characteristic) ghi nhận diện tích dưới đường cong (AUC) đạt 0,972, minh chứng cho sự phân tách rành mạch giữa các phân phối điểm tương đồng. Khi trình bày qua biểu đồ cột so sánh hiệu năng, phương pháp đề xuất luôn nằm ở nhóm dẫn đầu về độ chính xác và khả năng xử lý các tập tin có dung lượng lớn trên 1.000 dòng lệnh.
Khi so sánh với các nghiên cứu tương tự trên thế giới, phương pháp này vượt trội hơn mô hình n-gram của Prechelt khoảng 18,2% về khả năng chống chịu việc chèn mã rác, đồng thời mang lại độ chính xác tương đương với các thuật toán so khớp đồ thị sâu nhưng giảm được hơn một nửa chi phí tính toán CPU.
Đề xuất và khuyến nghị
Dựa trên các kết quả đạt được, luận văn đưa ra bốn nhóm giải pháp mang tính ứng dụng thực tiễn cao:
- Tích hợp module phân rã vào hệ thống chấm bài tự động: Đề xuất các trung tâm công nghệ thông tin và khoa đào tạo tích hợp trực tiếp giải pháp vào các nền tảng nộp bài trực tuyến (Online Judge/LMS) nhằm rút ngắn thời gian kiểm tra tính liêm chính từ 48 giờ sau thi xuống còn dưới 15 phút ngay sau khi thí sinh nộp bài.
- Áp dụng cơ chế lọc đa tầng (Multi-tier Filtering): Khuyến nghị các hệ thống quản lý học tập kết hợp bộ lọc nhanh dựa trên token ở tầng 1 (lọc các bài có độ tương đồng thô >60%) trước khi kích hoạt bộ phân rã sâu ở tầng 2, giúp tiết kiệm 55% tài nguyên máy chủ trong các kỳ thi tập trung quy mô trên 3.000 thí sinh.
- Chuẩn hóa quy chế liêm chính học thuật trong lập trình: Hội đồng đào tạo nhà trường cần ban hành quy định định lượng cụ thể về việc tái sử dụng mã nguồn, trong đó quy định rõ tỷ lệ tương đồng tối đa cho phép đối với các thư viện chuẩn là dưới 15%, thực hiện hoàn thành trong vòng 6 tháng.
- Mở rộng giải thuật cho các ngôn ngữ lập trình kế thừa: Nhóm phát triển phần mềm cần tiếp tục hoàn thiện khung phân rã để hỗ trợ các chuẩn ngôn ngữ mới như C++20 và C#, nâng độ bao phủ đối với các thư viện mẫu (Template Libraries) lên mức 90% trước quý 4 năm 2026.
Đối tượng nên tham khảo luận văn
Luận văn mang lại giá trị học thuật và ứng dụng thực tiễn rõ rệt cho bốn nhóm đối tượng chính:
- Giảng viên và trợ giảng ngành Công nghệ thông tin: Cung cấp công cụ và phương pháp luận sắc bén để tự động hóa quy trình đánh giá bài tập lớn, phát hiện chính xác các trường hợp sao chép tinh vi với độ tin cậy trên 94%, giải phóng đáng kể thời gian chấm bài thủ công.
- Kỹ sư phát triển hệ thống kiểm tra và thi trực tuyến: Tham khảo toàn bộ kiến trúc pipeline xử lý mã nguồn, từ khâu phân tích cú pháp, trích xuất đồ thị phụ thuộc đến thuật toán so khớp lát cắt để nhúng vào các sản phẩm EdTech thương mại.
- Chuyên gia kiểm thử và bảo mật phần mềm: Ứng dụng lý thuyết phân rã chương trình và phân tích luồng điều khiển để phát hiện các lỗ hổng bảo mật, kiểm tra vi phạm bản quyền phần mềm nguồn mở hoặc phân tích mã độc ẩn giấu trong các thư viện liên kết tĩnh.
- Học viên cao học và nghiên cứu sinh: Sử dụng tài liệu như một công trình tổng quan chuyên sâu về kỹ thuật phân tích chương trình tĩnh (Static Program Analysis), khai phá dữ liệu mã nguồn và mô hình hóa đồ thị cú pháp.
Câu hỏi thường gặp
- Phương pháp phân rã chương trình C khác gì so với công cụ kiểm tra văn bản thông thường?
Các công cụ kiểm tra văn bản dựa vào việc so khớp xâu ký tự hoặc từ khóa, do đó hoàn toàn mất tác dụng khi sinh viên đổi tên biến hoặc cấu trúc câu lệnh. Phương pháp phân rã chương trình phân tích cấu trúc đồ thị phụ thuộc và ngữ nghĩa thuật toán, giúp nhận diện chính xác bản chất logic bài toán bất chấp mọi thay đổi về mặt cú pháp bề mặt.
- Thuật toán có bị đánh lừa khi sinh viên thay đổi vòng lặp for thành while không?
Không. Cây cú pháp trừu tượng và đồ thị luồng điều khiển của thuật toán sẽ chuẩn hóa các cấu trúc lặp về dạng đồ thị phụ thuộc tương đương. Do đó, việc thay đổi giữa vòng lặp for, while hay do-while không làm thay đổi các lát cắt logic cốt lõi, hệ thống vẫn ghi nhận độ tương đồng ngữ nghĩa trên 93%.
- Hệ thống có tốn nhiều thời gian khi kiểm tra hàng nghìn bài nộp cùng lúc không?
Thời gian xử lý trung bình của hệ thống là 0,18 giây cho một tệp mã nguồn 500 dòng lệnh. Khi kết hợp cùng mô hình lọc phân tầng, hệ thống có thể hoàn thành việc quét và so khớp toàn bộ 1.000 bài nộp trong vòng chưa đầy 3 phút trên máy chủ tiêu chuẩn 8 nhân.
- Làm thế nào để hệ thống không báo động giả khi các bài nộp cùng dùng chung một đoạn code mẫu của đề bài?
Hệ thống tích hợp kỹ thuật tạo mặt nạ khung mẫu (Template Masking). Giảng viên chỉ cần nạp đoạn mã nguồn khung hoặc các hàm thư viện cho trước, thuật toán sẽ tự động loại bỏ các lát cắt thuộc khung mẫu này trước khi tiến hành so khớp, giữ tỷ lệ báo động giả dưới mức 4,2%.
- Phương pháp phân rã này có áp dụng được cho ngôn ngữ Java hay Python không?
Hoàn toàn có thể. Mặc dù luận văn tập trung thực nghiệm trên ngôn ngữ C, nhưng khung lý thuyết phân rã lát cắt chương trình và đồ thị PDG mang tính tổng quát. Chỉ cần thay thế module phân tích cú pháp (Parser) tương ứng với ngữ pháp của Java hoặc Python, mô hình so khớp lát cắt vẫn hoạt động hiệu quả.
Kết luận
- Xây dựng thành công mô hình phát hiện sao chép mã nguồn C dựa trên kỹ thuật phân rã chương trình với độ chính xác đạt 94,5%.
- Đề xuất cơ chế chuẩn hóa và trích xuất đồ thị phụ thuộc chương trình (PDG), triệt tiêu hiệu quả các kỹ thuật làm rối mã nguồn phổ biến.
- Xây dựng bộ dữ liệu thực nghiệm chuẩn hóa gồm 2.500 tệp nguồn C với hơn 180.000 dòng lệnh, chứng minh tính vượt trội so với các công cụ so khớp token truyền thống.
- Tối ưu hóa hiệu năng tính toán, giảm 38,4% thời gian phân tích so với các phương pháp đẳng cấu đồ thị đầy đủ.
- Mở ra hướng nghiên cứu mới trong việc kết hợp phân tích chương trình tĩnh với các mô hình học sâu đồ thị (Graph Neural Networks).
Trong 12 tháng tới, định hướng phát triển tiếp theo sẽ tập trung vào việc tự động hóa quá trình sinh lát cắt động và mở rộng hỗ trợ toàn diện cho các hệ thống phần mềm C++ đa luồng. Quý độc giả, các nhà nghiên cứu và các cơ sở đào tạo quan tâm đến việc triển khai thử nghiệm giải pháp vui lòng liên hệ trực tiếp để cùng hợp tác phát triển và nâng cao chất lượng liêm chính học thuật.