Phân tích mã nguồn tĩnh nhằm phát hiện sao chép mã nguồn Phân tích mã nguồn tĩnh nhằm phát hiện sao chép mã nguồn Phân tích mã nguồn tĩnh nhằm phát hiện sao chép mã nguồn luận văn tốt nghiệp,luận văn thạc sĩ, luận văn cao học, luận văn đại học, luận án tiến sĩ, đồ án tốt nghiệp luận văn tốt nghiệp,luận văn thạc sĩ, luận văn cao học, luận văn đại học, luận án tiến sĩ, đồ án tốt nghiệp
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI NGUYỄN KHẮC CHINH PHÂN TÍCH MÃ NGUỒN TĨNH NHẰM PHÁT HIỆN SAO CHÉP MÃ NGUỒN Chuyên ngành : CÔNG NGHỆ THÔNG TIN LUẬN VĂN THẠC SĨ KỸ THUẬT CÔNG NGHỆ THÔNG TIN NGƯỜI HƯỚNG DẪN: TS NGUYỄN THỊ THU TRANG Hà Nội – Năm 2019 CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc BẢN XÁC NHẬN CHỈNH SỬA LUẬN VĂN THẠC SĨ Họ tên tác giả luận văn: Nguyễn Khắc Chinh Đề tài luận văn: Phân tích mã nguồn tĩnh nhằm phát chép mã nguồn Chuyên ngành: Công nghệ thông tin Mã số SV: CA170238 Tác giả, Người hướng dẫn khoa học Hội đồng chấm luận văn xác nhận tác giả sửa chữa, bổ sung luận văn theo biên họp Hội đồng ngày 26/10/2019 với nội dung sau: Thêm đánh số trích dẫn (nếu có) nội dung, hình vẽ luận văn tương ứng với 13 tài liệu thảm khảo Bổ sung phần kết chương 1, Bổ sung làm rõ đóng góp cơng việc thực phần kết luận cuối chương Giải thích rõ khái niệm “chất lượng kích thước cây” trang 34 Làm rõ ý nghĩa Pr công thức trang trang 35 Rà sốt sửa lỗi tả luận văn Ngày 15 tháng 11 năm 2019 Giáo viên hướng dẫn Tác giả luận văn TS Nguyễn Thị Thu Trang Nguyễn Khắc Chinh CHỦ TỊCH HỘI ĐỒNG TS Vũ Thị Hương Giang LỜI CAM ĐOAN Tôi – Nguyễn Khắc Chinh – xin cam đoan Luận văn tốt nghiệp (LVTN) Thạc sĩ cơng trình nghiên cứu thân hướng dẫn TS Nguyễn Thị Thu Trang Các kết nêu Luận văn tốt nghiệp trung thực, chép tồn văn cơng trình khác Hà Nội, ngày 09 tháng 09 năm 2019 Tác giả LVThS Nguyễn Khắc Chinh LỜI CẢM ƠN Đầu tiên, xin gửi lời cảm ơn sâu sắc tới Cô giáo – TS Nguyễn Thị Thu Trang, Viện Công nghệ thông tin Truyền thông, Trường Đại học Bách Khoa Hà Nội hướng dẫn cho tơi lời khun q trình thực luận văn Tôi xin chân thành cảm ơn thầy cô Viện Công nghệ thông tin truyền thông, Viện đào tạo sau đại học, Trường Đại học Bách Khoa Hà Nội tạo điều kiện cho suốt trình học tập nghiên cứu trường Cuối cùng, tơi xin bày tỏ lịng cảm ơn tới người thân gia đình, bạn bè động viên giúp đỡ để tơi hồn thành luận văn Hà Nội, ngày 09 tháng 09 năm 2019 Tác giả LVThS Nguyễn Khắc Chinh MỤC LỤC LỜI CAM ĐOAN LỜI CẢM ƠN MỤC LỤC .4 DANH MỤC BẢNG BIỂU .6 DANH MỤC HÌNH ẢNH .7 DANH MỤC CÁC TỪ VIẾT TẮT MỞ ĐẦU Đặt vấn đề .9 Đề xuất 10 Bố cục luận văn 11 CHƯƠNG 1: BÀI TOÁN PHÁT HIỆN SAO CHÉP MÃ NGUỒN 12 1.1 Phát chép mã nguồn .12 1.1.1 Lợi ích việc thực phát chép mã nguồn .13 1.1.2 Hạn chế gây chép mã nguồn 14 1.1.3 Các kiểu chép 14 1.2 Phân tích mã nguồn 15 1.2.1 Phân tích mã nguồn động .16 1.2.2 Phân tích mã nguồn tĩnh .18 1.3 Phân tích mã nguồn tĩnh nhằm phát chép 19 CHƯƠNG 2: PHÁT HIỆN SAO CHÉP DỰA TRÊN CÂY PHÂN TÍCH 22 2.1 Tổng quan thuật toán .22 2.1.1 Cây phân tích 27 2.1.2 Sinh vector đặc trưng .29 2.1.3 Phân cụm vector 35 2.1.4 Phát chép 37 2.2 Đề xuất xây dựng sinh phân tích tổng quát 41 2.3 Phát triển phân tích văn phạm cho ngơn ngữ PHP 47 2.3.1 Khái quát ngôn ngữ PHP 47 2.3.2 Xây dựng phân tích văn phạm 48 CHƯƠNG 3: THỬ NGHIỆM VÀ ĐÁNH GIÁ 54 3.1 Công nghệ môi trường sử dụng .54 3.1.1 Ngơn ngữ lập trình 54 3.1.2 Môi trường sử dụng 55 3.2 Thực nghiệm 56 3.2.1 Đối tượng 56 3.2.2 Thiết lập thông số thực nghiệm 57 3.2.3 Thực nghiệm với ngôn ngữ C .58 3.2.4 Thực nghiệm với ngôn ngữ Java 60 3.2.5 Thực nghiệm với ngôn ngữ Php 61 3.2.6 Thực nghiệm với dự án viết mã nguồn Php .62 3.3 Đánh giá kết 64 3.3.1 Số lượng 64 3.3.2 Chất lượng 65 3.3.3 Khả mở rộng 65 KẾT LUẬN 67 TÀI LIỆU THAM KHẢO .69 DANH MỤC BẢNG BIỂU Bảng Các toán tử Lex 46 Bảng Cấu hình máy ảo .55 Bảng Thơng tin cấu hình chạy thuật tốn 58 Bảng Báo cáo kết phân tích mã nguồn C 60 Bảng Báo cáo kết phân tích mã nguồn Java 61 Bảng Báo cáo kết phân tích mã nguồn Php 62 Bảng Báo cáo kết phân tích mã nguồn dự án viết Php 63 Bảng Số lượng chép phát 64 DANH MỤC HÌNH ẢNH Hình Kiến trúc tổng quan bước xử lý thuật toán DECKARD .23 Hình Cây phân tích .24 Hình Băm liệu vào .37 Hình Cấu trúc module PTGEN 42 Hình Cấu trúc module PTGEN cho ngôn ngữ C 43 Hình Cấu trúc module PTGEN cho ngôn ngữ Java 43 Hình Mơ hình sinh phân tích 44 Hình Sơ đồ luồng hoạt động sinh phân tích ngơn ngữ PHP 49 Hình Cấu trúc module PTGEN cho ngơn ngữ PHP 49 Hình 10 Báo cáo chép thử nghiệm 58 Hình 11 Mã nguồn trùng lặp file AbstractTableRendering.java 60 Hình 12 Mã nguồn trùng lặp file AbstractAsyncTableRendering.java .61 DANH MỤC CÁC TỪ VIẾT TẮT Viết tắt Mô tả UT Unit test IT Integration test ST System test AT Acceptance test LSH Locality Sensitive Hashing AST Abstract syntax tree Yacc Yet Another Compiler-Compiler Lex Lexical Analyser VM Vitual Machine MỞ ĐẦU Đặt vấn đề Cùng với phát triển không ngừng nghành công nghệ thông tin, hệ thống phần mềm cho máy tính, ứng dụng cho điện thoại, phần mềm cho hệ thống sản xuất nhà máy ln địi hỏi chất lượng ngày cao Lập trình phần mềm trở thành nghành công nghiệp phát triển không ngừng với xuất công ty chuyên sản xuất phầm mềm Hiện có nhiều công ty chuyên phát triển phần mềm với quy mơ khác FPT software tập đồn FPT, CMS software tập đồn CMC, cơng ty giải pháp phần mềm Hanelsoft, công ty cổ phần phần mềm hà nội – Hà nội Software,… Các công ty không đáp ứng nhu cầu phần mềm nước mà vươn tầm quốc tế đáp ứng nhu cầu phần mềm nước Nhật bản, Malaysia, Australia, Mỹ, Đức,… Do đặc thù chuyên phát triển phần mềm có nhiều dự án nên nhu cầu tuyển dụng lập trình viên cao Để đáp ứng mở rộng không ngừng, lập trình viên liên tục tuyển dụng bị đào thải không đáp ứng yêu cầu Một vấn đề thường gặp lập trình viên chưa có kỹ lập trình tốt nên mã nguồn họ viết thường có chất lượng khơng cao Do ngồi nhân lực phát triển phần mềm, lại cần phải có nhân lực để kiểm tra chất lượng mã nguồn lập trình viên chưa có kinh nghiệm tạo Thực tế cho thấy, lỗi mã nguồn phát giai đoạn sớm chi phí để sửa lỗi giảm Các mơ hình phát triển phần mềm ISO, CMMI, … phần giúp cải thiện chất lượng Tuy nhiên cần phải có cơng cụ, kỹ thuật để tự động kiểm soát chất lượng mã nguồn giúp tiết kiệm chi phí mặt thời gian nguồn nhân lực Một lỗi phổ biến lập trình viên chép mã nguồn Sao chép hiểu chép mã nguồn người khác chép mã nguồn Khi lập trình viên làm việc hệ thống lớn, việc viết mã nguồn cho nhiều thành phần chức khác đơi xảy tình trạng chức sử dụng nhiều nơi khác Thay dùng chung đoạn mã nguồn chức đó, lập trình viên có chưa có kinh nghiệm viết lại chép đoạn mã nguồn cũ sang chức Điều chép mã nguồn gây khó khăn cho q trình bảo trì đoạn mã nguồn Trong giới với nhiều mã nguồn mở nay, việc chép mã nguồn người khác 3.1.2 Môi trường sử dụng Mơi trường triển khai thuật tốn Linux Việc thực chạy thuật tốn giao diện dịng lệnh Hệ điều hành cần cài đặt trình biên dịch GCC hỗ trợ môi trường chạy Python 2.5 trở lên Để cài đặt GCC chạy lệnh: Để cài đặt python chạy lệnh: Để tiến hành thử nghiệm chương trình, tơi tiến hành cài đặt triển khai thuật toán hệ điều hành Ubuntu Một máy ảo sử dụng để chạy Unbuntu mơi trường Windows Cấu hình máy ảo sử dụng sau: Thông tin Giá trị Dung lượng ổ cứng 30 GB CPU Core @ 2.3 GHz 2.4 GHz Bộ nhớ RAM GB OS Ubuntu-18.04.3-desktop-amd64 Bảng Cấu hình máy ảo Trong trình phát triển để thuận tiện cho việc trao đổi tệp liệu, cài đặt ứng dụng WinSCP giúp kết nối trực tiếp từ Windows vào máy ảo qua kết nối SSH Do đó, hệ điều hành Ubuntu máy ảo cần thêm ssh open server để ứng dụng WinSCP kết nối qua ssh 55 Kiểm tra trạng thái với lệnh: Thực cài đặt thuật toán Deckard theo bước sau: Di chuyển đến thư mục Deckard\src\main: Chạy lệnh /build.sh để cài đặt khởi tạo thuật tốn Sau cài đặt thành cơng, để gỡ bỏ trường trình chạy lệnh /clean.sh 3.2 Thực nghiệm 3.2.1 Đối tượng Việc thực nghiệm chia thành giai đoạn khác để đáp ứng mục đích tơi Kiểm tra thuật tốn loại mã nguồn ngơn ngữ lập trình C, Java, Php Ngồi việc kiểm tra tính xác số lượng chất lượng, ta thực kiểm tra khả mở rộng thuật tốn Tơi tiến hành thử nghiệm thuật toán cài đặt để kiểm tra Việc thử nghiệm chia thành giai đoạn: Tiến hành thử nghiệm thuật toán mã nguồn ngơn ngữ C, Java Mục đích để kiểm tra khả chạy đa ngơn ngữ thuật tốn Tơi tiến hành chạy thử thuật toán với 10 tệp mã nguồn C 10 tệp mã nguồn Java Tôi không thực kiểm tra với số lượng mã nguồn lớn mà dành việc để thực với mã nguồn PHP Tiến hành thử nghiệm với tệp mã nguồn PHP để kiểm ta module sinh phân tích xây dựng Đánh giá chất lượng module Thử nghiệm với dự án mã nguồn PHP, số tệp dự án 1480 tệp Đánh giá số lượng tệp mà thuật tốn phân tích Đánh giá chất lượng báo cáo chép, trùng lặp mã nguồn Ngoài ra, thay đổi thông số 56 số luồng thực đồng thời để đánh giá hiệu suất sử dụng thuật toán Qua bước trên, tiến hành đánh giá khả tăng hiệu (hay khả mở rộng), độ xác thuật tốn Thống số cấu hình file điều chỉnh q trình thử nghiệm 3.2.2 Thiết lập thơng số thực nghiệm Trong tệp thử nghiệm, chủ động chọn ba tệp tạo ba chép để kiểm tra tính đắn kết chạy thuật tốn Thơng số cấu hình file config sau: Tên tham số Giá trị cấu hình FILE_PATTERN '*.c' Giải thích tham số Phần mở rộng file thực phân tích Lưu ý với ngơn ngữ C dùng file *.c *.h, ngơn ngữ Java *.java, ngôn ngữ Php *.php SRC_DIR Thư mục đặt mã nguồn cần kiểm tra src DECKARD_DIR /home/chinhnk/Deskto Vị trí mã nguồn thuật tốn p/deckard MIN_TOKENS Số nút tối thiểu Ở đây, ta '50 100' để hai giá trị 50 100 thực lần Chương trình chạy với giá trị STRIDE Kích thước cửa sổ trượt để giá trị '2 4' Chương trình chạy với giá trị SIMILARITY Độ tương tự dùng để phân cụm '1.0 0.95' có giá trị nhỏ lớn Ta để dãy giá trị Khi thuật tốn chạy thử với giá trị VECTOR_DIR Thư mục xuất file danh sách vector 'vectors' 57 CLUSTER_DIR Thư mục xuất file phân cụm 'clusters' chép TIME_DIR 'times' Thư mục ghi thông tin gỡ lỗi GROUPING_S '30' Kích thước tối đa nhóm vector MAX_PROCS Số tiến trình tối đa thực Bảng Thơng tin cấu hình chạy thuật tốn 3.2.3 Thực nghiệm với ngôn ngữ C Bước 1: Tạo thư mục demo Trong thư mục demo, tạo thư mục demo\src, demo\vectors, demo\clusters, demo\times Đưa 10 tệp cần kiểm tra vào thư mục demo\src Chưa tạo lỗi chép tệp mã nguồn C Bước 2: Chạy thử nghiệm lệnh: Bước 3: Kiểm tra kết cho thấy, chép phát phân cụm thư mục clusters Ba chép mà chủ động tạo phát xác Kích thước đoạn chép đa dạng Dưới ví dụ đoạn chép kích thước nhỏ phát tương ứng với báo cáo phân cụm: Hình 10 Báo cáo chép thử nghiệm Xem xét thử dòng báo cáo cụ thể, báo cáo cho thấy file token-treemap.c vector ứng với đoạn mã dòng 620, node 79, độ dài chuỗi lặp 110 node, trùng lặp với vector ứng với đoạn mã dòng 1096, node 84 Đối chiếu với mã nguồn file token-tree-map.c đây: 58 Bảng kết cho báo cáo đoạn mã chép đây: Thông số Kết MIN_TOKENS = 50; STRIDE = 2; SIMILARITY = 0.95; 1233 dòng báo cáo MIN_TOKENS = 50; STRIDE = 2; SIMILARITY = 1; 485 dòng báo cáo MIN_TOKENS =50; STRIDE = 4; SIMILARITY = 0.95; 723 dòng báo cáo MIN_TOKENS =50; STRIDE = 4; SIMILARITY = 1; 293 dòng báo cáo 59 MIN_TOKENS = 100; STRIDE = 2; SIMILARITY = 0.95; 1078 dòng báo cáo MIN_TOKENS = 100; STRIDE = 2; SIMILARITY = 1; 339 dòng báo cáo MIN_TOKENS = 100; STRIDE = 4; SIMILARITY = 0.95; 613 dòng báo cáo MIN_TOKENS = 100; STRIDE = 4; SIMILARITY = 1; 200 dòng báo cáo Bảng Báo cáo kết phân tích mã nguồn C 3.2.4 Thực nghiệm với ngơn ngữ Java Thự tương tự với ngôn ngữ C, ta thực với ngôn ngữ java Bước ta sử dụng 10 file mã nguồn Java để phân tích, cấu hình lại thơng số FILE_PATTERN = ‘*.java’ Bước 2: Chạy thử nghiệm lệnh: Bước 3: Kiểm tra kết cho thấy, chép phát phân cụm thư mục clusters Xem xét thử dòng báo cáo cụ thể, báo cáo cho thấy file AbstractAsyncTableRendering.java vector ứng với đoạn mã dòng 841, node 53, độ dài chuỗi lặp 618 node, trùng lặp với vector ứng với đoạn mã dòng 896, node 53 file AbstractTableRendering.java Đối chiếu với mã nguồn hai file đây: Hình 11 Mã nguồn trùng lặp file AbstractTableRendering.java 60 Hình 12 Mã nguồn trùng lặp file AbstractAsyncTableRendering.java Bảng kết cho lần chạy thử với java đây: Thông số Kết MIN_TOKENS = 50; STRIDE = 2; SIMILARITY = 0.95; 2275 dòng báo cáo MIN_TOKENS = 50; STRIDE = 2; SIMILARITY = 1; 821 dòng báo cáo MIN_TOKENS =50; STRIDE = 4; SIMILARITY = 0.95; 1243 dòng báo cáo MIN_TOKENS =50; STRIDE = 4; SIMILARITY = 1; 582 dòng báo cáo MIN_TOKENS = 100; STRIDE = 2; SIMILARITY = 0.95; 1887 dòng báo cáo MIN_TOKENS = 100; STRIDE = 2; SIMILARITY = 1; 362 dòng báo cáo MIN_TOKENS = 100; STRIDE = 4; SIMILARITY = 0.95; 939 dòng báo cáo MIN_TOKENS = 100; STRIDE = 4; SIMILARITY = 1; 209 dòng báo cáo Bảng Báo cáo kết phân tích mã nguồn Java 3.2.5 Thực nghiệm với ngôn ngữ Php Bước 1: Cấu hình tham số FILE_PATTERN = ‘*.php’ Sử dụng tệp mã nguồn mẫu để kiểm tra Để kiểm tra tính đắn module sinh phân tích php, ta dùng tệp khơng có chép Tiến hành chạy thử thấy kết phát chép khơng có Như vậy, module phân tích đảm bảo tính đắn Bước 2: Sử dụng tệp mã nguồn có chứa chép Tiến hành kiểm tra tệp mã nguồn thuật toán 61 Bước 3: Kiểm tra kết ta có đây: Thơng số Kết MIN_TOKENS = 50; STRIDE = 2; SIMILARITY = 0.95; 27 dịng báo cáo, nhóm phân cụm MIN_TOKENS = 50; STRIDE = 2; SIMILARITY = 1; 17 dòng báo cáo, nhóm phân cụm MIN_TOKENS =50; STRIDE = 4; SIMILARITY = 0.95; 14 dòng báo cáo, nhóm phân cụm MIN_TOKENS =50; STRIDE = 4; SIMILARITY = 1; dịng báo cáo, nhóm phân cụm MIN_TOKENS = 100; STRIDE = 2; SIMILARITY = 0.95; 17 dịng báo cáo, nhóm phân cụm MIN_TOKENS = 100; STRIDE = 2; SIMILARITY = 1; dòng báo cáo, nhóm phân cụm dịng báo cáo, nhóm phân cụm MIN_TOKENS = 100; STRIDE = 4; SIMILARITY = 0.95; Không phát chép MIN_TOKENS = 100; STRIDE = 4; SIMILARITY = 1; Bảng Báo cáo kết phân tích mã nguồn Php 3.2.6 Thực nghiệm với dự án viết mã nguồn Php Mục đích việc thử nghiệm với dự án để phát đoạn mã trùng lặp tiến hành loại bớt, chuyển thành hàm dùng chung Việc giúp giảm chi phí phát sinh dự án cần thực nâng cấp, bảo trì giai đoạn Bước 1: Cấu hình tham số FILE_PATTERN = ‘*.php’ Thực chạy thử nghiệm với mã nguồn dự án viết ngôn ngữ Php Ước lượng số tệp mã nguồn cần kiểm tra 1480 tệp Do số lượng mã nguồn lớn nên điều chỉnh lại thông số file cấu hình để kết báo cáo dễ theo dõi Với tham số MIN_TOKENS, để 50 đoạn mã nhỏ so sánh, ta tăng kích thước tối thiểu lên 100, 150, 200 Ta tăng tham số STRIDE để tăng bước dịch cửa sổ sáp nhập vector, giảm chồng chéo cửa sổ Độ tương tự SIMILARITY thiết lập giá trị Cụ thể thông số điều chỉnh MIN_TOKENS '100 150 200' Tăng số lượng nút tối thiểu STRIDE '4 16' Tăng kích thước cửa sổ trượt SIMILARITY '1.0' Độ tương tự lấy giá trị xác Bước 2: Tiến hành chạy thuật toán kiểm tra chép mã nguồn dự án Bước 3: Kiểm tra kết ta có đây: 62 Thơng số Kết MIN_TOKENS = 100; STRIDE = 4; SIMILARITY = 1; 38329 dòng báo cáo MIN_TOKENS = 100; STRIDE = 8; SIMILARITY = 1; 24917 dòng báo cáo MIN_TOKENS = 100; STRIDE = 16; SIMILARITY = 1; 17868 dòng báo cáo MIN_TOKENS = 150; STRIDE = 4; SIMILARITY = 1; 34534 dòng báo cáo MIN_TOKENS = 150; STRIDE = 8; SIMILARITY = 1; 21369 dòng báo cáo MIN_TOKENS = 150; STRIDE = 16; SIMILARITY = 1; 14636 dòng báo cáo MIN_TOKENS = 200; STRIDE = 4; SIMILARITY = 1; 31913 dòng báo cáo MIN_TOKENS = 200; STRIDE = 8; SIMILARITY = 1; 19034 dòng báo cáo MIN_TOKENS = 200; STRIDE = 16; SIMILARITY = 1; 12630 dòng báo cáo Bảng Báo cáo kết phân tích mã nguồn dự án viết Php Kiểm tra kết đối chiếu mã nguồn, ta thấy nguyên nhân lặp nhiều mã nguồn dự án có ba module riêng biệt sử dụng chung thư viện, nhiên ba module lại copy thành ba thư viện lưu ba nơi khác nhau, dẫn đến số lượng mã nguồn chép tăng lên đáng kể Ngoài ra, số nguyên nhân gây lặp mã nguồn khác phát Cấu trúc mã nguồn dự án theo mơ hình MVC, file Controller, số hàm tạo đối tượng có cấu trúc mã nguồn giống nên bị xem mã nguồn chép Để xử lý vấn đề này, lập trình viên cần tạo hàm dùng chung phục vụ cho mục đích khởi tạo đối tượng Tham số đầu vào tên đối tượng cần khởi tạo thuộc tính cần khởi taọ Trong file View nhiều hàm khởi form bị lặp cấu trúc form tương đối giống nên đoạn mã bị xem lặp Tương tự vấn đề khởi tạo đối tượng cần phải tạo hàm dùng chung khởi tạo form để xử lý vấn đề Trong file model, hàm thực truy vấn bảng gặp vấn đề tương tự Nghiệp vụ việc truy vấn vào bảng giống nên đoạn mã nguồn tương đồng, chương trình coi đoạn truy vấn chép Ta thử thực loại bỏ thư viện dùng chung bị lặp khỏi mã nguồn dự án chạy lại thuật toán Kết phát chép giảm đáng kể bảng Thông số Kết MIN_TOKENS = 100; STRIDE = 4; SIMILARITY = 1; 1440 dòng báo cáo MIN_TOKENS = 100; STRIDE = 8; SIMILARITY = 1; 841 dòng báo cáo MIN_TOKENS = 100; STRIDE = 16; SIMILARITY = 1; 530 dòng báo cáo 63 MIN_TOKENS = 150; STRIDE = 4; SIMILARITY = 1; 896 dòng báo cáo MIN_TOKENS = 150; STRIDE = 8; SIMILARITY = 1; 471 dòng báo cáo MIN_TOKENS = 150; STRIDE = 16; SIMILARITY = 1; 282 dòng báo cáo MIN_TOKENS = 200; STRIDE = 4; SIMILARITY = 1; 600 dòng báo cáo MIN_TOKENS = 200; STRIDE = 8; SIMILARITY = 1; 337 dòng báo cáo MIN_TOKENS = 200; STRIDE = 16; SIMILARITY = 1; 197 dòng báo cáo 3.3 Đánh giá kết 3.3.1 Số lượng Ngôn ngữ C Java Php Số lượng đoạn code lặp Số lượng phát lặp 3 3 2 Bảng Số lượng chép phát Khi chủ động tạo dòng code chép để kiểm tra tính đắn cơng cụ, tơi nhận thấy cơng cụ tìm xác dịng code lặp tạo Đánh giá số lượng việc phân tích đo số dịng báo cáo chép mà thuật toán sinh Với ba thử nghiệm với ngôn ngữ C, Java, Php, ta tiến hành đánh giá số lượng chép đối chiếu với thực tế mã nguồn Các báo cáo chép xác đoạn mã nguồn bị chép Như số lượng đoạn mã chép tìm xác Nhìn vào kết báo cáo thấy độ tương tự số lượng dịng báo cáo so với thiết lập độ tương tự 0.95 Như việc điều chỉnh độ tương tự thích hợp, ta phát thêm đoạn mã gần giống Ở trường hợp mã nguồn bị chép sửa chữa đôi chút đơn giản hai đoạn mã nguồn ngẫu nhiên có phần giống Ngồi thấy số lượng dịng báo cáo tỷ lệ nghịch với độ lớn bước dịch cửa sổ số nút tối thiểu Điều ta dịch sổ với bước chuyển nhỏ, đoạn mã bị lặp liên tiếp tạo thêm dòng báo cáo chép Có thể nói báo cáo bị trùng Thực thực với dự án thật, ta nên chọn bước dịch cửa sổ tương đối lớn để giảm bớt báo cáo thừa 64 Đánh giá chung với ba ngôn ngữ mà thuật toán chạy đảm bảo tốt số lượng chép phát Ba chép mà chủ động tạo tệp phát xác 3.3.2 Chất lượng Việc đưa dòng báo cáo giả chép vấn đề quan trọng cần xem xét Chất lượng thuật toán đánh giá dựa tiêu chí: Số lượng báo cáo giả chép Số lượng chép không bị phát Số lượng chép phát giống hệt Số lượng chép bị thay đổi sửa chữa chút bị phát Với tiêu chí 1, số lượng báo cáo mã nguồn lớn khó để sốt kiểm tra hết Tuy nhiên, trình thử nghiệm, thực với tệp Php để kiểm sốt kết báo cáo Q trình thử nghiệm nhiều lần cho thấy, thuật toán đưa báo cáo xác Tất báo cáo chép đoạn mã giống hệt giống mặt cấu trúc Do kết luận báo cáo giả chép xảy Tuy nhiên, vấn đề coi giả chép xảy Khi đặt bước dịch sổ nhỏ, ta có nhiều báo cáo trùng lặp Tương tự với tiêu chí cịn lại, tơi thực chủ động tạo tệp mã nguồn để sinh kịch kiểm tra Thuật toán Deckard tỏ hiệu vượt qua kiểm tra Khơng có chép tơi chủ động tạo mà thuật tốn khơng phát Khơng tìm thấy dịng báo cáo chép giống hệt Đặc biệt, với chép tơi thực thay đổi tên biến hồn tồn thuật toán hai đoạn mã nguồn trùng lặp Một nhược điểm thuật toán cần phải cấu hình thơng số đầu vào hợp lý Nếu thơng số MIN_TOKENS, STRIDE cấu hình nhỏ, dẫn đến báo cáo bị trùng lặp phần số lượng báo cáo lớn khó rà sốt tính đắn báo cáo 3.3.3 Khả mở rộng Khả mở rộng thuật toán thể tham số MAX_PROCS cho phép cấu hình số tiến trình đồng thời thực phân tích mã nguồn phát chép Trường hợp số lượng mã nguồn cần phân tích lớn, ta tăng số tiến trình đồng thời 65 thực phân tích Ban đầu, tăng số lượng tiến trình lên, thuật tốn tỏ hiệu thời gian phân tích mã nguồn giảm xuống theo tỷ lệ thuận Tuy nhiên, tăng tới số tiến trình tới ngưỡng định, cấu hình phần cứng máy tính khơng đáp ứng được, hiệu mặt thời gian xử lý khơng cịn tăng lên Có thể kết luận thuật toán cung cấp khả mở rộng tương đối tốt, nhiên song song với việc tăng số tiến trình xử lý, phần cứng cần nâng cấp đồng thời để đảm bảo cung cấp môi trường xử lý đáp ứng yêu cầu Để tăng khả mở rộng trình sử dụng, cân nhắc điều chỉnh thơng số độ tương tự, số nút tối thiểu cây, bước dịch chuyển cửa sổ cho phù hợp với u cầu Khi đó, việc phân tích xử lý mã nguồn tối ưu, hiệu suất xử lý tăng lên đáng kể Khả mở rộng thuật tốn có ích ta triển khai dịch vụ dạng dùng chung cho nhiều dự án Có thể triển khai dịch vụ máy chủ, yêu cầu phân tích mã nguồn gửi dạng luồng http request Dịch vụ xử lý trả lại người dùng kết báo cáo dạng luồng http response 66 KẾT LUẬN Qua việc thực luận văn, muốn giải tốn phân tích mã nguồn tĩnh nhằm phát chép dự án thực tế cơng việc Từ đó, cải thiện chất lượng mã nguồn từ giai đoạn phát triển dự án Việc khơng có ý nghĩa cho việc phát triển kỹ cho lập trình viên mà đem lại nguồn lợi cho dự án phần mềm, giúp tiết kiệm thời gian, chi phí phát sinh giai đoạn bảo trì, nâng cấp dự án Thơng qua q trình thử nghiệm vào án thực tế, tơi nhận thấy thuật tốn thực hiệu giúp phát đoạn mã nguồn lặp Một thư viện dùng chung không cách phát loại bỏ Những chức giống điều chỉnh để dùng chung mã nguồn Tuy nhiên, để sử dụng thuật tốn cách hiệu cần có q trình điều chỉnh thơng số cách hợp lý phát huy tối đa chất lượng báo cáo chép đưa Các công việc tơi thực q trình làm luận văn là: Tìm hiểu cài đặt thuật tốn cho ngôn ngữ C Java Nâng cấp module xử lý tạo phân tích để áp mẫu văn phạm cho hướng phát triển tiếp với ngôn ngữ khác Mở rộng phát triển thuật tốn thêm cho ngơn ngữ PHP Ứng dụng vào dự án phần mềm thực tế, đánh giá chất lượng báo cáo chép phần mềm sinh Từ định hướng phát triển áp dụng thuật tốn vào thực tế cơng việc Tơi xây dựng phân tích cú pháp cho ngơn ngữ Php với mẫu tự vựng phân tích từ vựng mẫu cú pháp phân tích cú pháp lấy nguồn từ Zend Engine chạy tốt hầu hết mã nguồn thử nghiệm Tuy nhiên, có vài tệp mã nguồn mà module phân tích khơng xử lý Điều phân tích cú pháp phân tích từ vựng có thiếu sót q trình xây dựng Tơi cần nghiên cứu kỹ hai phân tích để cải thiện tránh lỗi tương tự ứng dụng vào dự án khác Hướng phát triển tơi cải thiện module phân tích cú pháp cho ngôn ngữ Php Do dự án phát triển sử dụng Php5 nên tơi thử nghiệm với phân tích từ vựng Php5 Tiếp theo, với dự án sử dụng Php7, cần phải xây dựng lại phân tích từ vựng tương ứng Ngồi ra, với phân tích từ vựng Java cần nâng cấp lên Java 11, Java 12 Java 13 67 phiên ngơn ngữ lập trình Java Trong q trình thử nghiệm, phân tích đơi khơng phân tích số file sai cú pháp Việc nâng cấp module Java cần thiết tương lai Hiện ngôn ngữ lập trình đa dạng phong phú, tơi tìm hiểu xây dựng thêm module phân tích cú pháp, cho ngơn ngữ lập trình khác python, C++, C#, Javascript … Trong phạm vi luận văn này, dừng mức can thiệp vào giai đoạn sinh phân tích Thuật tốn Deckard giai đoạn sinh vector đặc trưng, phân cụm vector lọc báo cáo Trong thời gian tới nghiên cứu giai đoạn thuật toán để cải thiện thêm cần 68 TÀI LIỆU THAM KHẢO [1] D Evans (May 1996) Static detection of dynamic memory errors, Conference on Programming Language Design and Implementation (PLDI ’96) – Philadelphia [2] Geetika Chatley, Sandeep Kaur, Bhavneesh Sohal (January 2016) - Software Clone Detection: A review, International Journal of Control Theory and Applications [3] Ira D Baxter, Andrew Yahin, Leonardo Moura, Marcelo Sant’Anna, Lorraine Bier (November 1998) - Clone Detection Using Abstract Syntax Trees, ICSM98, Bethesda, Mayland, USA [4] Ivo Gomes, Pedro Morgado, Tiago Gomes, Rodrigo Moreira (2009) – An overview on the Static Code Analysis approach in Software Development [5] Jeffrey Svajlenko, Chanchal K Roy (2014) - Evaluating Modern Clone Detection Tools, ICSME, Dept of Computer Science, University of Saskatchewan, Canada [6] Journal of Programming Languages (1995) - A survey of program slicing techniques [7] Lingxiao Jiang, Ghassan Misherghi, Zhendong Su, Stephane GLONDU (2007) DECKARD: Scalable and Accurate Tree-based Detection of Code Clones, ICSE'07, Minneapolis, Minnesota, USA, 2007 [8] Lingxiao JIANG, Zhendong SU, Edwin CHIU (2007) - Context-Based Detection of Clone-Related Bugs, ESEC/FSE'07, Dubrovnik, Croatia, 2007 [9] Mohammed Abdul Bari (April 2011) - Code Cloning: The Analysis, Detection and Removal, International Journal of Computer Applications [10] Michael D Ernst (2003) - Static and dynamic analysis: synergy and duality, MIT Lab for Computer Science, Cambridge, USA [11] Pratiksha Gautam, Hemraj Saini (August 2016) - Various Code Clone Detection Techniques and Tools: A Comprehensive Survey, Jaypee University of Information Technology, Waknaghat, India [12] Rogue Wave Software (2017) - Static code analysis ebook: Myths, continuous integration, and success stories [13] R Yang, P Kalnis, A K H Tung (2005) - Similarity evaluation on treestructured data, School of Computing National University of Singapore 69 ... 1.2 Phân tích mã nguồn 15 1.2.1 Phân tích mã nguồn động .16 1.2.2 Phân tích mã nguồn tĩnh .18 1.3 Phân tích mã nguồn tĩnh nhằm phát chép 19 CHƯƠNG 2: PHÁT HIỆN SAO. .. cụ phân tích mã nguồn đời, với nhiều kỹ thuật phân tích khác hỗ trợ nhiều cho hệ lập trình viên Phân tích mã nguồn có hai loại phân tích mã nguồn tĩnh phân tích mã nguồn động Phân tích mã nguồn. .. phát chép mã nguồn người ta thường thực phân tích mã nguồn để tìm đoạn mã bị chép lặp Việc phân tích mã nguồn chia hai loại phân tích tĩnh phân tích động Trong đó, để phát chép, lặp mã nguồn,