<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Обнаружение плагиата исходного кода программного обеспечения при помощи математических метрик сложности</article-title>
      </title-group>
      <pub-date>
        <year>2017</year>
      </pub-date>
      <abstract>
        <p>В работе предлагается метод, основанный на двух алгоритмах: алгоритм предобработки исходного кода программы и алгоритм проверки является ли код плагиатом по его количественным характеристикам, вычисляемым на основе метрик сложности. Были выбраны метрики сложности Холстеда и Джилба. Предложенный метод был реализован в виде программы и протестирован. Тестирование проводилось на множестве программ написанных студентами в ходы выполнения лабораторных работ.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>Под плагиатом в работе мы понимаем полное или частичное копирование программного кода без
изменение либо с незначительной его модификацией. В работе [6] прилагается следующая классификация
копирования исходного кода:
∙ Заимствования 1 рода -– код заимствуется без каких-либо изменений.
∙ Заимствования 2 рода -– код заимствуется без каких-либо серьезных изменений, но меняются имена
переменных, их тип.
∙ Заимствования 3 рода -– код заимствуется, но изменяется посредствам добавления и/или удаления
фрагментов кода, возможно, даже ни как не влияющих на работы программы. Так же могут быть
заимствования 2 рода.
∙ Заимствования 4 рода – данный род заимствования характеризуется копированием логики работы и
функциональности. Синтаксически код оригинала может абсолютно отличаться от заимствованного
кода.</p>
      <p>
        Четвертый род заимствования можно не учитывать, в данном случае сложно говорить о плагиате в
явном виде т.к. человек заимствующих код копирует только «идею» (логику, функционал), но при этом
создает собственную программу. Наиболее простым методом выявления плагиата является простое
посимвольное сравнение кодов программ. Данный метод не зависит от языка, на котором реализована
программа, но достаточно легко обходится элементарным переименованием переменных, функций,
добавлением/удалением комментариев и т.п. Подходит для выявления заимствований только 1 рода. Существует
различные методы выявления плагиата на основе токенизации исходного кода, например, алгоритм
Хескела, выравнивание строк, жадное строковое замощение (Greedy String Tiling) и т.п. Процедура токенизации
происходит следующим образом [
        <xref ref-type="bibr" rid="ref5">7</xref>
        ]:
∙ определяются классы операторов и им назначаются коды. Всем операторам языка (не являющимся
операндами) присваиваются соответствующие коды классов
∙ строится строка полученных кодов (токенов), при этом последовательность кодов соответствует
порядку появления операторов в коде.
      </p>
      <p>
        Недостатком методов, в основе которых лежит токенизация является зависимость от конкретного языка
программирования, однако эту проблему можно решить путем создания различных наборов, не
пересекающихся кодов для различных классов языков, что усложняет процесс автоматизированной проверки, т.к.
добавляется необходимость определения языка, при том, что существуют операторы, которые присущи
разным языкам. Еще одним видом методов выявления плагиата, являются методы с использованием метрик.
Они используют совокупность количества циклов, переменных, условий или их количества по
отдельности. В данных методах нет привязки к языку программирования. Однако недостатком является высокий
уровень ложных срабатываний при проверки небольших программ. Проанализировав различные подходы
к выявлению плагиата предлагается метод на основе метрик, а именно, на основе метрик сложности
Холстеда, Джилба. Метрики Холстеда строятся на большом количестве показателей таких как: ко-личество
уникальных операторов программы, количество уникальных операндов программы, общее количество
операторов, общее количество операндов, теоретическое количество уникальных операторов и теоретическое
количество уникальных операн-дов. На основе этих показателей вычисляются: уровень качества
программирования, сложность понимания программы, трудоемкость кодирования программы, уровень языка
выражения, информационное содержание программы и оценка интеллектуальных усилий при разработке
программы [
        <xref ref-type="bibr" rid="ref6">8</xref>
        ]. Метрика Джилба определяет сложность ПО по насыщенности кода программы
