ВВЕДЕНИЕ 5
1. Диверсификация 8
1.1. Виды диверсификации и сферы применения 8
1.2. Техники диверсификации 9
1.3. Вывод 12
2. Мультиверсионное программирование 13
2.1. Модель мультиверсионного программного обеспечения 13
2.2. Алгоритмы голосования 14
2.3. Примеры алгоритмов голосования 15
2.3.1. Усреднённое голосование 15
2.3.2. Формализованные алгоритмы голосования 15
2.2.3. Классические алгоритмы голосования 16
2.3. Вывод 18
3. Модель акторов и её применение к NVP 19
3.1. Модель акторов 19
3.2. Применение модели акторов к NVP 22
4. Кодогенерационная модель 23
4.1. Исходная модель: диаграммы деятельности 23
4.1.1. Язык описания диверсифицированных вызовов 28
4.2. Промежуточная модель 30
4.3. Процесс кодогенерации 34
4.4. Вывод 39
5. Разработка инструментария 39
5.1. Микрофреймворк Zmok 41
5.2. Классы утилит, модуль Hydra.Utils 43
5.3. Ядро системы, модуль Hydra.Core 44
5.3.1. Обобщённая модель графа 44
5.3.2. Модель диаграммы деятельности 45
5.3.3. Промежуточная модель 49
5.3.4. Модуль диверсификации: банк алгоритмов и контекст
диверсификации 51
5.4. Редактор 52
5.4.1. Система событий 52
5.4.2. Модификация редактора графов 55
5.4.3. Пример работы программы 60
5.5. Вывод 62
ЗАКЛЮЧЕНИЕ 63
СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ 64
В современном информационном мире, когда активно автоматизируются многие сферы человеческой деятельности, надёжность становится критическим свойством программного обеспечения. Незапланированный отказ ПО может привести к потере доходов (например, из-за простоя сайта интернет-магазина или биржевого робота), а то и вовсе гибели большого числа людей (из-за отказа АСУ АЭС или сбои в ПО медицинского оборудования [1]).
Один из способов обеспечения надёжности — избыточность. То есть запуск нескольких копий программы, работающих параллельно. Таким образом, отказ одной копии не вовлечёт за собой отказ всей системы. Однако у такого подхода есть один недостаток — если в системе изначально была заложена ошибка, то высока вероятность, что все копии откажут одновременно. Этого можно избежать с помощью мультиверсионного программирования (N-Version Programming, NVP) [2].
Мультиверсионное программирование - способ обеспечения избыточности программного обеспечения, при котором все экземпляры ПО (либо его модулей) отличаются друг от друга, то есть диверсифицированы.
Традиционный подход к диверсификации ПО, при котором каждую версию разрабатывает отдельная команда, весьма дорогостоящ, а в случае, когда диверсификация применяется как способ повысить защищённость ПО, и вовсе бессмысленна. Автоматическая диверсификация ПО и модулей из спецификаций или моделей позволяет избавиться от этих трат.
Существующие системы диверсификации:
• Дополнения (skins) к Valgrind, например, RISE (Randomized Instruction Set Emulation),
• Некоторые DRM-системы, например, Denuvo,
• Project Diversify. Набор инструментов, разработанный INRIA и IRISA.
В работе рассматривается проблема генерации программного кода по модели с учётом специфики диверсифицированного программного обеспечения.
Проблема является актуальной в связи с тем, что практически не существует инструментов автоматизированной кодогенерации, учитывающих специфику мультиверсионного программирования, а именно диверсификацию и стратегию выбора (алгоритм голосования). Существует лишь небольшое количество таких работ: Project Diversify, разрабатываемый французскими институтами INRIA и IRISA, который не поддерживает NVP, и инструмент, разрабатываемый Д.В. Грузенкиным, который на данный момент находится в разработке [3].
Объектом диссертационного исследования является мультиверсионное программное обеспечение.
Предмет исследования - генерация программного кода с учётом диверсификации.
Цель диссертационного исследования состоит в разработке инструментария кодогенерации мультиверсионного программного обеспечения из графической модели описания (UML диаграмма деятельности).
Научная новизна работы заключается в разработке кодогенерационной модели, а также применении модели акторов к NVP.
В главе 1 описывается процесс диверсификации, её виды, сферы применения и техники диверсификации программного обеспечения.
В главе 2 рассматривается методология мультиверсионного программирования. Рассматриваются алгоритмы голосования такие, как усреднённое голосование, формализованные алгоритм голосования абсолютным большинством и алгоритм голосования абсолютным большинством.
В главе 3 описывается модель акторов, а также предлагается модифицированная структурная модель мультиверсионного программного обеспечения с применением акторов.
В главе 4 рассматривается процесс кодогенерации, ограниченное подмножество диаграммы деятельности UML, описывается разработанная промежуточная модель.
В главе 5 описывается разработанный инструментарий для генерации диверсифицированного программного кода из диаграммы деятельности
В ходе работы были изучены виды и способы диверсификации, изучена методология разработки мультиверсионного программного обеспечения, изучена модель акторов, и предложено применение модели акторов к разработке мультиверсионного программного обеспечения. Была разработана модель кодогенерации из UML диаграмм деятельностей с учётом специфики NVP. Был разработан программный инструментарий для кодогенерации диверсифицированного кода из диаграммы деятельности.