Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Защитное программирование

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

Бороться с такими ситуациями можно двумя способами: либо проверять

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

 

Защитное программирование - это стиль программирования, в котором предполагается нормальное завершение работы подпрограммы при любых входных данных. Достичь этого можно с помощью следующих действий (пусть задана спецификация {P}f{Q}):

 

1. К выходным параметрам подпрограммы добавляется дополнительный параметр для возвращения кода завершения. Код завершения - это некоторое специальное значение, по которому в вызывающей программе можно определить, выполнялся ли предикат P в момент вызова подпрограммы. Обычно, среди кодов завершения один означает выполнение предиката P - обозначим его K0, а остальные - K1,…,Kn каким-либо образом кодируют причины, по которым был не выполнен предикат. Обычно все эти причины известны заранее и для них предусматриваются соответствующие коды. Код завершения лучше всего возвращать через основной выход функции. Если же он возвращается через обычный параметр по ссылке, то не следует делать подпрограмму функцией. Иногда для набора подпрограмм, решающих похожие задачи и сгруппированных в одном модуле, делается общая глобальная переменная, в которую записывается код завершения после вызова любой из этих подпрограмм. Особенно часто последний способ используется в объектно-ориентированном программировании.

 

2. Предусловие P заменяется на тождественно истинный предикат. Постусловие изменяется следующим образом: если перед вызовом подпрограммы был выполнен P, то по окончании ее работы будет выполнен Q, и код завершения будет равен K0; если перед вызовом P не был выполнен, то при возврате код завершения принимает одно из значений в зависимости от причины невыполнения P, а для остальных данных выполняется предикат Q1. Предикат Q1 зависит от конкретной задачи, но часто он не накладывает ограничений на выходные параметры (кроме кода завершения), т.е. они могут принимать любые значения по окончании работы подпрограммы.

 

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

 

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

 

5. Иногда писать функции с кодом завершения по каким-то причинам неудобно, а предпочтительнее обрабатывать исключительную ситуацию в момент ее возникновения, не выходя из подпрограммы. Тогда для обработки возникших исключительных ситуаций создаются специальные подпрограммы. Это особенно удобно, когда есть возможность обработки серии ошибок, возникающих в различных подпрограммах, с помощью одной подпрограммы-обработчика. Этот подход часто используется в объектно-ориентированном программировании. Но ни в коем случае не следует сообщать о результатах проверки P с помощью вывода сообщения на экран, в файл и др., т.к. это может привести к нежелательному побочному эффекту.

 

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

 

7. При использовании модульного и объектно-ориентированного программирования следует скрывать все данные от внешнего доступа.

 

 

<== предыдущая лекция | следующая лекция ==>
Спецификации программ, объединение спецификаций | Тестирование и отладка программ. Разработка заглушек
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 538; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.