Предотвращение ошибок
Ошибки в программах и, как следствие, сбои в работе систем часто являются результатом ошибок человека. Программисты делают ошибки, потому что теряют связь между взаимоотношениями переменных состояний. Они пишут программы, которые приводят к непредвиденному поведению и непредвиденному изменению состояний системы. Люди будут ошибаться всегда, но, как стало ясно в конце 1960-х, некоторые подходы к программированию более подвержены ошибкам по сравнению с остальными. В работе [96] показано, что использование оператора безусловного перехода goto приводит к логическим конструкциям, существенно подверженным ошибкам программирования. Они также затрудняют локализацию изменений состояния системы. Это наблюдение привело к появлению так называемого структурного программирования. Речь идет о программировании без использования оператора goto, использующем для управление только циклы по условию while и условные операторы if. Переход к структурному программированию был важной вехой в развитии инженерии программного обеспечения, поскольку это был первый шаг на пути к научному подходу в практике разработки ПО. Кроме операторов безусловного перехода, существуют другие языковые конструкции и методы программирования, подверженные ошибкам.
1. Числа с плавающей запятой. Эти числа неточны по своей природе. Это порождает определенные проблемы, особенно при сравнении чисел. Например, число 3.00000000 может иногда представляться как 2.99999999, а иногда как 3.00000001. Сравнение последних чисел показало бы, что они не равны. Числа с фиксированной запятой, где установлено количество десятичных знаков, более "надежны" при точном сравнении.
2. Указатели. Это низкоуровневые конструкции, содержащие адреса, которые являются ссылками непосредственно на ячейки оперативной памяти машины. Они опасны, поскольку допускают совмещение имен, а также затрудняют проверку массивов и других структур. 3. Динамическое распределение памяти. В этом случае выделение памяти для программы осуществляется во время ее выполнения, а не во время компиляции. Опасность кроется в возможности такого распределения памяти, при котором программа будет выполняться вне доступной области памяти. Этот тип ошибки очень трудно обнаружить, поскольку система может успешно работать в течение длительного времени, прежде чем возникнут какие-либо проблемы. 4. Параллельность процессов. Параллельное выполнение процессов опасно тем, что трудно предсказать взаимовлияние от обмена данными между процессами, которое может быть разным в зависимости от временных параметров обмена. Эту проблему невозможно обнаружить просмотром текста программ; кроме того, во время испытаний системы не всегда можно выявить комбинации временных параметров, которые приводят к непредвиденному взаимовлиянию процессов. Если без параллельности процессов невозможно обойтись, необходимо минимизировать взаимозависимости между процессами. В некоторых языках программирования (например, Ada и Java) имеются средства для управления параллельным выполнением процессов. 5. Рекурсия. Это ситуация, когда процедура или метод вызывает себя или другую процедуру, которая затем вызывает первоначальную процедуру. Использование рекурсии позволяет создавать короткие программы, однако в них трудно проследить логику. Поэтому ошибки программирования также трудно обнаружить. Использование рекурсии может привести к ошибкам в адресации памяти, так как создаются временные стеки переменных. 6. Прерывания. Это средство управления принудительным переходом к определенному разделу программы независимо от текущего ее выполнения. Опасности этого очевидны, поскольку прерывание может привести к непредвиденному прекращению выполнения какой-либо критически важной операции.
7. Наследование. Наследование в объектно-ориентированных языках программирования позволяет многократно использовать определенные фрагменты кода и выполнять декомпозицию задач, но это также приводит к тому, что программный код, относящийся к одному объекту, может находиться в разных разделах программы. Это затрудняет понимание поведения объекта, поэтому вероятны ошибки программирования. 8. Совмещение имен. Это случается, когда различные имена используются для обращения к одному и тому же программному объекту. При чтении текста программы легко пропустить момент изменения состояния объекта, для обращения к которому используется несколько имен. 9. Ввод данных без проверки. Некоторые системы организуют процесс ввода данных независимо от их содержания. Это просчет в защищенности системы, поскольку могут быть введены данные, которые не отвергаются системой, но могут привести к ее сбою.
Некоторые стандарты проектирования систем, критических по обеспечению безопасности, полностью запрещают использование перечисленных программных конструкций. Однако такая категоричность не всегда оправдана. Все эти конструкции и методы полезны, но они должны использоваться осторожно. Везде, где возможно, их потенциально опасные эффекты должны контролироваться, используя эти конструкции внутри абстрактных типов данных или объектов.
Читайте также: A) Предотвращение финансовой паники. Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|