Исходный код программы можно рассматривать как последовательность токенов (Token String). Сравнивая последовательности токенов, можно получить информацию о степени схожести. Для электронных версий кода, сданных студентами, проводится проверка на схожесть, и в конце концов выдается результат вычисления схожести, а затем, на основе заданного порога, определяется, является ли схожий код плагиатом.
Проверка схожести программного кода отличается от проверки схожести обычного текста тем, что текст проверяется на основе количества повторений в определенном диапазоне текста, в то время как коды, написанные студентами, обычно просты. Ключевые слова и системные функции языка программирования, а также имена классов из системных библиотек не должны учитываться при проверке схожести, а следует учитывать особенности самого кода.Научная, передовая и уникальная сторона проекта Учитывая специфику исходного кода программ, данный проект сосредоточен на следующих аспектах: Анализ общих методов копирования кода студентами, чтобы найти наиболее подходящие образцы для будущего анализа и проверки. Извлечение структурных особенностей исходного кода программы, разбиение программы на последовательности ключевых слов, последовательности пользовательских переменных, последовательности пользовательских функций и т.д.## Исследование и применение методов проверки схожести программного кода
На основе особенностей программных языков создать программную систему для проверки схожести программного кода, которая может вычислять степень схожести кода, поданного каждым студентом на задание, с кодом других студентов. Если степень схожести превышает заданный порог, то код считается списанным. Использование такой системы позволяет эффективно предотвращать списывание кода студентами, а также уменьшает трудозатраты преподавателей при ручной проверке.Проверка схожести программного кода отличается от проверки схожести обычного текста тем, что текст проверяется на основе количества повторяющихся фрагментов в тексте, тогда как коды, написанные студентами, обычно содержат большое количество ключевых слов языка программирования, системных функций и имен классов из библиотек, которые не следует учитывать при проверке схожести. Вместо этого следует учитывать специфические характеристики кода.
Исходный код программы можно рассматривать как последовательность токенов (Token String). Сравнивая эти последовательности, можно получить информацию о степени схожести. Для каждой пары поданных студентами электронных версий кода проводится проверка на схожесть, и в конце концов выдается результат вычисления схожести, который затем используется для определения, является ли код списанным на основе заданного порога.### Научная, передовая и уникальная сторона проекта Учитывая специфические особенности исходного кода программ, данный проект направлен на следующие аспекты:
С конца 1970-х годов ученые начали изучать программное обеспечение для предотвращения копирования программ, и со временем появились несколько представительных систем. Ниже приведены краткие обзоры зарубежных и отечественных систем обнаружения копирования исходного кода программ.
Многие зарубежные университеты создали собственные системы обнаружения копирования исходного кода программ, такие как система MOSS Стэнфордского университета (США), система JPlag Университета Карлсруэ (Германия), система SIM Университета Вичита (США) и система YAP3 Университета Сиднея (Австралия). Эти системы используют комбинацию методов подсчета атрибутов и структурных метрик для выявления копирования программ.В Китае исследования по обнаружению копирования исходного кода программ, а также по связанным с ними задачам, такими как программные задания и субъективные задания, также постепенно углубляются. Например, профессора Чжан Вендянь и Рень Дунвей из Университета полиции Китая разработали систему обнаружения копирования исходного кода на языке Паскаль, а Университет связи и информации в Пекине использовал метод структурных метрик на основе SML для вычисления сходства и реализовал соответствующую экспериментальную систему.Из текущего состояния исследований можно сделать вывод, что в Китае мало исследований по определению сходства программного кода, большинство исследований сосредоточено на китайской морфологии и семантике. Копирование программного кода отличается от копирования обычного текста, так как различные коды могут выполнять одну и ту же функцию. Некоторые умные копиисты используют различные техники для модификации кода, например, замена цикла for на цикл while или добавление множества промежуточных переменных, что снижает эффективность алгоритмов сравнения строк.
Предварительная обработка исходного кода: система должна фильтровать из исходного кода информацию, которая не влияет на выявление сходства, чтобы ускорить работу системы. Например, это могут быть комментарии, заголовочные файлы, бесполезные строки, пробелы и пустые строки. Этот процесс значительно уменьшает размер исходного кода, что ускоряет последующие этапы обработки. Предварительная обработка является относительно простой задачей, и в процессе сканирования можно также собирать некоторые атрибуты, которые могут быть полезны для последующего использования, без увеличения временной сложности.2. Преобразование исходного кода: основные шаги системы обнаружения копирования исходного кода на основе структурных метрик заключаются в преобразовании исходного кода в новую структуру с информацией о структуре. Системы, основанные на алгоритмах сравнения строк, анализируют синтаксис кода и преобразуют его в последовательность маркеров для удобства сравнения строк. Системы, основанные на алгоритмах сравнения графов, анализируют синтаксис кода на определенном языке и преобразуют его в узлы графа, добавляя ориентированные ребра между узлами в соответствии с потоком управления и зависимостями переменных.3. Анализ сходства: сходство между двумя отрезками кода вычисляется с использованием алгоритмов строкового соответствия и графического анализа сходства, что позволяет определить значение сходства sim.
Оценка плагиата: для определения, является ли код плагиатом, используется метод, сочетающий методы структурного измерения и методы вычисления атрибутивных характеристик. Система предоставляет несколько пороговых значений для различных критериев оценки, что повышает точность.
После обработки Java-программой, избыточный код удаляется. Обработка происходит по мере чтения, то есть после чтения одной строки кода, она сразу обрабатывается. Отфильтрованный действительный код может быть передан на следующую стадию, то есть на стадию преобразования кода. В этой программе разделенный код сохраняется в ArrayList
, таким образом, массив содержит статистические данные исходного кода. Затем ArrayList
, содержащий статистические данные, сохраняется в ArrayList
, который хранит информацию о SourceProgram
. В этом массиве хранится вся информация о сравниваемых исходных программах (в настоящее время это количество появления 32 системных ключевых слов на языке C в исходном коде).Чтобы избежать бесполезных сравнений (файлы, сохраненные в определенном пути, по умолчанию уже прошли проверку исходного кода, и пороги между ними меньше заданного значения 0.90, что свидетельствует о том, что нет плагиата), сначала загружаются файлы, загруженные пользователем, и после обработки они сразу сохраняются в начало массива для сравнения. Затем они последовательно сравниваются с кодом внутри файла.
Способ разделения: исходный код разделяется на основе особенностей языка C, используя регулярные выражения. Заданные разделители: ``, ,
, `;`, `(`, `)`, `&`, `|`, `пробел`.
Информация в `ArrayList` исходного кода, согласно определенному `Map` (хранящему 32 ключевых слова и соответствующие им индексы массива), используется для определения и присвоения значений. Каждый раз, когда ключевое слово появляется, значение в соответствующем месте увеличивается на 1, и так далее.
В этом программе используется метод вычисления скорректированного косинусного сходства.
AdjustedCosineSimilarity: ниже приведено выражение, которое представляет собой вычитание среднего значения оценки пользователя u
для всех предметов из его оценки предмета i
, что позволяет получить скорректированную оценку.s(i,j)
представляет собой сходство между объектами i
и j
. Числитель представляет собой сумму произведений скорректированных оценок пользователей, которые одновременно оценили объекты i
и j
, а знаменатель представляет собой некоторую обработку скорректированных оценок для всех объектов. Ключевые слова в исходном коде рассматриваются как оценки студентов, и на основе этого выражения можно определить сходство оценок двух студентов для ключевых слов, то есть считается, что это сходство между двумя кодами.
$$
s(i,j)=\frac{\sum_{{u\epsilon U}}(R{u,i}-\bar{R_{u}})(R_{u,j}-\bar{R_{u}})}{\sqrt{(\sum_{{u\epsilon U}}(R{u,i}-\bar{R_{u}}))^{2}}\sqrt{(\sum_{{u\epsilon U}}(R{u,j}-\bar{R_{u}}))^{2}}}
$$
! [acs. png](/acs. png)
Измененная косинусная схожесть является алгоритмом колаборативной фильтрации на основе модели. Одним из преимуществ этого алгоритма является хорошая масштабируемость, что позволяет быстро обрабатывать большие объемы данных с минимальным использованием памяти.
С помощью Java можно извлекать ключевые слова из исходного кода на C, затем выполнять их статистический анализ и, используя метод измерения измененной косинусной схожести, вычислять степень схожести между двумя исходными кодами.С помощью JavaFX реализована функция сравнения текста, аналогичная UltraCompare (UC), с подсветкой совпадающих текстов; результаты схожести, вычисленные с помощью Java, сохраняются в промежуточном файле, а затем JavaFX загружает их и отображает в виде круговой диаграммы, а также позволяет просматривать информацию о схожих группах.
На основе предыдущих исследований введена статистика по частоте слов (для ключевых слов языка C и системных функций), что позволяет при низкой точности и быстром отклике программы минимизировать вероятность ложноположительных результатов. В отличие от существующего программного обеспечения UltraCompare (UC), данное программное обеспечение является бесплатным, имеет простой код, ориентировано на конкретные задачи и имеет быстрый отклик.
Предварительная обработка исходного кода
При обработке комментариев программа использует метод иерархической проверки, то есть однократные комментарии могут быть обработаны непосредственно, а многострочные комментарии рассматриваются как уровень вложенности, при этом соответствующие переменные устанавливаются в true, и они остаются таковыми до тех пор, пока не будут установлены в false.При тестировании кода структуры данных автор обнаружил, что у некоторых студентов возникают проблемы с соответствием фигурных скобок, что связано с использованием */
в printf
-выражении, например: printf("Please input +-*/\n");
. Автор хотел, чтобы пользователи вводили операции сложения, вычитания, умножения и деления, но при сравнении строк возникают ошибки.
Для удовлетворения различных стилей написания кода студентами, программа выполняет несколько проверок при определении начала и конца комментариев. В приведенном выше примере при проверке на наличие /*
или */
происходит срез и начинается статистический анализ, что приводит к ошибкам в результатах. Аналогичная проблема возникает, когда студент вставляет в комментарий: /*. . . . . . //
вложенный комментарий */
, и программа, сначала проверяющая однократные комментарии, возвращает null
, что приводит к ошибкам в статистических данных.
Проверка схожести
При запуске на Windows, поданный код последовательно сравнивается, и если полученное сходство превышает пороговое значение, процесс немедленно завершается. При запуске на Ubuntu сравнение всех файлов в указанной папке завершается только после полного анализа. Основное сравнение осуществляется на основе времени создания файлов, а не их названий.Ввиду ограниченности знаний автора, используется простой метод измерения сходства, который позволяет четко определить сходство кода выше 95%. В будущем выбор метода будет зависеть от рекомендаций научного руководителя и уровня знаний автора.
В процессе проекта автор изучает другие методы измерения сходства, такие как коэффициент корреляции Пирсона, который имеет схожее значение порога.
Оценка плагиата
Без предоставления статистического анализа, временно используется предполагаемое значение, и пороговое значение 0.90 используется для определения плагиата.
Меры и схемы для повышения
Интерфейс выбора пользовательских действий (рис.1): основной интерфейс для выбора действий пользователя, предоставляющий два метода просмотра сходства, один из которых показывает детальную информацию сравнения двух выбранных кодов, другой — распределение сходства для всего класса. Можно просмотреть детальную информацию группировки в определенном диапазоне.
Детальный интерфейс для сравнения кода (рис. 2, подобен UltraCompare): пользователь вводит два исходных кода на языке C, после нажатия кнопки "Начать" можно увидеть результат сравнения: цифры представляют строки исходного файла, красный цвет используется для успешного соответствия текста, черный цвет — для неудачного соответствия, "---" — для вставки строки, которая не соответствует.
Просмотр распределения сходства класса в виде графика (рис. 3): пользователь выбирает текст, содержащий результаты сравнения кода класса, после нажатия кнопки "Начать" можно увидеть круговую диаграмму сходства. В левой панели инструментов можно просмотреть конкретную информацию для каждого диапазона, такие как общее количество людей, информация о группах сходства, например: demo1, demo2 имеют сходство 0.91.
! project show - Экспериментальные тесты: Входящий размер кода составляет 120 строк действующего кода:
result = 1.0
сравнение занимает 72ms
2.Переименование идентификаторов; переименование 12 переменных типа int
в коде result = 1.0
сравнение занимает 71ms
main
функцией: result = 1.0
сравнение занимает 55ms
result = 1.0
сравнение занимает 55ms
int
, случайное изменение 4 из них на double
: result = 0.987
сравнение занимает 46ms
int
, случайное изменение 10 из них на double
: result = 0.895
сравнение занимает 53ms
double
в функции: result = 0.993
сравнение занимает 53ms
while
: замена 2 из них на циклы for
: result = 0.967
сравнение занимает 46ms
замена 4 из них на циклы for
: result = 0.938
сравнение занимает 42ms
103ms
время сравнения одного кода с 32 кодами: 217ms
; время сравнения одного кода с 28 кодами: 209ms
- Инновации: Введение метода статистического подсчёта частоты слов, что позволяет быстро реагировать при низких требованиях к точности и высокой схожести двух файлов, а также минимизировать вероятность ложноположительных результатов. Программа выдаёт высокие результаты даже при простых изменениях кода в диапазоне от 10% до 0% и выше.[1]. Тянь Чжунzhou, Лيو Цянь, Чжень Цинхуа, et al. Обзор исследований по выявлению копирования программного обеспечения [J].Журнал информационной безопасности, 2016, 1(3). [2]. Сюй Хао, Янь Хайхуа, Гуо Тао, et al. Технологии обнаружения схожести кода: обзор исследований [J]. Журнал компьютерных наук, 2010, 37(8): 9-14. [3]. Ван Фэй. Исследование техники анализа схожести исходного кода программного обеспечения и системы его применения [D]. Университет связи и информации Китая, 2013. [4]. Чжао Яньбо. Исследование технологии выявления копирования кода программ на основе абстрактного синтаксического дерева [D]. 2011. [5]. Цзу Бо. Исследование методов измерения схожести кода программ [D]. Университет инженерии и технологий Чанчжоу, 2015. [6]. Дэн Айпин. Исследование технологии выявления копирования исходного кода программ [D]. Университет Хунань, 2008. [7]. Ву Фэй. Исследование метода выявления копирования кода программ на основе N-gram [D]. 2012. [8]. Ван Гуан. Исследование метода оценки схожести кода Java [D]. 2008.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )