it-swarm.dev

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

Farklý bir araçtan bahsetmiyorum. Gerçekten bir proje başka bir projeden "refactored" olabilir kod içerip içermediğini görmek için arıyorum. İşlev adlarının, değişken adlarının ve nelerin değiştirilmemesi muhtemeldir. Koşullar tersine çevrilmiş olabilir.

37
siljoy

Yazılım mühendisliği öğretirken, Stanford'da MOSS (Yazılım Benzerliğinin Ölçüsü) adlı (ücretsiz) hizmeti kullandım. Bu, öğrenci projeleri arasındaki intihalleri çok kolay bir şekilde saptamamı sağladı Sistem, aynı zamanda, göz ardı edilecek sınıfta kullandığım "bilinen iyi" kod örneklerini girmeme de izin verdi.

Geri gelen sonuçlar ile ilgili en iyi şey (tamamen bir yan sorun) hangi öğrencilerin birlikte çalıştığını söyleyebilmemizdi - kodu açık bir şekilde kopyalamasalar bile, kodlarının benzer olmasına yetecek kadar sorunları tartıştılar. Üzücü kısım, başka bir koda SIMILARITY olmayan garip öğrenciyi bulmaktı. Genelde pek başarılı olmadılar.

10
Peter K.

Aradığınızı bulmak için PMD aracını kullanabilirsiniz. Kod tabanındaki kes ve yapıştırmayı algılamak içindir, ancak şüpheli Kaynak proje kaynağını eklerseniz, kodun nereden kopyalandığını görmenize yardımcı olabilir.

8
busyspin

Ne aradığınızı bildiğim en yakın şey Clone Detective. Bir Visual Studio eklentisidir.

Klon Dedektif, başka bir yerde çoğaltılan kaynak kodu için C # projelerini analiz etmenizi sağlayan bir Visual Studio entegrasyonudur. Yinelemelere sahip olmak kolayca tutarsızlıklara yol açabilir ve genellikle kötü faktörlü kodun bir göstergesidir.

5
epotter

İki soyut sözdizimi ağacı (AST) arasındaki farkı hesaplamak istediğiniz gibi görünüyor, bu yüzden Smart Differencer aracı ile ilgilenebilirsiniz.

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

4
Matthew Rodatus

Farklı bir araç hakkında konuşmasanız bile, en azından bir dereceye kadar bunun için bir tane kullanabilirsiniz. Örneğin, kodun benzer görünen iki bölümünü görürsem, sık sık her ikisini de ortak işlevselliği yeniden düzenleyerek basitleştirmenin ne kadar iş olduğunu görmek için BeyondCompare'e yapıştırırım.

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

1
Mason Wheeler

Konuyla ilgili bu wikipedia ile ilgili makale , benzer veya yinelenen kodu 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 belirtilen harici araçlara aşina değilim.

1
Alan

Ben nasıl CCFinderX benzerliği görselleştirir gibi, bu yüzden de kontrol etmek isteyebilirsiniz. Birkaç dili destekler, kurulumu ücretsiz ve oldukça kolaydır (Python 2.6).

1
MaR

Gerçekten yapmak istediğiniz şey, iki projede (her iki proje de muhtemelen büyük dosya kümelerinden oluşan) klonlanmış (kopyalanmış) olup olmadığına bakın. Bunu bir klon algılama aracı çalıştırarak yapabilirsiniz. Wikipedia bunların birçoğunu listeler.

Çok fazla kopyalama olup olmadığına kabaca karar vermek için, sadece kaynak hatlarını eşleştirmeniz gerekir ve orada çeşitli kesin kaynak hattı klon dedektörleri vardır. PMD'nin bunlardan biri olduğuna inanıyorum. Bunların yapmayacağı şey kopyala-yapıştır ile düzenlenmiş kodu bulmaktır; büyük olasılıkla kopyalanmış geçmiş kopyala-yapıştır-değiştirilmemiş kodu, geçmiş kopyalarla düzenlenmiş öğelerin etrafına sarılmış olarak bulacaklardır.

Geçmiş kopyalamayı düzenleme kodu için kopyalama ayrıntılarını görmek istiyorsanız, "parametreli" klonlar bulan bir klon dedektörüne ihtiyacınız vardır. Belirteç tabanlı dedektörler bunu yalnızca değişken adlarının veya sabitlerin yerini alan düzenlemeler için yapar.

Soyut sözdizimi ağacı (AST) tabanlı dedektörler bunu ifadeler, ifadeler, eklemeler, silmeler, vb. Gibi daha büyük parçalar içeren düzenlemeler için yapar. Bu ikincisi daha iyi cevap verme eğilimindedir, çünkü jeton dedektörlerinin aksine, bilgisayar kaynak kodunun dil yapısını kılavuz olarak kullanabilirler.

CloneDR aracımız böyle bir dedektördür.

Aslında "eşdeğer" kodu (ters koşullu), vb bulacaktır araçları bilmiyorum. Araştırmacılar böyle bir şey yapan klon dedektörleri inşa etmişlerdir, ancak birleştiriciler bunu yürütmek için çok pahalı hale getirir ve araştırma prototipleri zayıf ölçeklendirilmiş.

1
Ira Baxter