Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы разработки программ на языке С++ для систем информационной безопасности. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
1
С. Л. БЕЛЯКОВ А. В. БОЖЕНЮК М. В. ПЕТРЯЕВА
НА ЯЗЫКЕ С++ ДЛЯ СИСТЕМ
ИНФОРМАЦИОННОЙ БЕЗОПАСНОСТИ
Учебное пособие
Ростов-на-Дону – Таганрог
Издательство Южного федерального университета
2020
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ
РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное
образовательное учреждение высшего образования
«ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
Инженерно-технологическая академия
Содержание
2
УДК 004.438:004.056 (075.8) ББК 32.973-018.1я73
Б448
Печатается по решению кафедры информационно-аналитических
систем безопасности Института компьютерных технологий
и информационной безопасности Южного федерального университета
(протокол № 5 от 20 февраля 2020 г.)
Рецензенты:
доктор технических наук, профессор, заведующий кафедрой информатики
Таганрогского института имени А. П. Чехова (филиал) «Ростовского
государственного Экономического университета (РИНХ)» Я. Е. Ромм
кандидат технических наук, доцент кафедры систем автоматического
управления РСУ ЮФУ О. В. Косенко
Беляков, С. Л.
Б448 Основы разработки программ на языке С++ для систем информа-
ционной безопасности : учебное пособие / С. Л. Беляков, А. В. Боже­нюк, М. В. Петряева ; Южный федеральный университет. – Ростов-на­Дону ; Таганрог : Издательство Южного федерального университета,
2020. – 152 с. ISBN 978-5-9275-3521-7
Изложены необходимые для освоения курса сведения – краткий кон-
спект лекций, методические указания к выполнению лабораторных работ, ин­дивидуального задания, а Иакже образцы тестовых вопросов. Направление подготовки 120700 «Защита информации».
УДК 004.438:004.056 (075.8)
ББК 32.973-018.1я73
ISBN 978-5-9275-3521-7
© Южный федеральный университет, 2020 © Беляков С. Л., Боженюк А. В., Петряева М. В., 2020 © Оформление. Макет. Издательство. Южного федерального университета, 2020
Содержание
3
СОДЕРЖАНИЕ
ВВЕДЕНИЕ …………………………………………………………...
5 7 1.1. Правильность программы …………………………………….
7
1.2. Надёжность программы ………………………………………
9
1.3. Время получения результата …………………………………
10
1.4. Используемые ресурсы ………………………………………..
10
1.5. Защита ………………………………………………………….
11
2. ОСНОВНЫЕ ЭТАПЫ РАЗРАБОТКИ ПРОГРАММ …………
13
3. АЛГОРИТМИЗАЦИЯ ……………………………………………..
17
4. ИСПОЛНЕНИЕ ПРОГРАММ ……………………………………
22
5. СТРУКТУРА ПРОГРАММЫ НА С++ …………………………
24
5.1. Поточный ввод-вывод в C++ …………………………………
27
5.2. Вывод информации ……………………………………………
28
5.3. Ввод информации ……………………………………………...
28
5.4. Ввод символьных строк ……………………………………….
28
5.5. Манипуляторы потока ………………………………………...
28
6. ПЕРЕМЕННЫЕ ПРОГРАММЫ И ОБЛАСТИ ИХ ДЕЙСТВИЯ
32
7. ТИПЫ ДАННЫХ …………………………………………………
34
7.1. Символьный тип ………………………………………………
35
7.2. Числовые типы ………………………………………………...
37
7.3. Преобразование типов данных в С++ ………………………..
41
7.4. Неявное преобразование типа ………………………………...
41
7.5. Числовое расширение …………………………………………
42
7.6. Числовая конверсия …………………………………………...
42
7.7. Обработка арифметических выражений ……………………..
42
7.8. Приоритет типов операндов …………………………………..
43
7.9. Явное преобразование типов данных ………………………...
43
8. ПОРАЗРЯДНАЯ ОБРАБОТКА ДАННЫХ ……………………..
46
8.1. Шифрование матриц …………………………………………..
48
8.2. Шифр Вернама ………………………………………………...
49
Содержание
4
9. УКАЗАТЕЛИ ………………………………………………………
50
10. СИМВОЛЬНЫЕ МАССИВЫ И СТРОКИ ……………………
53
11. ПЕРЕДАЧА ПАРАМЕТРОВ ФУНКЦИЯМ …………………
57
12. СТРУКТУРЫ И ОБЪЕДИНЕНИЯ ……………………………
61
13. КЛАССЫ …………………………………………………………
64
14. ВВОД И ВЫВОД ИНФОРМАЦИИ В ФАЙЛЫ ……………
71
15. КЛАССЫ СТРОК И СТРОКОВЫХ ПОТОКОВ ……………
77
15.1. Конструкторы строк …………………………………………
79
15.2. Арифметические операторы …………………………………
80
15.3. Потоки ввода (istream) ………………………………………
81
16. ДАТА И ВРЕМЯ В ПРОГРАММАХ НА С++ ………………
84
17. ОБРАБОТКА ОШИБОК И ИСКЛЮЧЕНИЙ …………………
88
18. ДИНАМИЧЕСКОЕ ВЫДЕЛЕНИЕ ПАМЯТИ ………………...
94
19. ТЕСТИРОВАНИЕ ПРОГРАММНОГО КОДА ………………..
98
ЛАБОРАТОРНЫЕ РАБОТЫ ………………………………………..
102
Лабораторная работа № 1 ………………………………………….
102
Лабораторная работа № 2 ………………………………………….
105
Лабораторная работа № 3 ………………………………………….
108
Лабораторная работа № 4 ………………………………………….
109
Лабораторная работа № 5 ………………………………………….
111
ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ ………………………………….
114
Общие требования к разработке …………………………………..
114
Представление результата выполнения индивидуального зада­ния …………………………………………………………………..
121
ПРИМЕРЫ ТЕСТОВЫХ ВОПРОСОВ …………………………….
124
ЗАКЛЮЧЕНИЕ ………………………………………………………
150
СПИСОК ЛИТЕРАТУРЫ …………………………………………...
151
Введение
5
ВВЕДЕНИЕ
Программы определяют поведение и свойства любых информацион­ных систем. От того, насколько эффективно работает программное обеспе­чение, зависит безопасность всякой системы, использующей компьютер. По­этому важно представлять базовые механизмы, которые определяют свой­ства разрабатываемых программ. Эти свойства зависят от многих факторов, начиная от используемого языка программирования, набора технологиче­ских приемов программирования, и заканчивая уровнем организации ко­манды программистов, реализующей проект. Данное учебное пособие пред­назначено для освоения современных принципов программирования, ис­пользуя для этого язык С++. Это объясняется следующим.
Язык С++ впитал в себя многие особенности современных языков программирования, позволяющие использовать его в чрезвычайно разно­образных областях. Такими областями являются встроенные системы управления оборудованием, системы телекоммуникаций, мобильные устройства, клиенты и серверы Интернет, информационные системы в эко­номике и бизнесе. Языковые возможности С++ таковы, что позволяют со­здавать программы как низкого, так и высокого уровня. Под низким уров­нем понимают реализацию алгоритмов системного уровня, которые не за­висят от прикладных задач. Примером подобного программирования могут быть алгоритмы шифрования, контроля доступа к информационным ресур­сам. Под высоким уровнем программирования понимают реализацию задач специфического характера. Например, систем электронной коммерции в Интернет. Компоненты систем такого типа представляют на страницах Ин­тернет товары и услуги, осуществляют рекламные функции, выполняют электронные платежи.
Технологии разработки программ на С++ поддерживаются про­граммными инструментами, разработанными для разных операционных систем. Практически любая современная операционная система имеет ком­пилятор для языков С или С++. Многие из операционных систем поставля­ются в виде исходных текстов, написанных на этих языках.
Методика оценки популярности базируется на статистике поиско­вых запросов к наиболее популярным поисковым системам Google, Yahoo,
Введение
6
Bing, Amazon. Приведенные данные показывают, что «верхняя» часть рей-
тинга занята разновидностями языка С.
Рейтинг популярности языков программирования показывает, что
языки С и С++ в течение многих лет входят в «десятку» наиболее популяр­ных языков программирования. По данным компании TIOBE Software BV[1], в 2019 г. рейтинг языков выглядел следующим образом:
Таблица 1
Рейтинг языков программирования
Декабрь
2019
Декабрь
2018
Язык
программирования
Рейтинг
1
1
Java
17,253%
2
2 C 16,086%
3
3
Python
10,308%
4
4
C++
6,196%
5
6
C#
4,801%
6 5 Visual Basic .NET
4,743%
7 7 JavaScript
2,090%
8
8
PHP
2,048%
9
9
SQL
1,843%
10
14
Swift
1,490%
11
17
Ruby
1,314%
Данное учебное пособие не описывает язык С++. Этому посвящен
ряд учебников. Качество конечного результата программирования – про­граммы – зависит от большого числа факторов, среди которых язык не счи­тается определяющим. Поэтому использование С++ носит, скорее, иллю­стративный характер. Основной целью пособия является изучение общих особенностей программирования на алгоритмических языках, влияющих на безопасность программных продуктов.
Введение
7
1. КАЧЕСТВО ПРОГРАММ
Реально используемая программа должна обладать требуемым каче­ством. Эксплуатация некачественной программы таит в себе опасность по­явления ущерба. Следовательно, уровень безопасности программы или си­стемы программ оценивается степенью соответствия тому уровню каче­ства, который диктуется областью применения.
Установить требуемый уровень качества – задача непростая. Поня­тие качества в значительной степени зависит от прикладной области. Каче­ство зависит от набора частных показателей (параметров), которые зача­стую трудно оценить. Кроме того, поведение отдельных показателей по­разному влияет на общий показатель. Это заставляет искать компромисс­ные варианты сочетания параметров, в которых улучшение по одним ком­пенсируется ухудшением по другим.
Всякая программа обладает набором параметров качества. Рассмот­рим наиболее часто употребляемые на практике.
1.1. Правильность программы
Правильной считается та программа, которая соответствует исход­ному заданию на разработку (спецификации, рис. 1).
Степень соответствия может оцениваться как количественно, так и качественно. Количественная оценка может даваться в процентах. Напри­мер, правильная на 50 % программа соответствует только половине задан­ных требований. Легко видеть, что такой способ измерения правильности не дает полного представления о качестве программы. Может оказаться не выполненным настолько важное требование, что оцениваемая программа окажется совершенно бесполезной либо чрезвычайно опасной.
Качественные оценки правильности – это выражения вида «соответ­ствует», «почти соответствует», «слабо соответствует», «не соответствует» и т.д. Правила качественной оценки оказываются на практике достаточно сложными и зависят от ряда количественных оценок. Например, программа может классифицироваться как «слабо соответствующая» спецификации, если не выполнено хотя бы одно из важных требований либо не соблюда­ется достаточно много некоторых специальных ограничений.
1. Качество программ
8
Рис. 1. Соответствие программы требованиям
Задача оценки степени соответствия спецификации трудоемка. Чтобы убедиться в правильности программы, разрабатывают тесты. Вся­кий тест включает в себя описание того, что нужно знать и сделать для за­ключения о правильности программы. Тест содержит:
1. описание состояния программы, в котором предполагается прове-
рить то или иное требование спецификации;
2. указание входных данных или воздействий, которым подвергается
программа или система в целом;
3. описание требуемого результата или поведения, которое должно
наблюдаться в случае соответствия спецификации.
Принципиальной трудностью проверки правильности является из­менение спецификации в ходе разработки. На практике исходное задание перед началом разработки имеет ряд неопределенностей, которые уточня­ются по ходу работы. Такой процесс следует считать объективным ввиду сложности решаемых задач.
Большинство разработчиков проводят неофициальное тестирова­ние, когда пишут свои программы. После написания части кода (функции, класса или фрагмента кода) разработчик пишет некий код для проверки только что добавленной части, и, если тест пройден успешно, разработчик удаляет код этого теста.
При тестировании стоит нацеливаться на 100%-ное покрытие кода, ветвлений и циклов. Термин «покрытие кода» относится к количеству ис­ходного кода программы, который был задействован во время тестирова­ния. Термин «покрытие ветвлений» относится к проценту ветвлений, кото­рые были выполнены в каждом случае (положительном и отрицательном)
1.2. Надёжность программы
9
отдельно. Покрытие циклов (неофициально называемый «тест 0, 1, 2») со­общает, что если у вас есть цикл в коде, то, чтобы убедиться в его работо­способности, нужно его выполнить 0, 1 и 2 раза. Если он работает кор­ректно во второй итерации, то должен работать корректно и для всех по­следующих итераций (3, 4, 10, 100 и т.д.).
Модульные тесты позволяют разработчикам и тест-инженерам
быстро искать логические ошибки в методах классов для проектов на язы­ках C#, Visual Basic и C++. С помощью окна Обозреватель тестов вы мо­жете создавать и выполнять модульные тесты для C++ в программе Visual studio 2017 и в более поздних версиях.
Общее число тестов зависит от масштаба разрабатываемой про-
граммы или системы. Затраты на тестирование могут составлять до 40 % от стоимости всего проекта.
1.2. Надёжность программы
Надёжность – это способность системы работать без сбоев и отказов
в течение заданного интервала времени. Данное определение для техниче­ских систем дается ГОСТ [3]. Может показаться, что это определение не применимо к программам, поскольку программный код не подвержен дей­ствию факторов внешней среды. Однако это не так. Причиной ненадежно­сти программ являются наличие в программном коде не выявленных оши­бок. Если качественно изобразить поведение вероятности отказа про­граммы (рис. 2), то оно дает практически наблюдаемую картину: чем дольше работает программа, тем вероятней появление сбоя или отказа из­за не выявленной ошибки.
Количественно надежность характеризуют набором стандартных показателей. Трудность достоверного оценивания надежности программ в том, что ошибки проявляются на определенных сочетаниях входных дан­ных, перебрать которые полностью абсолютно невозможно. Надежность оценивается путем тестирования. Поскольку исчерпывающее тестирование невозможно, на практике иногда придерживаются некоторых эмпириче­ских правил оценки уровня надежности. Например, считается, что профес­сионально написанный программный код содержит не более 10–12 не вы­явленных ошибок на 1000 строк кода.
1. Качество программ
10
Рис. 2. Поведение вероятности отказа программы
1.3. Время получения результата
Данный показатель может иметь несколько интерпретаций и, соот-
ветственно, способов измерения.
Если используют такой показатель, как время реакции программы на
внешнее событие, то временем получения результата считается интервал между изменением входных данных и соответствующим изменением вы­ходных. Время реакции важно для систем реального времени: программы должны формировать результат в темпе, соответствующем изменениям внешней среды.
Если область использования программы такова, что важно среднее
время получения результата, оценивают производительность (пропускную способность) программы. Производительность определяется как количе­ство данных или задач определенного типа, обрабатываемых программой в единицу времени.
Показатель времени получения результата может быть получен либо расчетным путем, либо экспериментально. В последнем случае применя­ются тесты производительности, состоящие из «смеси» данных разных ти­пов. Подготовка таких данных является ответственной задачей, поскольку неадекватность тестов приводит к ошибке оценки.
1.4. Используемые ресурсы
Всякая программа использует оперативную память, специализиро­ванные процессоры, память внешних устройств, пропускную способность канала связи и сетевые серверы (рис. 3). Эти объекты относят к ресурсам.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]