Дипломная работа: Оценка возможностей применения инструментов статического анализа в учебном процессе для проверки решений задач по программированию

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Hexlet

Hexlet -- это открытая веб-платформа для обучения программированию, предлагающая короткие курсы длительностью в несколько часов для разработчиков программ, от новичков до профессионалов. Все учебные программы состоят из двух частей: теоретической и практической.

JavaRush

JavaRush обучает программированию на Java в форме онлайн-игры. Курс JavaRush содержит 1200 практических задач возрастающей сложности.

Javascript.ru

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

ITVDN

Ресурс для онлайн-обучения программированию, предлагающий не только видеоуроки для самостоятельного просмотра, но и бесплатные сервисы, позволяющие формировать практические навыки написания кода. Каждый пользователь имеет возможность формировать практические навыки с помощью Тренажера.

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

1.3 Обзор инструментов статического анализа

Перед тем, как приступать к выбору инструментов статического анализа, стоит определить основные критерии, которыми они должны обладать:

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

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

Свободное применение, неограниченное лицензией

По перечисленным критериям проведен отбор инструментов статического анализа по реестрам [5, 6]. Отбор сузил выбор до следующих инструментов:

coala - «из коробки» поддерживает более 60 языков прогаммирования, возможно расширение за счет модулей (так называемых Bears),

сqc - поддерживает только форматы js, jsx, vue, css, less, scss, sass and styl,

graudit - использует регулярные выражения для поиска ошибок,

Infer - поддерживает только языки Java, C and Objective-C,

oclint - поддерживает только языки C, C++ and Objective-C,

PMD - поддерживает только языки Java, Javascript, PLSQL, XML, XSL,

SonarQube - расширения для некоторых языков программирования, таких как C/C++, распространяются платно,

TscanCode - поддерживает только языки C/C++, C#, Lua, слабая поддержка.

Следует отметить, что работа статических анализаторов может быть основана на двух методах:

Поиск на основе регурярных выражений,

Анализ грамматики языка.

Поиск на основе регулярных выражений более прост в реализации по сравнению с анализом грамматики, но и возможности его значительно ограничены по сравнению со вторым вариантом. [7]

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

Выбор остановился на инструменте coala [8]. Он поддерживает более 60 языков прогаммирования, с возможностью расширения за счет модулей, которые представляют собой высокоуровневые адаптеры для известных инструментов статического анализа. Это позволяет абстрагироваться от реализации конкретных модулей - они могут работать как на основе регулярных выражений, так и на основе дерева разбора. coala предоставляет универсальный интерфейс для работы с модулями через командную строку.

1.4 Функции системы

Анализируя функции системы, можно выделить следующие:

Отправка решения на проверку статическим анализатором. При этом статический анализ должен выполняться только в случае успешной компиляции и проверки решения на корректность вывода

Сохранение результатов статического анализа в БД

Возможность просмотра результатов статического анализа пользователем через web-интерфейс

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

В данной главе был выполнен анализ предметной области. Дано определение и свойства статического анализа программного кода. Рассмотрены его преимущества и недостатки в сравнении с динамическим анализом. Рассмотрены основные типы ошибок дизайна программного кода. Проведен обзор наиболее популярных существующих на рынке систем дистанционного обучения программированию и их изучение на предмет наличия функции статического анализа решений. Проанализированы существующие средства статического анализа и выбрано средство для применения в диссертации.

2. Проектирование

2.1 Диаграмма вариантов использования

На основе технического задания была построена диаграмма вариантов использования. Она изображена на рисунке 1.

Рисунок 1 - Диаграмма вариантов использования

2.2 Пользовательский интерфейс

На рисунке 2 представлен макет страницы просмотра решения.

Рисунок 2 - Макет страницы просмотра решения

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

На рисунке 3 представлен макет панели администратора.

Рисунок 3 - Макет панели администратора

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

Должна быть реализована возможность отключения анализа выбранным модулем в связке с компилятором, а также отключения отображения результатов проверки выбранным модулем в связке с компилятором пользователю на странице просмотра решения.

2.3 Архитектура системы

Рассмотрим существующую архитектуру дистанционного практикума по программированию, изображенную на рисунке 4. [9]

Рисунок 4 - Существующая архитектура системы

Непосредственно проверкой решений и управлением статусом решений занимается приложение main_mod. Необходимо обеспечить после основной проверки решения в этом приложении проверку решения статическим анализатором. С целью минимизации вмешательства в существующую систему было принято решение реализовывать проверку статическим анализатором в отдельном приложении.

Для разработки выбран язык Java с применением фреймворка SpringBoot [10], так как эти технологии позволят свести к минимуму написание низкоуровневого кода для интеграции модуля в существующую систему.

Стоит сразу определиться с решениями для интеграции модуля в систему. Во-первых, поскольку подсистема должна обеспечить отображение результатов статического анализа на web-клиенте и управление из панели администратора, система будет предоставлять соответствующие сервисы по технологии REST. Во-вторых, необходимо интегрировать модуль с приложением main_mod для запуска статического анализа по окончанию основной проверки решения. Было принято решение использовать протокол обмена сообщениями AMQP. Реализации клиентских модулей для этого протокола существуют и для C++, на котором разработано приложение main_mod, и для Java. Для работы приложения с БД будет использована технология JDBC.

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

Рисунок 5 - Архитектура дорабатываемой системы

2.4 Проектирование прикладных приложений

Приложение main_mod

Доработка приложения заключается в том, чтобы после успешной проверки решения, необходимо направить уведомление подсистеме статического анализа. В качестве AMQP-клиента будет использована библиотека SimpleAmqpClient [11].

AMQP-брокер

В качестве AMQP-брокера будет выступать RabbitMQ [12]. ПО разработано на языке Erlang, поэтому помимо самого брокера в системе должен быть установлен дистрибутив Erlang/OTP.

Приложение статического анализа.

Как уже упоминалось ранее, приложение должно обеспечивать поддержку технологий REST, JDBC и AMQP. Весь стек необходимых технологий покрывается библиотеками Spring - spring-boot-starter-amqp, spring-boot-starter-web, spring-boot-starter-data-jpa, а также драйвером JDBC для БД Firebird - jaybird-jdk18. Для функционирования приложения в системе должен быть установлен дистрибутив JDK 1.8.

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

Прикладная архитектура приложения представлена на рисунке 6.

Рисунок 6 - Прикладная архитектура приложения статического анализа

1. AMQP-слушатель

Задача AMQP-слушателя - принять уведомление о завершении проверки решения на корректность, выполнить статический анализ решения и сохранить результат в БД.

Статический анализатор coala вызывается слушателем посредством команды на запуск исполняемого файла. На вход программы помимо исходного текста необходимо передать список модулей, которые будут задействованы при проверке решения. Список этих модулей может настраиваться администратором, поэтому перед проверкой нужно получить его из БД.

Результат выполнения статического анализа представляет собой JSON-объект следующего вида:

[

{

"additional_info": "",

"affected_code": [

{

"end": {

"column": 9,

"file": "/home/pavel/Desktop/DbSeeder.java",

"line": 112

},

"file": "/home/pavel/Desktop/DbSeeder.java",

"start": {

"column": 9,

"file": "/home/pavel/Desktop/DbSeeder.java",

"line": 112

}

}

],

"aspect": "NoneType",

"confidence": 100,

"debug_msg": "",

"diffs": null,

"id": 36314598184926129066205396129825355428,

"message": "Each variable declaration must be in its own statement.",

"message_arguments": {},

"message_base": "Each variable declaration must be in its own statement.",

"origin": "CheckstyleBear (MultipleVariableDeclarations)",

"severity": 1

},

...

]

С целью упрощения развертывания и снижения влияния на окружение, приложение coala будет запускаться в изолированной среде virtualenv, которая требует наличия в хост-системе дистрибутива Python.

2. REST-контроллеры

REST-контроллеры обслуживают пользовательские запросы. В зависимости от того, какую роль имеет пользователь, ему должны быть доступны:

1) Пользователь - сервис получения списка ошибок по конкретному решению.

2) Администратор - получение списка компиляторов в связке с включенными для них модулями coala, отключение анализа конкретным модулем в зависимости от компилятора, отключение отображения результатов анализа конкретным модулем в зависимости от компилятора.

Доступ к REST-контроллерам будет защищен механизмом Spring Security.

2.5 Проектирование web-клиента

Страница просмотра решения

Список найденных ошибок должен подгружаться на страницу динамически при раскрытии соответствующей панели. Это позволит сэкономить ресурсы, когда пользователь открывает страницу решения без цели просмотра результатов статического анализа. Для этого, а также для реализации раскрывающегося списка будет использована библиотека jQuery [13] с набором компонентов jQueryUI. jQueryпозволяет работать с DOM-моделью страницы, динамически изменяя ее содержимое, а также отправлять запросы XMLHttpRequest к REST-сервисам.

Динамическая загрузка списка проверяющих модулей по компиляторам будет также реализована при помощи jQuery.

Доработка обработчиков Perl

Во-первых, необходимо доработать обработчики отрисовки страницы просмотра решения и страницы администрирования. На страницы будут добавлены необходимые компоненты и JavaScript-код, подключена библиотека jQuery.

Во-вторых, необходимо реализовать механизм аутентификации в подсистеме статического анализа, поскольку заголовок Authorization, содержащий логин и пароль пользователя и сохраняющийся в сессии на уровне браузера недоступен из JavaScript-кода. Эту проблему можно решить сохранением сессии в cookies. Таким образом, необходимо в Perl-скрипт аутентификации добавить вызов к сервису подсистемы статического анализа, передав оригинальный заголовок Authorization. Если переданные в заголовке данные корректны, сервис создаст сессию пользователя на сервере и вернет присвоенный сессии cookieJSESSIONID. Далее этот cookie необходимо передать из Perl-обработчика клиенту.

2.6 Проектирование структуры данных

Логическая схема имеющейся базы данных изображена на рисунке 7. [14]

Рисунок 7 - Логическая схема БД

Основной интерес для проекта представляют таблицы STATUS и COMPIL, выделенные на схеме.

COMPIL - компиляторы. Атрибуты:

ID_CMP- идентификатор компилятора;

NAME- название компилятора.

STATUS - таблица с присланными решениями. Атрибуты:

ID_STAT- идентификатор решения;

DT_TM - дата и время получения системой решения;

ID_PUBL - идентификатор пользователя, приславшего решение;