it-swarm-vi.com

Có các công cụ để xác định độ tương tự mã?

Tôi không nói về một công cụ khác. Tôi thực sự muốn xem liệu một dự án có chứa mã có thể đã được "tái cấu trúc" từ một dự án khác hay không. Có thể là tên hàm, tên biến và không có gì sẽ được thay đổi. Điều kiện có thể được đảo ngược, vv.

37
siljoy

Khi tôi đang dạy kỹ thuật phần mềm, tôi đã sử dụng dịch vụ (miễn phí) tại Stanford gọi là MOSS (Biện pháp tương tự phần mềm). Điều này cho phép tôi phát hiện đạo văn giữa các dự án của sinh viên rất dễ dàng. Hệ thống cũng cho phép tôi nhập các ví dụ mã "đã biết" mà tôi đã sử dụng trong lớp bị bỏ qua.

Điều tuyệt vời (hoàn toàn là vấn đề phụ) về kết quả đã trở lại là chúng ta có thể biết được sinh viên nào đã làm việc cùng nhau --- ngay cả khi họ không sao chép mã một cách trắng trợn, họ đã thảo luận các vấn đề đủ để mã của họ giống nhau. Điều đáng buồn là việc tìm kiếm một sinh viên kỳ lạ KHÔNG CÓ ĐƠN GIẢN với bất kỳ mã nào khác. Họ thường không làm tốt như vậy.

10
Peter K.

Bạn có thể sử dụng công cụ PMD để tìm thứ bạn đang tìm kiếm. Nó có nghĩa là để phát hiện cắt và dán trong cơ sở mã nhưng nếu bạn bao gồm nguồn dự án Origin bị nghi ngờ, nó có thể giúp bạn xem mã được sao chép từ đâu.

8
busyspin

Điều gần nhất mà tôi biết về những gì bạn đang tìm kiếm là Clone Detective. Đó là một plugin Visual Studio.

Clone Detective là một tích hợp Visual Studio cho phép bạn phân tích các dự án C # cho mã nguồn được sao chép ở một nơi khác. Có các bản sao có thể dễ dàng dẫn đến sự không nhất quán và thường là một chỉ báo cho mã kém.

5
epotter

Có vẻ như bạn muốn tính toán sự khác biệt giữa hai cây cú pháp trừu tượng (AST), vì vậy bạn có thể quan tâm đến công cụ Bộ phân biệt thông minh .

Tìm thấy trên https://stackoverflow.com/questions/974855/Eclipse-abab-syntax-tree-diff .

4
Matthew Rodatus

Ngay cả khi bạn không nói về một công cụ tìm khác biệt, bạn vẫn có thể sử dụng một công cụ cho việc này, ở một mức độ nhất định. Ví dụ, nếu tôi thấy hai phần mã trông giống nhau, tôi thường xuyên dán cả hai vào BeyondCompare để xem nó sẽ tốn bao nhiêu công sức để đơn giản hóa bằng cách tái cấu trúc chức năng chung.

Mặt khác, nếu bạn không biết mã tương tự ở đâu, nhưng bạn chỉ tự hỏi liệu có tồn tại ở đâu đó không ... bạn đang tìm kiếm cái gì? Một công cụ tự động để phát hiện đạo văn? Tôi không chắc có thứ gì như vậy tồn tại.

1
Mason Wheeler

Điều này bài viết trên wikipedia về chủ đề này cũng bao gồm các liên kết đến một số công cụ có thể được sử dụng để tìm mã tương tự hoặc trùng lặp. Chúng tôi có một công cụ nội bộ cho việc này, vì vậy tôi không quen với các công cụ bên ngoài được đề cập trong bài viết.

1
Alan

Tôi thực sự thích cách CC DownloaderX hình dung sự tương tự, vì vậy bạn cũng có thể muốn kiểm tra cái đó. Hỗ trợ khá nhiều ngôn ngữ, nó miễn phí và khá dễ cài đặt (Python 2.6).

1
MaR

Những gì bạn thực sự muốn làm là xem liệu có mã được sao chép (sao chép) trên hai dự án (cả hai dự án bao gồm các tập tin lớn có thể). Bạn có thể làm điều này bằng cách chạy một công cụ phát hiện bản sao. Wikipedia liệt kê một loạt chúng.

Để quyết định tổng thể nếu có nhiều bản sao, bạn chỉ cần khớp các dòng nguồn và có nhiều loại máy dò bản sao dòng chính xác ngoài kia. Tôi tin rằng PMD là một trong số đó. Những gì họ sẽ không làm là tìm mã được sao chép-dán-chỉnh sửa; họ sẽ tìm thấy mã bản sao chép-dán-không thay đổi có khả năng bao quanh các nội dung được chỉnh sửa trong quá khứ.

Nếu bạn muốn xem chi tiết sao chép mã sao chép trong quá khứ, bạn cần một trình phát hiện bản sao tìm thấy bản sao "tham số hóa". Các trình phát hiện dựa trên mã thông báo thực hiện việc này cho các chỉnh sửa thay thế chỉ các tên hoặc hằng số biến.

Các trình phát hiện dựa trên cây cú pháp trừu tượng (AST) thực hiện điều này cho các chỉnh sửa liên quan đến các khối lớn hơn, chẳng hạn như biểu thức, câu lệnh, phần chèn thêm, phần xóa, et. Những cái sau này có xu hướng đưa ra câu trả lời tốt hơn, vì không giống như các trình phát hiện mã thông báo, chúng có thể sử dụng cấu trúc ngôn ngữ của mã nguồn máy tính làm hướng dẫn.

Công cụ CloneDR của chúng tôi là một máy dò như vậy.

Tôi không biết các công cụ thực sự sẽ tìm thấy mã "tương đương" (điều kiện đảo ngược), v.v.

1
Ira Baxter