Как стать автором
Обновить

Комментарии 18

НЛО прилетело и опубликовало эту надпись здесь
Есть ресурс с решениями каких то задач/алгоритмов на разных языках rosettacode.org (в том числе и языков предложенных в статье для анализа на плагиат)
На самом ресурсе, при решении этих задач, допустимо использовать решения из других языков (желательно с указанием чья взята основа)

Вопрос:
Насколько предложенное решение антиплагиата кода отработает на выборке задач с этого ресурса? (был бы интересный анализ)

P.S. И, как понимаю, для автора статьи, важнее чтобы не было «корреляций» предложенных решений в обучаемой группе и желательно без совпадений с другими группами уже прошедшими этот курс ранее (и, возможно, выявления «купленных» решений).
Тогда программное решение должно ещё как то пополняться актуальной базой данных плагиата кода и его источников. :)

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

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

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

Вангую что его можно не просто обойти, а засегфолтить. Банально std::cond_t<std::numric_limits<signed char>::max() / 2 == 100+27, char, double> foo(); нельзя нормально распарсить без интерпретации кода во время парсинга. Если на подобное завязать логику кода, то наколеночный парсер понятия не будет иметь что хотел сказать автор

Если программа сегфолтнет на этапе исполнения, то она не пройдёт тесты в системе контестов, а следовательно даже и не дойдет до модуля антиплагиата.

Причём здесь сегфолт программы? Я говорю про систему антиплагиата и недопарсер с++ который в лучшем случае будет считать корректные программы ошибочными. В худшем - ctd.

А, понял вопрос. Могу ответить только то, что тут вся ответственность за это ложится на ANTLR. Он не занимается интерпретацией кода, а список лексем выдает в соответствии с описанием грамматики языка программирования в специализированном формате (можете ознакомиться, вот пример для плюсов).

Если он не может понять определенный токен (например, добавленый в новой мажорной версии языка программирования), то он просто добавляет неизвестный идентификатор и продолжает свою работу, а не падает с ошибкой.

Ну распарсится это выражение с ошибкой, но ведь есть синхронизирующий токен (;), после которого процесс парсинга можно восстановить. Не думаю, что такое часто встречается в коде, а если и встречает, то возникнет другой вопрос — а зачем так писать?

Я человек простой — вижу упоминание ANTLR, ставлю плюс статье и в карму :)


Небольшой платой за готовый синтаксический разбор будет долгое обращение к самой утилите (занимает порядка секунды для небольшой программы).

А как у вас происходит обращение к ANTLR, какой рантайм используете? Одна секунда — это очень много. Кстати, ANTLR имеет внутренний кеш, так что последующие обращения должны быстрее отрабатывать.


Основным узким местом стало получение промежуточных форматов данных: обращение к ANTLR для каждой программы занимало примерно секунду, в то время как алгоритмическая часть работала почти моментально. Решением проблемы стало использование кэширования представлений посредством общеизвестного Redis, позволившее получать результат антиплагиата примерно за 1-2 секунды для выборки из 50 решений с "прогретым" кэшем.

А что конкретно кешируется и зачем для этого Redis? Опять-таки ANTLR и так использует внутренний кеш, что увеличивает скорость при повторном обращении.


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

Забавно, если студенты начнут взламывать такую систему. Хотя за такое надо скорей поощрять, а не наказывать :)


А еще можно нескольким студентам дать курсовую на разработку системы антиплагиата, а потом запустить ее на их же работах. Если программы будут работать хорошо или плохо, при этом покажут плагиат, значит студенты не получат хороших оценок :) Потому что в первом случаи они списали, во втором — разработали плохой алгоритм.

Замечания очень верные и, вероятно, проблем с производительностью бы не было, если бы обращения шли не из рантайма языка Go :)

Для каждой программы, помимо её исходного кода, на вход антиплагиата поступает её уникальный ID. И первым делом проверяется, не поступала ли эта программа ранее. Здесь же гораздо проще и быстрее обратиться к in-memory хранилке за этим вопросом, чем заново прогонять код через ANTLR.

Если говорить конкретнее, то в кэш попадает весь выход ANTLR. Например, AST туда прилетает в формате (compilation_unit (using_directives (using_directive using (namespace_or_type_name (identifier System)), а затем (при необходимости) повторно парсится и загружается в память сотней строк на Go и становится снова готовым для скоринга. К сожалению, не могу предоставить исходники, потому что это немного коммерческий продукт.

Кстати, мы действительно задумывались о проблеме взлома системы антиплагиата, как только об этом прознают студенты. Штош, нам самим будет интересно посмотреть). Мы даже готовимся к некоторой гонке вооружений, когда нашу систему будут пытаться обойти, а мы будем придумывать новые эвристики для поиска таких хитрицов.

Замечания очень верные и, вероятно, проблем с производительностью бы не было, если бы обращения шли не из рантайма языка Go :)

Как раз не так давно производительность Go рантайма была сильно улучшена. Так попробуйте потом версию 4.9.3, она выйдет довольно скоро.


Если говорить конкретнее, то в кэш попадает весь выход ANTLR. Например, AST туда прилетает в формате (compilation_unit (using_directives (using_directive using (namespace_or_type_name (identifier System))

Такое, кстати, лучше в бинарном виде хранить, будет еще быстрей работать.

А не легче спросить что этот код делает и как он работает?

Я своему другу тоже так помогал, код был отменный, но он его не защитил (хотя я ему объяснял суть, но он забыл почти все)

преподаватель сам понимает, что задача простая, поэтому, вероятнее всего, сразу проставит ей нужную оценку.

Очень вряд ли. С текстовым антиплагиатом возникают проблемы, когда диссертацию отправляют на доработку, а исправленная версия потом не проходит проверку антиплагиатом, ибо она на 99% скопирована с предыдущей совей версии. А проблема лишь в том, что какой-то имбецил при отправке на проверку всегда ставит галочку "добавить текст в базу". И формальные требования 95% (или сколько там) уникальности бездумно везде появились.


Так что не будет преподаватель разбираться. Если система взлетит, то будет тупо формальное требование — x% уникальности и не волнует.


Необходимо защиту от таких крайних случаев вставлять в систему.

По идее система сама должна не учитывать тексты разных версий одной и той же работы, просто ориентироваться на уникальное id диссертации.

По идее — да. Но разработчики не предусмотрели именно этот случай. Во всех темах, где этот вопрос всплывает, создатели так и пишут — что не надо так делать, надо смотреть весь отчет, там будет все видно. Там же, если расширенный отчет открыть, то видно же, что все заимствования из предыдущей версии диссертации, но это надо куда-то тыкать и читать что-то, кроме одного числа. Людям это делать лень.

Что мешает это исправить в последующих версиях?

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


Я это лишь все привожу как пример, что надеятся на пользователя тут нельзя.

Мы специально не упрощаем некоторые из вещей, чтобы не было повода у преподавателей полагаться только на цифры, не заглядывая в полный отчёт.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории