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


37

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


5
Đây là cho một lớp học hoặc một cái gì đó?
TheLQ

1
@TheLQ - Tôi có thể nghĩ ra nhiều trường hợp bên ngoài phòng học mà tôi đã đi săn để xem nơi "cắt và dán được tái sử dụng, phải không?" Lữ đoàn đã đi qua.
MIA

Đừng quên Atomiq của Steve Smith .
Jim G.

Nhận xét và thông báo đầu ra (như lỗi, v.v.) thường có thể mã vân tay tốt hơn mã thực tế.
Bork Blatt

Họ luôn đe dọa chúng tôi về điều này tại Uni, thật thú vị khi xem liệu một công cụ như vậy có thực sự tồn tại hay không.
Jake

Câu trả lời:


10

Khi tôi đang giảng dạy kỹ thuật phần mềm, tôi đã sử dụng dịch vụ (miễn phí) tại Stanford có tên 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 tôi có thể cho biết 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ọ tương tự 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.


Cảm ơn, tôi đã tìm kiếm thứ gì đó chính xác như thế :)
Ulrich Dangel 11/12/13

8

Bạn có thể sử dụng công cụ PMD để tìm thấy những gì 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 nguồn gốc bị nghi ngờ, nó có thể giúp bạn xem mã được sao chép từ đâu.


vâng - chúng tôi sử dụng CPD từ PMD trong mã của chúng tôi
JoseK

Nhưng PMD chỉ dành cho Java, phải không?
Janusz Lenar

5

Điều gần nhất tôi biết về những gì bạn đang tìm kiếm là Clone Detective. Nó là một trình cắm thêm 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ỉ số cho mã kém.


4

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 .


(Cảm ơn lời khen cho công cụ của tôi). SmartDifferencer tìm thấy sự khác biệt giữa một cặp tệp cụ thể; sự giống nhau là sự bổ sung của sự khác biệt vì vậy tôi đồng ý rằng đó là một ý tưởng đúng nhưng nó đòi hỏi bạn phải xác định một cặp tệp để cung cấp cho nó và điều đó thật đau đớn nếu hệ thống của bạn bao gồm nhiều tệp. Điều thực sự cần thiết là sự bổ sung đó: tìm sự tương đồng và thực hiện nó mà không cần xác định cá nhân các cặp tệp. Xem câu trả lời CloneDR của tôi trong cùng chủ đề này cho một công cụ như vậy. Vâng, nó sử dụng công nghệ liên quan.
Ira Baxter

1

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 dán cả hai vào BeyondCompare để xem nó sẽ tốn bao nhiêu công sức để đơn giản hóa nó 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.


Nếu đúng như vậy, SCO có thể đã giành chiến thắng trước IBM :-)

1

Bài viết này 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

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

Tôi thực sự thích cách CC DownloaderX trực quan hóa 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).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.