Kod benzerliğini belirleyen araçlar var mı? [kapalı]


37

Farklı bir araçtan bahsetmiyorum. Bir projenin başka bir projeden "düzeltilmiş" bir kod içerip içermediğini gerçekten görmek istiyorum. İşlev isimlerinin, değişken isimlerinin ve nelerin değişmemesi muhtemeldir. Şartlı koşullar ters çevrilmiş olabilir, vb.


5
Bu bir sınıf veya başka bir şey için mi?
TheLQ

1
@TheLQ - "Kes ve yapıştır tekrar kullan, değil mi?" tugay geçti.
MIA

Steve Smith'in Atomiq'sini unutma .
Jim G.

Yorumlar ve çıktı mesajları (hatalar vb.) Genellikle parmak izi kodunu gerçek koddan daha iyi gösterir.
Bork Blatt

Uni'de bununla bizi hep tehdit ettiler, böyle bir aracın var olup olmadığını görmek ilginç olurdu.
Jake

Yanıtlar:


10

Yazılım mühendisliği öğretirken, Stanford'daki MOSS (Yazılım Benzerliği Ölçümü) adlı ücretsiz servisi kullandım . Bu, öğrenci projeleri arasındaki intihal girişimini çok kolay tespit etmemi sağladı. Sistem ayrıca derste kullanmamam gereken "iyi bilinen" kod örnekleri girmeme izin verdi.

Elde edilen sonuçlarla ilgili en önemli şey (tamamen bir yan konu), hangi öğrencilerin birlikte çalıştığını söyleyebilmemizdi - kodu açıkça kopyalamamış olsalar bile, kodlarının benzer olmasına yetecek kadar sorunu tartıştılar. Üzücü kısmı, başka herhangi bir koda HİÇBİR SINIRLI olmayan garip bir öğrenci bulmaktı. Genelde o kadar iyi yapmadılar.


Teşekkürler, tam olarak böyle bir şey arıyordum :)
Ulrich Dangel


5

Aradığınızı bildiğim en yakın şey Clone Detective. Bu bir Visual Studio eklentisidir.

Clone Detective, başka bir yerde çoğaltılan kaynak kodu için C # projelerini analiz etmenizi sağlayan bir Visual Studio entegrasyonu. Çoğaltmaları kolayca tutarsızlıklara yol açabilir ve genellikle kötü faktörlü kod için bir göstergedir.


4

İki soyut sözdizimi ağacı (AST) arasındaki farkı hesaplamak istediğinize benziyor, bu nedenle Akıllı Ayırıcı aracıyla ilgilenebilirsiniz .

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


(Aracıma iltifat ettiğin için teşekkürler). SmartDifferencer, belirli bir dosya çifti arasındaki farkları bulur; benzerlik, farklılıkların tamamlayıcısıdır, bu yüzden doğru bir fikir olduğuna katılıyorum. Ama bunu vermek için bir çift dosya tanımlamanızı gerektirir ve eğer sistemleriniz birçok dosyadan oluşuyorsa bu acı vericidir. Gerçekten gerekli olan şey, tamamlayıcı: benzerliği bulmak ve kişisel olarak dosya çiftlerini tanımlamaksızın yapmak. Böyle bir araç için aynı konudaki CloneDR cevabımı görün. Evet, ilgili teknolojiyi kullanır.
Ira Baxter

1

Bir diff aracı hakkında konuşmasanız bile, bunun için en azından bir dereceye kadar kullanabilirsiniz. Örneğin, benzer görünen iki kod bölümü görüyorsam, ortak işlevselliği yeniden değerlendirip basitleştirmek için ne kadar iş olduğunu görmek için her ikisini de BeyondCompare'e sık sık yapıştırabilirim.

Öte yandan, benzer kodun nerede olduğunu bilmiyorsanız, ancak bir yerde olup olmadığını merak ediyorsunuzdur. İntihallığı tespit etmek için otomatik bir araç? Böyle bir şeyin var olduğundan emin değilim.


Olursa, SCO IBM :-) karşısında kazanmış olabilir

1

Konuyla ilgili wikipedia hakkındaki bu makale, benzer veya kopya kod bulmak için kullanılabilecek çeşitli araçlara bağlantılar da içerir. Bunun için dahili bir aracımız var, bu yüzden makalede adı geçen harici araçlara aşina değilim.


1

Gerçekten yapmak istediğin şey, iki projenin (her ikisi de muhtemelen büyük dosya kümelerinden oluşan projeler) klonlanmış (kopyalanmış) olup olmadığını görmek. Bunu bir klon algılama aracı çalıştırarak yapabilirsiniz. Wikipedia bunlardan çeşitli listeler.

Çok fazla sayıda kopya olup olmadığına karar vermek için, yalnızca kaynak satırları eşleştirmeniz gerekir ve orada çeşitli kaynak satır klon dedektörleri bulunur. PMD'nin onlardan biri olduğuna inanıyorum. Bunların yapmayacağı şey kopyala-yapıştır ile düzenlenmiş bir kod bulmak; Onlar kopya kopyala-yapıştır-değiştirilmemiş kodlarını bularak bulabilirler.

Kopyalama-düzenleme kodu için kopyalamanın ayrıntılarını görmek istiyorsanız, "parametreleştirilmiş" klonları bulan bir klon algılayıcısına ihtiyacınız var. Token tabanlı dedektörler bunu yalnızca değişken adlarını veya sabitlerini değiştiren düzenlemeler için yapar.

Soyut sözdizimi ağacı (AST) tabanlı dedektörler, ifadeler, ifadeler, ekler, silme ve diğerleri gibi daha büyük boyutlarda olan düzenlemeler için bunu yapar. Bu sorular daha iyi cevap verme eğilimindedir, çünkü belirteç dedektörlerinden farklı olarak, bilgisayar kaynak kodunun dil yapısını kılavuz olarak kullanabilirler.

Bizim CloneDR aracı böyle bir dedektörüdür.

Aslında "eşdeğer" kod (ters şartlı şartnameler) vb. Bulabilecek araçları bilmiyorum. Araştırmacılar, bunun gibi bir şey yapan klon dedektörleri inşa ettiler, ancak kombinatorikler bunu yürütmek için çok pahalı ve araştırma prototipleri zayıf ölçeklendi.


1

CCFinderX'in benzerliği nasıl görselleştirdiğini gerçekten seviyorum , bu yüzden bunu da kontrol etmek isteyebilirsiniz. Oldukça az sayıda dili destekler, kurulumu ücretsiz ve oldukça kolaydır (Python 2.6).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.