условными операторами или операторами цикла. CL – абсолютная сложность, как количество операторов условия,
cl – относительная сложность программы, как насыщенность кода операторами условия, т. е. cl=CL/n, где
n – общее количество операторов [
        <xref ref-type="bibr" rid="ref6">8</xref>
        ]. Процедуру выявления плагиата можно разделить на два этапа:
подготовка кода программы для дальнейшей работы с ним и определение является ли программа
плагиатом. Алгоритм подготовки данных [
        <xref ref-type="bibr" rid="ref7">9</xref>
        ]: Программа представляется в виде точки на n-мерном пространстве,
каждая i-я координата которой — это некоторая количественная характеристика. Для вычисления
координат было предложено использовать метрики оценки качества ПО и количество используемых в программе
операторов цикла. Алгоритм выявления плагиата [
        <xref ref-type="bibr" rid="ref7">9</xref>
        ]:
2. Представляем программу, с которой мы хотим сравнить подозреваемую программу B(x1, x2, . . . , xn),
где xi — значение количественной метрики;
3. Размещаем полученные точки на n-мерном пространстве
      </p>
      <p>Апробация
В качестве тестового множества были взяты программы, написаны студентами Омского государственного
университета им.Ф.М. Достоевского в ходе выполнения лабораторных работ по курсу «Криптографические
методы защиты информации». Каждая программа представляет собой реализацию, какого-либо
криптографического алгоритма, начиная от простейшего шифра Цезаря (100 – 150 строк программного кода),
заканчивая более сложным блочными шифрами. В общей сложности было обработано более 70 программ.
Было сформировано семейство из семи множеств, каждое из которых представляло собой набор программ
выполненных одним студентом, вида: X01.cs; X02.cs; X03.cs; X04.cs; X05.cs; X06.cs; X07.cs, X01.cs — это
исходный код программы на языке C #. Элементы множеств сравнивались попарно «каждый с каждым»,
кроме того, проводилось сравнение «каждый с каждым» и внутри самих множеств, с целью проверить
насколько будут «похожи» между собой программы, написанные одним и тем же человеком. Для
проведения апробации предлагаемого метода выявления плагиата было реализовано два приложения: первое –
для подробного анализа кода, без проверки на плагиат; второе -– для вычисления основных
количественных характеристик, на основе которых происходит проверка на плагиат. На рис. 1 показан результат
подробного анализа исходного кода программы, который может анализироваться человеком для
выявления плагиата в ручном режиме или для проверки корректности работы программы выявляющей плагиат
в автоматическом режиме. На рис. 3 представлен результат обработки тестового множества, показаны
основные характеристики исходных кодов программы из него. F01.cs и K01.cs, F02.cs и K02.cs и т.п. –
это исходные коды программы решающие одинаковые задачи и написанные разными студентами. После
выполнения обработки тестового множества выбираются программы, которые необходимо проверить на
плагиат, сравнение будет проводиться по принципу «каждый с каждым».</p>
      <p>Рис. 1: Подробный анализ исходного кода
На рис. ?? представленным результаты работы алгоритма выявления плагиата. В результатах
показывается, какие программы сравнивались и их схожестью в процентах. Проанализируем результаты
проверки. Возьмем пару F01.cs и K01.cs, это программы решающие одну и ту же задачу, но написанные
Рис. 2: Результат обработки тестового множества
разными студентами имеют схожесть менее 50% (48,15%). При этом известно, что программы реализуют
один из простейших криптографических алгоритмов, шифр Цезаря, поэтому их размер невелик, F01.cs -–
175 строк кода, K01.cs – 168 строк кода. Как было отмечено ранее, недостатком методов выявления
плагиата на основе метрик является высокий уровень ложных срабатываний, при проверки небольших программ
исходя из этого и можно говорит, что при схожести менее 50% программы будут оригинальными. Так же
анализируем другие пары.</p>
      <p>
        Рис. 3: Результаты работы алгоритма выявления плагиата
