
- •Тема 1.1. Структура жизненного цикла программы.
- •Тема 1.2. Критерии оценки качества по.
- •Тема 1.3. Надежность программных продуктов. Факторы надежности.
- •Тема 1.4. Виды программ, программной и эксплуатационной документации по еспд.
- •Виды программных продуктов
- •Спецификация
- •Пояснительная записка
- •Описание программы
- •Руководство системного программиста
- •Руководство программиста
- •Руководство оператора
- •Текст программы
- •Раздел 2. Технологические методы и средства разработки качественного по.
- •Тема 2.1. Приемы надежного программирования.
- •Тема 2.2. Стиль программирования.
- •Тема 2.7. Объектно-ориентированное программирование.
- •Тема 2.8. Эффективность программ
- •Тема 2.9. Оптимизация программ. Оптимизирующие компиляторы.
- •Раздел 3. Отладка и сопровождение программных продуктов.
- •Тема 3.1. Ошибки по: причины, источники и классификация.
- •Тема 3.2. Защитное программирование.
- •Проверяйте все данные из внешних источников
- •Старайтесь не помещать выполняемый код в утверждения
- •Не используйте исключения по мелочам
- •Генерируйте исключения на правильном уровне абстракций
- •Вносите в описание исключения всю информацию о его причинах
- •Избегайте пустых блоков catch
- •Выясните, какие исключения генерирует используемая библиотека
- •Стандартизуйте использование исключений в вашем проекте
- •Преобразовывайте входные данные к нужному типу в момент ввода
- •Не применяйте ограничения промышленной версии к отладочной версии автоматически
- •Внедрите поддержку отладки как можно раньше
- •Используйте наступательное программирование
- •Используйте встроенный препроцессор
- •Напишите собственный препроцессор
- •Тема 3.3. Отладка – типы, методы и инструментальные средства.
- •Тема 3.7. Доказательное программирование. Верификация основных структур
- •Тема 3.8. Корректность программного обеспечения
- •Тема 3.9. Поставка программных средств на производство
- •Тема 3.10. Технические, программные и криптографические средства защиты информации
- •Раздел 4. Юридические основы создания и использования программного изделия
- •Тема 4.1. Защита авторских прав. Лицензирование программного изделия
- •Авторское право. Терминология
- •Имущественные права
- •Личные неимущественные права
- •Исключения и ограничения в авторском праве
- •Срок действия авторского права
- •Общественное достояние
- •Работы, не защищенные авторскими правами
- •Технологическая мера защиты
- •Система Управления Цифровыми Правами
- •Обход технологических мер защиты
- •Организации по воспроизведению прав/ /Организации, управляющие имущественными правами на коллективной основе
- •Налоги (налоги авторского права на оборудование)
- •Выплата авторского гонорара
- •Лицензии: договорные и не договорные
- •Раздел VII. Права на результаты интеллектуальной деятельности и средства индивидуализации
- •Общая характеристика программной продукции фирмы «1с» и форм распространения
- •Схемы корпоративного лицензирования
- •1С:Предприятие 7.7. Расчет. Конфигурация Зарплата и Кадры сетевая версия для 3-х пользователей
- •1С:Предприятие. Оперативный учет. Конфигурация Торговля и склад 7.7 сетевая версия для 3-х пользователей
- •1С:Предприятие 7.7. Конфигурация "Бухгалтерия для бюджетных учреждений"
- •1С:Предприятие 7.7. Конфигурация для распорядителей бюджетных средств
- •1C:Управление страховой компанией 8. Комплект для обучения в высших и средних учебных заведениях.
- •1C:abis.Abc.Bsc Методы процессного управления 8. Комплект для обучения в высших и средних учебных заведениях.
- •1C:crm проф 8. Комплект для обучения в высших и средних учебных заведениях.
- •Номенклатура продукции для поставок в рф, каналы распространения и виды лицензий
- •Особенности лицензирования отдельных групп продукции
- •Правила приобретения и использования лицензий
- •Основные используемые каналы распространения
- •Программы корпоративного лицензирования для коммерческих организаций
- •Описание программ корпоративного лицензирования Microsoft Microsoft Open License
- •Открытое по и его лицензирование
- •Основные открытые программные продукты и их лицензии
- •Основные типы свободных лицензий
- •Приобретение и действие лицензий
- •Условия владения открытым по в России
- •Если экземпляр был приобретен, например, через Интернет-магазин, документами, подтверждающими правомочность владения в случае возмездного приобретения, могут быть:
- •Тема 4.2. Закон рф «Об авторском праве и смежных правах»
Проверяйте все данные из внешних источников
Получив данные из файла, от пользователя, из сети или любого другого внешнего интерфейса, удостоверьтесь, что все значения попадают в допустимый интервал. Проверьте, что числовые данные имеют разрешенные значения, а строки достаточно коротки, чтобы их можно было обработать. Если строка должна содержать определенный набор значений (скажем, идентификатор финансовой транзакции или что-либо подобное), проконтролируйте, что это значение допустимо в данном случае, если же нет — отклоните его. Если вы работаете над приложением, требующим соблюдения безопасности, будьте особенно осмотрительны с данными, которые могут атаковать вашу систему: попыткам переполнения буфера, внедренным SQL-командам, внедренному HTML- или XML-коду, переполнениям целых чисел, данным, передаваемым системным вызовам и т. п.
Проверяйте значения всех входных параметров. метода Проверка значений входных параметров метода практически то же самое, что и проверка данных из внешнего источника, за исключением того, что данные поступают из другого метода, а не из внешнего интерфейса. В разделе 8.5 вы узнаете, как определить, какие методы должны проверять свои входные данные.
«Garbage in, garbage out». Возможно, эту их школьную поговорку следует перевести нашей студенческой: «Каков стол, таков и стул». — Прим. перев.
Решите, как обрабатывать неправильные входные данные Что делать, если вы обнаружили неверный параметр? В зависимости от ситуации вы можете выбрать один из дюжины подходов, подробно описанных в разделе 8.3.
Защитное программирование — это полезное дополнение к другим способам улучшения качества программ, описанным в этой книге. Лучший способ защитного кодирования — изначально не плодить ошибок. Итеративное проектирование, написание псевдокода и тестов до начала кодирования и низкоуровневая проверка соответствия проекту — это все, что помогает избежать добавления дефектов. Поэтому этим технологиям должен быть дан более высокий приоритет, чем защитному программированию. К счастью, вы можете использовать защитное программирование в сочетании с ними.
Защита от проблем, кажущихся несущественными, может иметь большее значение, чем можно подумать (рис. 8-1). В оставшейся части этой главы я расскажу о проверке данных из внешних источников, проверке входных параметров и обработке неправильных входных данных.
Рис.
8-1. Часть плавучего моста Interstate-90 в Сиэтле
затонула во время шторма, потому что
резервуары были оставлены открытыми.
Они наполнились водой, и мост стал
слишком тяжел, чтобы держаться на плаву.
Обеспечение защиты от мелочей во время
проектирования может значить больше,
чем кажется.
Утверждения
Утверждение (assertion) — это код (обычно метод или макрос), используемый во время разработки, с помощью которого программа проверяет правильность своего выполнения. Если утверждение истинно, то все работает так, как ожидалось.
Если ложно — значит, в коде обнаружена ошибка. Например, если система предполагает, что длина файла с информацией о заказчиках никогда не будет превышать 50 000 записей, программа могла бы содержать утверждение, что число записей меньше или равно 50 000. Пока это число меньше или равно 50 000, утверждение будет хранить молчание. Но как только записей станет больше 50 000, оно громко провозгласит об ошибке в программе.
Утверждения особенно полезны в больших и сложных программах, а также в программах, требующих высокой надежности. Они позволяют нам быстрее выявить несоответствия в интерфейсах, ошибки, вкравшиеся при изменении кода и т. п.
Обычно утверждение принимает два аргумента: логическое выражение, описывающее предположение, которое должно быть истинным, и сообщение, выводимое в противном случае. Вот как будет выглядеть утверждение на языке Java, если переменная denominator должна быть ненулевой:
Пример утверждения (Java)
assert denominator /= 0 : "denominator is unexpectedly equal to 0.";
В этом утверждении объявляется, что denominator не должен быть равен 0.
Первый аргумент — denominator /= 0 — логическое выражение, принимающее значение true или false. Второй — это сообщение, выводимое, когда первый аргумент равен false (т. е. утверждение ложно).
Используйте утверждения, чтобы документировать допущения, сделанные в коде, и чтобы выявить непредвиденные обстоятельства. Например, утверждения можно применять при проверке таких условий:
¦ значение входного (выходного) параметра попадает в ожидаемый интервал;
¦ файл или поток открыт (закрыт), когда метод начинает (заканчивает) выполняться;
¦ указатель файла или потока находится в начале (конце), когда метод начинает (заканчивает) выполняться;
¦ файл или поток открыт только для чтения, только для записи или для чтения и записи;
¦ значение входной переменной не изменяется в методе;
¦ указатель ненулевой;
¦ массив или другой контейнер, передаваемый в метод, может вместить по крайней мере X элементов;
¦ таблица инициализирована для помещения реальных значений;
¦ контейнер пуст (заполнен), когда метод начинает (заканчивает) выполняться;
¦ результаты работы сложного, хорошо оптимизированного метода совпадают с результатами метода более медленного, но написанного яснее.
Разумеется, это только основы, и ваши методы будут содержать много более специфических допущений, которые вы сможете документировать, используя утверждения.
Утверждения не предназначены для показа сообщений в промышленной версии — они в основном применяются при разработке и поддержке. Обычно их добавляют при компиляции кода во время разработки и удаляют при компиляции промышленной версии. В период разработки утверждения выявляют противоречивые допущения, непредвиденные условия, некорректные значения, переданные методам, и т. п. При компиляции промышленной версии они могут быть удалены и, таким образом, не повлияют на производительность системы.
Создание собственного механизма утверждений
Многие языки программирования, включая C++, Java, и Microsoft Visual Basic, имеют встроенную поддержку утверждений. Если ваш язык не поддерживает процедуры утверждений напрямую, их легко написать. Стандартный макрос тем языка, а не просто assert языка C++ не предусматривает вывода текстового сообщения.
Вот пример улучшенного макроса ASSERT на C++:
Пример макроса утверждения (C++)
#define ASSERT( condition, message ) { \
if ( !(condition) ) { \
LogError( " Assertion failed: ", \
«condition, message ); \
exit( EXIT_FAILURE ); \
} \
}
Общие принципы использования утверждений
Далее перечислены общие положения по применению утверждений.
Используйте процедуры обработки ошибок для ожидаемых событий и утверждения для событий, которые происходить не должны
Утверждения проверяют условия событий, которые никогда не должны происходить. Обработчик ошибок проверяет внештатные события, которые могут и не происходить слишком часто, но были предусмотрены писавшим код программистом и должны обрабатываться и в промышленной версии. Обработчик ошибок обычно проверяет некорректные входные данные, утверждения — ошибки в программе.
Если для обработки аномальной ситуации служит обработчик ошибок, он позволит программе адекватно отреагировать на ошибку. Если же в случае аномальной ситуации сработало утверждение, для исправления просто отреагировать на ошибку мало — необходимо изменить исходный код программы, перекомпилировать и выпустить новую версию ПО.
Будет правильно рассматривать утверждения как выполняемую документацию — работать программу с их помощью вы не заставите, но вы можете документировать допущения в коде более активно, чем это делают комментарии языка программирования.