Apakah ada alat untuk menentukan kesamaan kode? [Tutup]

37

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.

Tamara Wijsman
sumber
5
Apakah ini untuk kelas atau sesuatu?
TheLQ
1
@TheLQ - Saya bisa memikirkan lebih dari satu case di luar pengaturan ruang kelas di mana saya pergi berburu untuk melihat di mana "cut and paste digunakan kembali, kan?" brigade telah melalui.
MIA
Jangan lupakan Atomiq Steve Smith .
Jim G.
Komentar dan pesan keluaran (seperti kesalahan, dll) seringkali dapat lebih baik dari kode sidik jari kode sebenarnya.
Bork Blatt
Mereka selalu mengancam kami dengan ini di Uni, akan menarik untuk melihat apakah alat seperti itu benar-benar ada.
Jake

Jawaban:

10

Ketika saya mengajar rekayasa perangkat lunak, saya menggunakan layanan (gratis) di Stanford yang disebut MOSS (Ukuran Kesamaan Perangkat Lunak). Ini memungkinkan saya untuk mendeteksi plagiarisme antara proyek siswa dengan sangat mudah. Sistem ini juga memungkinkan saya untuk memasukkan contoh kode "dikenal baik" yang telah 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.

Peter K.
sumber
Terima kasih, saya mencari sesuatu yang persis seperti itu :)
Ulrich Dangel
8

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.

busyspin
sumber
ya - kita menggunakan CPD dari PMD dalam kode kita
JoseK
Tetapi PMD hanya untuk Java, kan?
Janusz Lenar
5

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.

epotter
sumber
4

Kedengarannya Anda ingin menghitung perbedaan antara dua pohon sintaksis abstrak (AST), jadi Anda mungkin tertarik dengan alat Smart Differencer .

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

Matthew Rodatus
sumber
(Terima kasih atas pujian untuk alat saya). SmartDifferencer menemukan perbedaan antara pasangan file tertentu; kesamaan adalah komplemen dari perbedaan jadi saya setuju bahwa itu adalah ide yang tepat. Tetapi mengharuskan Anda untuk mengidentifikasi sepasang file untuk memberikannya, dan itu menyakitkan jika sistem Anda terdiri dari banyak file. Yang benar-benar dibutuhkan adalah pelengkap itu: temukan kesamaannya, dan lakukan tanpa mengidentifikasi pasangan file secara pribadi. Lihat jawaban CloneDR saya di utas yang sama ini untuk alat semacam itu. Ya, itu menggunakan teknologi terkait.
Ira Baxter
1

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.

Mason Wheeler
sumber
Jika ya, SCO mungkin menang melawan IBM :-)
1

Artikel ini pada wikipedia tentang subjek juga mencakup 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.

Alan
sumber
1

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 mencantumkan beragamnya.

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. 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 copy-past-edit kode, 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 semacam 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.

Ira Baxter
sumber
1

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

Merusak
sumber