Анализ результатов и выводы
В работе был предложен метод выявления плагиата в исходном коде программ на основе математических
метрик сложности. С целью апробации предлагаемого метода было реализовано два приложения: первое –
для подробного анализа кода, без проверки на плагиат; вторая -– для вычисления основных
количественных характеристик, на основе которых происходит проверка на плагиат. Оба реализованных приложения
справились с поставленными задачами.
Список литературы
[
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] Software measurement URL: http://www.uio.no/studier/emner/matnat/ifi/INF5181/h11/
undervisningsmateriale/reading-materials/Lecture-06/morasca-handbook.pdf (дата обращения:
04.04.17).
[2] Measuring the dificulty of code comprehension tasks using software metrics URL:
confpapers/CRPITV136Kasto.pdf (дата обращения: 04.04.17).
http://crpit.com/
[3] Mrinal Kanti Debbarma, Swapan Debbarma, Nikhil Debbarma, Kunal Chakma, and Anupam Jamatia A
Review and Analysis of Software Complexity Metrics in Structural Testing International Journal of Computer
and Communication Engineering. - 2013. - №2 .
[6] Ступенчатый метод проверки исходного кода программы на плагиат URL: http://nauchkor.ru/pubs/
stupenchatyy-metod-proverki-ishodnogo-koda-programmy-na-plagiat-587d36555f1be77c40d58cf6
(дата обращения: 20.04.17).
Detection of Plagiarism of the Software Source Code Using the Mathematical
Metrics of Complexity
      </p>
      <p>Anton N. Mironenko</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <article-title>Представляем программу, которая подозревается в плагиате в виде точки A(x1</article-title>
          ,
          <fpage>x2</fpage>
          , . . . , xn),
          <source>где xi - значение количественной метрики;</source>
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          4.
          <article-title>Определяем расстояние между точками A(x1</article-title>
          ,
          <fpage>x2</fpage>
          , . . . , xn) и B(
          <year>x1</year>
          ,
          <fpage>x2</fpage>
          , . . . ,
          <article-title>xn) в пространстве, если оно мало, то можно говорить, что подозреваемая в плагиате программа проверку не прошла</article-title>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>Software</given-names>
            <surname>Quality</surname>
          </string-name>
          <article-title>Metrics: Three Harmful Metrics and Two Helpful Metrics URL</article-title>
          : http://www.ppi-int.com/ systems-engineering/free/\%20resources/Software\%
          <source>20Quality\%20Metrics\%20Capers\%20Jones\ %20120607.pdf (дата обращения: 20.04</source>
          .17).
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          <article-title>[5] Определение плагиата в исходном коде работ студентов Молодежный научный форум: Технические и математические науки: электр. сб. ст. по материалам VII студ</article-title>
          . междунар. заочной науч.-практ. конф. - М.: «МЦНО».
          <article-title>- 2013 -№ 7(7</article-title>
          ) URL: https://nauchforum.ru/archive/MNF_social/7(
          <issue>7</issue>
          ).pdf .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          <article-title>[7] Обзор алгоритмов обнаружения плагиата в исходных кодах программ URL: http://rain</article-title>
          .ifmo.ru/cat/ data/theory/unsorted/plagiarism-2006
          <source>/article.pdf (дата обращения: 19.04</source>
          .17).
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          <article-title>[8] Метрики сложности кода</article-title>
          .
          <source>Технический отчет</source>
          <year>2012</year>
          -2 URL: http://www.ispras.ru/preprints/docs/ prep_25_
          <year>2013</year>
          .pdf (дата обращения:
          <volume>19</volume>
          .
          <fpage>04</fpage>
          .17).
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>А.</given-names>
            <surname>Н</surname>
          </string-name>
          .
          <article-title>Мироненко Метод определения заимствований в программном коде с использованием его метрик сложности Информационная безопасность и защита персональных данных. Проблемы и пути их решения: Материалы VIII Всероссийской научно-практической конференции</article-title>
          .
          <source>Брянск: БГТУ</source>
          ,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>