Существуют ли инструменты для определения сходства кода? [закрыто]

37

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

Тамара Вийсман
источник
5
Это для класса или что-то?
TheLQ 21.09.10
1
@TheLQ - Я могу вспомнить более одного случая за пределами школьной комнаты, где я отправился на охоту, чтобы увидеть, где «вырезать и вставить повторно, верно?» бригада прошла.
МВД
Не забывайте об Атомике Стива Смита .
Джим Г.
Комментарии и выходные сообщения (например, ошибки и т. Д.) Часто могут лучше распознавать отпечатки пальцев, чем реальный код.
Борк Блатт
Они всегда угрожали нам этим в Uni, было бы интересно посмотреть, существует ли такой инструмент на самом деле.
Джейк

Ответы:

10

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

Самое замечательное (совершенно побочный вопрос) в результатах, которые мы получили, было то, что мы могли сказать, какие студенты работали вместе - даже если они не копировали код явно, они обсуждали проблемы настолько, что их код был похож. Грустной частью было нахождение странного студента, не имеющего сходства с любым другим кодом. Они обычно не очень хорошо.

Питер К.
источник
Спасибо, я искал что-то в точности подобное :)
Ульрих Дангель
8

Вы можете использовать инструмент PMD, чтобы найти то, что вы ищете. Он предназначен для обнаружения вырезок и вставок в базе кода, но если вы включите исходный исходный проект, это может помочь вам увидеть, откуда был скопирован код.

busyspin
источник
да - мы используем CPD из PMD в нашем коде
JoseK
Но PMD только для Java, верно?
Януш Ленар
5

Самое близкое, что я знаю о том, что вы ищете, это детектив-клон. Это плагин Visual Studio.

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

epotter
источник
4

Звучит так, будто вы хотите вычислить разницу между двумя абстрактными синтаксическими деревьями (AST), поэтому вас может заинтересовать инструмент Smart Differencer .

Найдено по адресу https://stackoverflow.com/questions/974855/eclipse-abstract-syntax-tree-diff .

Мэтью Родатус
источник
(Спасибо за комплимент моему инструменту). SmartDifferencer находит различия между определенной парой файлов; Сходство является дополнением к различиям, поэтому я согласен с тем, что это своего рода правильная идея. Но для этого нужно определить пару файлов, и это болезненно, если ваши системы состоят из множества файлов. Что действительно необходимо, так это дополнение: найдите сходство и сделайте это без личной идентификации пар файлов. Смотрите мой ответ CloneDR в этой же теме для такого инструмента. Да, он использует смежные технологии.
Ира Бакстер
1

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

С другой стороны, если вы не знаете, где находится подобный код, но вам просто интересно, существует ли где-нибудь такой код ... что вы ищете? Автоматизированный инструмент для обнаружения плагиата? Я не уверен, что такая вещь существует.

Мейсон Уилер
источник
Если бы это произошло, ШОС мог бы выиграть у IBM :-)
1

Эта статья в Википедии на эту тему также содержит ссылки на несколько инструментов, которые можно использовать для поиска похожего или дублирующего кода. У нас есть внутренний инструмент для этого, поэтому я не знаком с внешними инструментами, упомянутыми в статье.

Алан
источник
1

Что вы действительно хотите сделать, так это посмотреть, есть ли код, клонированный (скопированный) между двумя проектами (оба проекта, состоящие из, возможно, больших наборов файлов). Вы можете сделать это, запустив инструмент обнаружения клонов. В Википедии перечислено множество их.

Чтобы решить, достаточно ли много копий, вам нужно только сопоставить исходные строки, и есть множество точных детекторов клонов исходных строк. Я считаю, что PMD является одним из них. Чего они не будут делать, так это найти код, который отредактирован копированием-вставкой; они найдут стандартный код «копировать-вставить-неизмененный», вероятно, обернутый вокруг материала, отредактированного после копирования.

Если вы хотите увидеть подробности копирования для кода копирования-редактирования, вам нужен детектор клонов, который находит «параметризованные» клоны. Детекторы на основе токенов делают это для правок, которые заменяют только имена переменных или константы.

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

Наш инструмент CloneDR является таким детектором.

Я не знаю инструментов, которые действительно находят «эквивалентный» код (обратные условия) и т. Д. Исследователи создали детекторы клонов, которые делают что-то подобное, но комбинаторика делает это очень дорогим для выполнения, а исследовательские прототипы плохо масштабируются.

Ира Бакстер
источник
1

Мне действительно нравится, как CCFinderX визуализирует сходство, так что вы можете проверить это. Поддерживает довольно много языков, это бесплатно и довольно легко установить (Python 2.6).

MaR
источник