Чи є інструменти для визначення подібності коду? [зачинено]


37

Я не кажу про різний інструмент. Я дійсно дивлюсь, чи проект містить код, який, можливо, був "перероблений" з іншого проекту. Цілком імовірно, що імена функцій, імена змінних і те, що не буде змінено. Умови можуть бути відмінені тощо.


5
Це для заняття чи щось таке?
TheLQ

1
@TheLQ - Я можу придумати більш ніж один випадок поза межами приміщення класу, де я пішов на полювання, щоб побачити, де "вирізати та вставити повторно, чи не так?" бригада пройшла.
МВС

Не забувайте про Atomiq Стіва Сміта .
Джим Г.

Коментарі коментарів та вихідні повідомлення (як помилки тощо) часто можуть відбитки пальців від фактичного коду.
Bork Blatt

Вони завжди погрожували нам цим в Уні, було б цікаво подивитися, чи існує такий інструмент насправді.
Джейк

Відповіді:


10

Коли я викладав інженерію програмного забезпечення, я користувався (безкоштовним) сервісом в Стенфорді під назвою MOSS (міра подібності програмного забезпечення). Це дозволило мені дуже легко виявити плагіат між студентськими проектами. Система також дозволила мені ввести «відомі добрі» приклади коду, які я використовував під час уроку, які слід було ігнорувати.

Чудова річ (повністю побічна проблема) про результати, які повернулися, полягала в тому, що ми могли сказати, які студенти працювали разом --- навіть якщо вони не копіювали коду, вони обговорювали проблеми достатньо, щоб їх код був подібний. Сумна частина полягала в тому, щоб знайти дивного студента, БЕЗ ПІДХОДНОСТІ до будь-якого іншого коду. Зазвичай вони не так добре робили.


Дякую, я шукав щось саме таке :)
Ульріх Дангел

8

Можливо, ви зможете скористатися інструментом PMD, щоб знайти те, що шукаєте. Він призначений для виявлення вирізання та вставки в базу коду, але якщо ви включите джерело проекту підозрілого походження, це може допомогти вам побачити, куди з нього скопійовано код.


так - ми використовуємо CPD від PMD у своєму коді
JoseK

Але PMD призначений лише для Java, правда?
Януш Ленар

5

Найближче, що я знаю, до чого ви шукаєте, - це детектив клонів. Це плагін Visual Studio.

Clone Detective - це інтеграція Visual Studio, яка дозволяє аналізувати проекти C # на предмет вихідного коду, який дублюється десь в іншому місці. Наявність дублікатів може легко призвести до невідповідностей і часто є показником для погано врахованого коду.


4

Схоже, ви хочете обчислити різницю між двома абстрактними деревами синтаксису (AST), тому вас може зацікавити інструмент Smart Differencer .

Знайдено на https://stackoverflow.com/questions/974855/eclipse-abrief-syntax-tree-diff .


(Дякую за комплімент моєму інструменту). SmartDifferencer знаходить відмінності між певною парою файлів; подібність є доповненням відмінностей, тому я погоджуюся, що це якась правильна ідея, але для цього потрібно визначити пару файлів, і це боляче, якщо ваші системи складаються з багатьох файлів. Що насправді потрібно, це доповнення: знайдіть схожість і зробіть це, не особисто ідентифікуючи пари файлів. Дивіться мою відповідь CloneDR у цій же нитці для такого інструменту. Так, він використовує суміжні технології.
Іра Бакстер

1

Навіть якщо ви не говорите про різний інструмент, ви все одно можете використовувати його для цього, принаймні, певною мірою. Якщо я бачу два розділи коду, які виглядають схоже, я, наприклад, часто вставляю обидва в BeyondCompare, щоб побачити, як багато роботи було б спростити його шляхом рефакторингу загальної функції.

З іншого боку, якщо ви не знаєте, де схожий код, але вам просто цікаво, чи існує десь там, що ви шукаєте? Автоматизований інструмент виявлення плагіату? Я не впевнений, що таке існує.


Якби це сталося, ШОС, можливо, виграла би проти IBM :-)

1

Ця стаття з Вікіпедії з цього питання також містить посилання на декілька інструментів, за допомогою яких можна знайти аналогічний чи дублюючий код. У нас є внутрішній інструмент для цього, тому я не знайомий із зовнішніми інструментами, згаданими у статті.


1

Що ви дійсно хочете зробити, це побачити, чи є код клонований (скопійований) в двох проектах (обидва проекти, що складаються з можливо великих наборів файлів). Це можна зробити, запустивши інструмент виявлення клонів. У Вікіпедії перелічено їх різноманітність.

Щоб вирішити, чи є багато копіювання, вам потрібно лише узгодити вихідні лінії, а там є безліч точних детекторів клонів джерела. Я вважаю, що ПМД - одна з них. Що вони не робитимуть - це знайти код, який редагується копією та вставкою; вони знайдуть код-копіювальний-незмінний код копіювання, який, ймовірно, обгорнутий навколо матеріалів, що були відредаговані раніше.

Якщо ви хочете побачити деталі копіювання для копіювання попереднього редагування коду, вам потрібен детектор клонів, який знаходить «параметризовані» клони. Детектори на основі токенів роблять це для редагувань, які замінюють просто імена змінних або констант.

Детектори на основі абстрактно-синтаксичного дерева (AST) роблять це для редагування, пов’язаного з більшими фрагментами, такими як вирази, заяви, вставки, видалення тощо. Ці останні, як правило, дають кращі відповіді, оскільки на відміну від детекторів жетонів, вони можуть використовувати мовну структуру вихідного коду комп'ютера як керівництво.

Наш інструмент CloneDR - такий детектор.

Я не знаю інструментів, які фактично знайдуть «еквівалентний» код (зворотні умови) тощо. Дослідники створили детектори клонів, які роблять щось подібне, але комбінаторика робить це дуже дорогим у виконанні, а дослідні зразки масштабуються погано.


1

Мені дуже подобається, як CCFinderX візуалізує схожість, тому ви можете також перевірити цю. Підтримує досить багато мов, це безкоштовно та досить просто налаштувати (Python 2.6).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.