Обзор алгоритмов и детекторов обнаружения плагиата в исходных кодах программ Ю. Лифшиц А. Котов Е. Лысенко Д. Антипов О. Евтифеева А. Красс М. Лакунин А. Семенников Р. Счастливцев Санкт-Петербург, 2006 План обзора Постановка задачи Обзор алгоритмов Тестирование детекторов Направления для дальнейшей работы Project summary Определение плагиата Для нас плагиат – это непосредственное использование чужого кода в своём. Часть одной программы является плагиатом части другой программы, если она была получена из нее копированием с последующим незначительным изменением кода: случайные вставки в код; перегруппировка методов; переименование переменных; рефакторинг кода. Общая схема поиска плагиата Исходная программа Текст Парсер Представление Основной алгоритм Выходные данные Метрика Вывод Переходим из модели с большим количеством избыточной информации к более компактной Представления исходного кода Исходный код программы Параметрическое представление Токенизированное представление while (i <= s.top()) { printf(“%d”, s[i]); s[i] = s[i + 1]; i++; } BEGINWHILE APPLY ASSIGN ASSIGN ENDWHILE В виде дерева или ориентированного графа Основные ветви развития Атрибутно-подсчётные методы Структурные методы Строковое выравнивание Жадное строковое замощение Применение суффиксных деревьев/массивов Использование приближения Колмогоровской сложности Сравнение AST-представлений программ Сигнатурные методы или методы отпечатков Гибридные методы Сигнатурные методы (метод отпечатков) 1. 2. 3. 4. 5. Хэшируем все подстроки токенизированной программы P фиксированной длины. Выделяем некоторое подмножество их хэшзначений, хорошо характеризующее P. Проделываем те же шаги для токенизированных программ T1, T2 … Tn и помещаем выбранные хэшзначения в базу. С помощью хэш-таблицы (базы) получаем набор участков строки P, подозрительных на плагиат. Анализируем результат и делаем выводы. Детекторы плагиата Детектор Языки Модель Алгоритм Accuse Fortran n-мерное пространство аттрибутно-подсчитывающий метод SIM C, Java, Pascal, Modula-2, Miranda токены поиск по матрице совпадений подстрок JPlag C/C++, Java, Scheme токены жадное строковое замощение MOSS C/C++, C#, Java, a8086 assembly и др. сигнатура кода метод отпечатков Plague Pascal, Modula-2, Prolog токены набор метрик, одна из них – вариация НОП Sherlock Pascal и др. текст, токены аналог Plague, нейросеть Plan-X SML XML формат использоване XMLStore SID С++, Java токены вычисление метрики на основе Колмогоровской сложности Тестирование бесплатных детекторов Доступность: SIM – работает всегда, так как это не online-сервис JPlag – никаких претензий MOSS – иногда сервер может быть недоступен SID – может не работать долгое время Скорость тестирования: MOSS, SIM – почти мгновенно JPlag – порядка 10 секунд на тест SID – среднее ожидание времени ответа - 10 минут Сравнительная характеристика Детектор Регистрация Прог. требования Автоматизация Представл. рез-тов Языки JPlag запрос, разрешение администратора JRE, web-браузер нет окно с фреймами средний диапазон MOSS письмо с запросом Perl, web-браузер да окно с фреймами широкий диапазон SID заполнить форму zip-архиватор, web-браузер да окно с фреймами узкий диапазон SIM - - да stdout средний диапазон Принципы оценки результатов тестирования n проектов участвует в тесте n * (n – 1) / 2 пар проектов нужно проверить на наличие плагиата g пар проектов действительно содержат плагиат f пар проектов с плагиатом обнаружил детектор t из f обнаруженных пар действительно содержат плагиат t P 100% g t R 100% f Тестовая коллекция Коллекция Язык Тип Количество файлов TestSet_simple.zip (2 Kb) Java естественный 2 TestSet_spbolymp.zip (177 Kb) C++ естественный 196 TestSet_SID.zip (653 Kb) Java искусственный 86 TestSet_FTP.zip (637 Kb) C++ естественный 5(170) Результаты тестирования TestSet_spbolymp.zip Тест Файлов Ср. SID размер MOSS JPlag SIM Комментарии Summer2004Set_day28TestB 5 3 Kb 4% - 14.0 % 42% SIM неоправданно подозрителен SPB2005TestC 7 1 Kb 11% - - 60% false positive TeamSPB2003 -TestF 3 2 Kb 80% 99% и 100% 100% 96% плагиат Результаты тестирования TestSet_SID.zip Тест Файлов Ср. Разм. SID (%) MOSS, % JPlag, % SIM, % 1/100 2 3 Kb 82 79 и 78 99.3 100 2/100 2 3 Kb 79 79 и 77 98.7 97 10/100 2 3 Kb 66 62 и 55 92.7 77 20/100 2 3 Kb 53 40 и 32 40.3 57 50/100 2 4 Kb 31 6и3 24.7 5 1/1100 2 41 Kb 98 98 и 98 99.9 99 2/1100 2 42 Kb 98 98 и 97 99.9 100 10/1100 2 42 Kb 97 97 и 95 99.2 99 270/1100 2 42 Kb 92 96 и 93 98.6 99 180/1100 2 43 Kb 79 84 и 74 90.4 93 400/1100 2 52 Kb 15 5и3 12.7 8 400/1100 2 49 Kb 40 19 и 12 25.1 27 200/1100 2 46 Kb 63 43 и 33 58.4 64 Качество обнаружения плагиата MOSS, JPlag, SID – хорошее; SID – лучше устойчив к вставкам одиночных операторов в код, но хуже реагирует на другие методы сокрытия плагиата; SIM – слишком подозрителен на коротких программах; SID, JPlag – парсер C-файлов не переваривает корректную строку while (c=='\xD'). Возможные направления для улучшения обзора Протестировать CloneDR, Palamida IP Amplifier и Black Duck protexIP, выяснить достоинства и недостатки CodeRankTM. Рассмотреть применение детекторов в индустрии создания ПО. Провести более глубокое тестирование с применением обфускаторов, нейросетей, более тонкой настройкой алгоритмов и т.д. Исследовать применение кластеризации для различных баз и алгоритмов. Возможные направления для исследований Подобрать более близкое приближение Колмогоровской сложности. Получить хэш-функцию, удовлетворяющую требованиям алгоритма сравнения AST-представлений Рассмотреть идею поиска плагиата в исполняемом коде. Изучить применение стандартных алгоритмов определения авторства к нашей задаче. Написать свой детектор плагиата, учтя все недостатки, существующих продуктов. Project summary Проект выполнен в рамках программы по сотрудничеству Intel™ с ВУЗами Санкт-Петербурга; 9 человек работали над проектом в период с 15.01.2006 по 18.04.2006; Сайт проекта – http://detector.spb.su, построен на базе технологии коллективной разработки WiKi. Основной результат проекта – обзор алгоритмов и детекторов.