Основы разработки программ на языке С++ для систем информационной безопасности
Покупка
Основная коллекция
Тематика:
Программирование на C и C++
Издательство:
Южный федеральный университет
Год издания: 2020
Кол-во страниц: 152
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-9275-3521-7
Артикул: 756653.01.99
Изложены необходимые для освоения курса сведения - краткий конспект лекций, методические указания к выполнению лабораторных работ, индивидуального задания, а также образцы тестовых вопросов. Направление подготовки 120700 «Защита информации».
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное автономное образовательное учреждение высшего образования «ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ» Инженерно-технологическая академия С. Л. БЕЛЯКОВ А. В. БОЖЕНЮК М. В. ПЕТРЯЕВА ОСНОВЫ РАЗРАБОТКИ ПРОГРАММ НА ЯЗЫКЕ С++ ДЛЯ СИСТЕМ ИНФОРМАЦИОННОЙ БЕЗОПАСНОСТИ Учебное пособие Ростов-на-Дону - Таганрог Издательство Южного федерального университета 2020
УДК 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
СОДЕРЖАНИЕ ВВЕДЕНИЕ............................................. 5 1. КАЧЕСТВО ПРОГРАММ................................. 7 1.1. Правильность программы......................... 7 1.2. Надёжность программы........................... 9 1.3. Время получения результата.................... 10 1.4. Используемые ресурсы.......................... 10 1.5. Защита........................................ 11 2. ОСНОВНЫЕ ЭТАПЫ РАЗРАБОТКИ ПРОГРАММ............... 13 3. АЛГОРИТМИЗАЦИЯ................................... 17 4. ИСПОЛНЕНИЕ ПРОГРАММ.............................. 22 5. СТРУКТУРА ПРОГРАММЫ НА C++...................... 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 3
Содержание 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
ВВЕДЕНИЕ Программы определяют поведение и свойства любых информационных систем. От того, насколько эффективно работает программное обеспечение, зависит безопасность всякой системы, использующей компьютер. Поэтому важно представлять базовые механизмы, которые определяют свойства разрабатываемых программ. Эти свойства зависят от многих факторов, начиная от используемого языка программирования, набора технологических приемов программирования, и заканчивая уровнем организации команды программистов, реализующей проект. Данное учебное пособие предназначено для освоения современных принципов программирования, используя для этого язык С++. Это объясняется следующим. Язык С++ впитал в себя многие особенности современных языков программирования, позволяющие использовать его в чрезвычайно разнообразных областях. Такими областями являются встроенные системы управления оборудованием, системы телекоммуникаций, мобильные устройства, клиенты и серверы Интернет, информационные системы в экономике и бизнесе. Языковые возможности С++ таковы, что позволяют создавать программы как низкого, так и высокого уровня. Под низким уровнем понимают реализацию алгоритмов системного уровня, которые не зависят от прикладных задач. Примером подобного программирования могут быть алгоритмы шифрования, контроля доступа к информационным ресурсам. Под высоким уровнем программирования понимают реализацию задач специфического характера. Например, систем электронной коммерции в Интернет. Компоненты систем такого типа представляют на страницах Интернет товары и услуги, осуществляют рекламные функции, выполняют электронные платежи. Технологии разработки программ на С++ поддерживаются программными инструментами, разработанными для разных операционных систем. Практически любая современная операционная система имеет компилятор для языков С или С++. Многие из операционных систем поставляются в виде исходных текстов, написанных на этих языках. Методика оценки популярности базируется на статистике поисковых запросов к наиболее популярным поисковым системам Google, Yahoo, 5
Введение 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% Данное учебное пособие не описывает язык С++. Этому посвящен ряд учебников. Качество конечного результата программирования - программы - зависит от большого числа факторов, среди которых язык не считается определяющим. Поэтому использование С++ носит, скорее, иллюстративный характер. Основной целью пособия является изучение общих особенностей программирования на алгоритмических языках, влияющих на безопасность программных продуктов.
1. КАЧЕСТВО ПРОГРАММ Реально используемая программа должна обладать требуемым качеством. Эксплуатация некачественной программы таит в себе опасность появления ущерба. Следовательно, уровень безопасности программы или системы программ оценивается степенью соответствия тому уровню качества, который диктуется областью применения. Установить требуемый уровень качества - задача непростая. Понятие качества в значительной степени зависит от прикладной области. Качество зависит от набора частных показателей (параметров), которые зачастую трудно оценить. Кроме того, поведение отдельных показателей по-разному влияет на общий показатель. Это заставляет искать компромиссные варианты сочетания параметров, в которых улучшение по одним компенсируется ухудшением по другим. Всякая программа обладает набором параметров качества. Рассмотрим наиболее часто употребляемые на практике. 1.1. Правильность программы Правильной считается та программа, которая соответствует исходному заданию на разработку (спецификации, рис. 1). Степень соответствия может оцениваться как количественно, так и качественно. Количественная оценка может даваться в процентах. Например, правильная на 50 % программа соответствует только половине заданных требований. Легко видеть, что такой способ измерения правильности не дает полного представления о качестве программы. Может оказаться не выполненным настолько важное требование, что оцениваемая программа окажется совершенно бесполезной либо чрезвычайно опасной. Качественные оценки правильности - это выражения вида «соответствует», «почти соответствует», «слабо соответствует», «не соответствует» и т.д. Правила качественной оценки оказываются на практике достаточно сложными и зависят от ряда количественных оценок. Например, программа может классифицироваться как «слабо соответствующая» спецификации, если не выполнено хотя бы одно из важных требований либо не соблюдается достаточно много некоторых специальных ограничений. 7
1. Качество программ Рис. 1. Соответствие программы требованиям Задача оценки степени соответствия спецификации трудоемка. Чтобы убедиться в правильности программы, разрабатывают тесты. Всякий тест включает в себя описание того, что нужно знать и сделать для заключения о правильности программы. Тест содержит: 1. описание состояния программы, в котором предполагается проверить то или иное требование спецификации; 2. указание входных данных или воздействий, которым подвергается программа или система в целом; 3. описание требуемого результата или поведения, которое должно наблюдаться в случае соответствия спецификации. Принципиальной трудностью проверки правильности является изменение спецификации в ходе разработки. На практике исходное задание перед началом разработки имеет ряд неопределенностей, которые уточняются по ходу работы. Такой процесс следует считать объективным ввиду сложности решаемых задач. Большинство разработчиков проводят неофициальное тестирование, когда пишут свои программы. После написания части кода (функции, класса или фрагмента кода) разработчик пишет некий код для проверки только что добавленной части, и, если тест пройден успешно, разработчик удаляет код этого теста. При тестировании стоит нацеливаться на 100%-ное покрытие кода, ветвлений и циклов. Термин «покрытие кода» относится к количеству исходного кода программы, который был задействован во время тестирования. Термин «покрытие ветвлений» относится к проценту ветвлений, которые были выполнены в каждом случае (положительном и отрицательном) 8
1.2. Надёжность программы отдельно. Покрытие циклов (неофициально называемый «тест 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 строк кода. 9
1. Качество программ Рис. 2. Поведение вероятности отказа программы 1.3. Время получения результата Данный показатель может иметь несколько интерпретаций и, соответственно, способов измерения. Если используют такой показатель, как время реакции программы на внешнее событие, то временем получения результата считается интервал между изменением входных данных и соответствующим изменением выходных. Время реакции важно для систем реального времени: программы должны формировать результат в темпе, соответствующем изменениям внешней среды. Если область использования программы такова, что важно среднее время получения результата, оценивают производительность (пропускную способность) программы. Производительность определяется как количество данных или задач определенного типа, обрабатываемых программой в единицу времени. Показатель времени получения результата может быть получен либо расчетным путем, либо экспериментально. В последнем случае применяются тесты производительности, состоящие из «смеси» данных разных типов. Подготовка таких данных является ответственной задачей, поскольку неадекватность тестов приводит к ошибке оценки. 1.4. Используемые ресурсы Всякая программа использует оперативную память, специализированные процессоры, память внешних устройств, пропускную способность канала связи и сетевые серверы (рис. 3). Эти объекты относят к ресурсам. 10