it-swarm-id.com

Apakah ada alat untuk menentukan kesamaan kode?

Saya tidak berbicara tentang alat diff. Saya benar-benar ingin melihat apakah suatu proyek berisi kode yang mungkin telah "dire-refactored" dari proyek lain. Kemungkinan nama fungsi, nama variabel, dan yang lainnya akan diubah. Kondisional mungkin dibalik, dll.

37
siljoy

Ketika saya mengajar rekayasa perangkat lunak, saya menggunakan layanan (gratis) di Stanford disebut MOSS (Ukuran Kesamaan Perangkat Lunak). Ini memungkinkan saya mendeteksi plagiarisme antara proyek-proyek siswa sangat mudah. ​​Sistem ini juga memungkinkan saya untuk memasukkan contoh kode "dikenal baik" yang saya gunakan selama kelas yang akan diabaikan.

Hal yang hebat (benar-benar masalah sampingan) tentang hasil yang muncul adalah bahwa kita dapat mengetahui siswa mana yang bekerja bersama --- bahkan jika mereka tidak secara terang-terangan menyalin kode, mereka membahas masalah cukup bahwa kode mereka mirip. Bagian yang menyedihkan adalah menemukan siswa aneh yang TIDAK MENDAPATKAN SIMULASI dengan kode lainnya. Mereka biasanya tidak melakukannya dengan baik.

10
Peter K.

Anda mungkin dapat menggunakan alat PMD untuk menemukan apa yang Anda cari. Ini dimaksudkan untuk mendeteksi potong dan rekatkan dalam basis kode tetapi jika Anda menyertakan sumber proyek Asal yang dicurigai dapat membantu Anda melihat di mana kode disalin dari itu.

8
busyspin

Hal terdekat yang saya tahu dari apa yang Anda cari adalah Clone Detective. Ini adalah plug-in Visual Studio.

Clone Detective adalah integrasi Visual Studio yang memungkinkan Anda untuk menganalisis proyek C # untuk kode sumber yang digandakan di tempat lain. Memiliki duplikat dapat dengan mudah menyebabkan inkonsistensi dan seringkali merupakan indikator untuk kode dengan faktor buruk.

5
epotter

Kedengarannya Anda ingin menghitung perbedaan antara dua pohon sintaksis abstrak (AST), jadi Anda mungkin tertarik pada alat Pembeda Cerdas .

Ditemukan di https://stackoverflow.com/questions/974855/Eclipse-abstract-syntax-tree-diff .

4
Matthew Rodatus

Bahkan jika Anda tidak berbicara tentang alat diff, Anda masih dapat menggunakannya untuk ini, setidaknya sampai batas tertentu. Jika saya melihat dua bagian kode yang terlihat mirip, misalnya, saya sering menempelkan keduanya ke BeyondCompare untuk melihat berapa banyak pekerjaan yang akan disederhanakan dengan refactoring fungsi umum keluar.

Di sisi lain, jika Anda tidak tahu di mana kode yang sama, tetapi Anda hanya bertanya-tanya apakah ada di suatu tempat ... apa yang Anda cari? Alat otomatis untuk mendeteksi plagiarisme? Saya tidak yakin ada hal seperti itu.

1
Mason Wheeler

Ini artikel di wikipedia pada subjek juga menyertakan tautan ke beberapa alat yang dapat digunakan untuk menemukan kode yang sama atau duplikat. Kami memiliki alat internal untuk ini, jadi saya tidak terbiasa dengan alat eksternal yang disebutkan dalam artikel.

1
Alan

Saya sangat suka bagaimana CCFinderX memvisualisasikan kesamaan, jadi Anda mungkin ingin memeriksanya juga. Mendukung beberapa bahasa, gratis dan cukup mudah diatur (Python 2.6).

1
MaR

Apa yang benar-benar ingin Anda lakukan adalah melihat apakah ada kode yang dikloning (disalin) di kedua proyek (kedua proyek yang terdiri dari set file yang mungkin besar). Anda dapat melakukan ini dengan menjalankan alat deteksi kloning. Wikipedia mendaftar berbagai dari mereka.

Untuk memutuskan secara kasar jika ada banyak penyalinan, Anda hanya perlu mencocokkan baris sumber, dan ada berbagai detektor klon sumber-garis yang tepat di luar sana. Saya percaya PMD adalah salah satunya. Apa yang tidak akan dilakukan adalah menemukan kode yang disalin-tempel-edit; mereka akan menemukan kode copy-paste-tidak-berubah boilerplate kemungkinan melilit copy-past-diedit hal-hal.

Jika Anda ingin melihat detail dari penyalinan untuk kode copy-past-edit, Anda memerlukan detektor klon yang menemukan klon "parameter". Detektor berbasis token melakukan ini untuk pengeditan yang menggantikan hanya nama variabel atau konstanta.

Detektor berbasis pohon abstrak-sintaksis (AST) melakukan ini untuk pengeditan yang melibatkan potongan yang lebih besar, seperti ekspresi, pernyataan, penyisipan, penghapusan, dll. Yang terakhir ini cenderung memberikan jawaban yang lebih baik, karena tidak seperti detektor token, mereka dapat menggunakan struktur bahasa kode sumber komputer sebagai panduan.

Alat CloneDR kami adalah pendeteksi seperti itu.

Saya tidak tahu alat yang benar-benar akan menemukan kode "setara" (kondisional terbalik), dll. Para peneliti telah membangun detektor klon yang melakukan sesuatu seperti ini, tetapi kombinatorik membuat ini sangat mahal untuk dieksekusi, dan prototipe penelitian berskala buruk.

1
Ira Baxter