580.00K
Категория: ПрограммированиеПрограммирование

Программная ошибка. Определения

1.

Программная ошибка. Определения
Ошибки надо не признавать. Их надо смывать.
Кровью! «Кавказская пленница, или Новые
приключения Шурика
Определения – сущность - критика:
• «само собой разумеется» - программа работает неправильно:
невозможность проверки (поисковые алгоритмы), трудоемкость проверки,
размытость спецификаций и требований
• формально-бюрократическое

соответствие
спецификациям

отсутствие и неоднозначность спецификаций
• технологическое – обнаружение в процессе трансляции/исполнения –
ошибка не всегда «валит» программу
Терминология:
• дефект – участок кода, вызывающий ошибку
• сбой – внешние или внутреннее проявление программной ошибки
(исключение,
нарушение
целостности
данных,
деградация
производительности)

2.

Философия программной ошибки
Программная ошибка - отклонение в поведении программы от ожидаемого:
• соответствие требованиям
• формальная корректность результата (варианты):
• вычисляется
• проверяется формально
• нельзя проверить формально, равновеликие затраты на проверку
• ожидаемое поведение (в т.ч. здравый смысл)):
• требования производительности:
• зависимость от архитектуры, «железа»
• трудоемкость алгоритма – вид зависимости от размерности данных
• чувствительность к данным
• требования реального времени требования надежности, устойчивости и
безопасности
• требования эргономики и «человеческий фактор»
• программные ошибки, вызванные окружением (ограниченность или
недоступность ресурсов, особенности версий)
• программные ошибки параллелизма и синхронизации
Невозможность полного тестирования программы:
пространство
тестирования - возможные сочетания входных данных, последовательности
входных данных и команд,
архитектурные комбинации аппаратнопрограммного окружения, возможные временные сочетания внешних событий

3.

Защита от ошибок и устойчивость программы
Средства фиксации ошибок: сохранение максимально возможной
информации об ошибке (дата, время, версия программы, окружение, стек
вызова, текущие данные). Запись данных в лог-файл, отправка, по
возможности, на сервер сопровождения
Нейтрализация ошибок «внешней среды»:
• «защита от дурака» - проверка действий пользователя, возможно
приводящих к некорректным результатам или деградации
производительности , предупреждение ошибок ввода (выбор вместо ввода)
• ошибки форматов – недопустимые форматы файлов или сообщений
программ вследствие ошибок открытия/соединения или намеренного
искажения
• ошибки предоставления ресурсов – отсутствие ресурса или его
ограниченность
• сбои и аварийные завершения (закрытие сетевого потока до окончания
передачи файла и т.п..).
Устойчивость: восстановление контекста при аварийной перезагрузке,
восстановление соединений (поддержка сессий)

4.

Деятельности, связанные тестированием

5.

Деятельности, связанные тестированием
Отладка – неполное начальное тестирование программы с целью получения
исходной работоспособной версии программы (альфа-версии)
Отладка – процесс исправления известной ошибки, включающий ее
воспроизведение, поиск и локализацию дефекта (тестирование – процесс
поиска ошибки)
Верификация – способ формального доказательства правильности
программного кода путем анализа утверждений о состоянии данных
(предикаты) и их преобразовании операциями и операторами программы
(недостаток – затраты, соизмеримые с разработкой)
Инспекция кода – анализ работоспособного кода на предмет возможных
ошибок. см. http://ermak.cs.nstu.ru/cprog гл.2. Анализ программ
Артефакты процесса отладки:
• минимизация тестовых данных
• эксперименты над программой. Статистика «черного ящика»
• локализация дефекта. Метод половинного деления
• трассировка как средство обнаружения закономерностей (преимущества
log-а перед обычными средствами отладки)
• предположение об ошибке. Инспекция кода
• закономерности поведения программы с ошибкой сложнее, чем
безошибочной (нарушение соглашений и инвариантов)

6.

Характеристики ошибок
Условия появления ошибки:
при определенном значении или наборе значений
при определенной последовательности значений
при определенных временных сочетаниях (гонки)
со случайным временем появления
• дефектный код, вызывается внешними событиями, в случайные
моменты времени
• отсутствие ресурсов на момент выполнения
• накопление определенного количества данных (переполнение)
• исполнение последовательности команд пользователем
2. Момент проявления:
• в момент исполнения кода
• наведенная – дефект приводит к нарушениям (целостность данных),
которые вызываю сбой позднее
3. Характер последствий, уровень ущерба:
• Снижение потребительских свойств программы
• Локальная устранимая ошибка
• Частичный восполнимый ущерб
• Частичный невосполнимый ущерб
• Катастрофа
1.

7.

Характеристики ошибок
4. Воздействие на программу (возможные причины):
• наблюдаемый или тестируемый ошибочный результат
• нарушение целостности внутренних данных, дефект структуры данных
– наведенные ошибки
• зависание (линейное зацикливание)
• фатальная ошибка – завершение программы (рекурсивное зацикливание)
• фатальная ошибка – деградация функционала (перехваченное
исключение)
• деградация по производительности или ресурсам (утечки памяти)
5. Виды ошибок по отношению к структуре кода
• опечатка
• крайняя ситуация (граничное условие)
• методологическая ошибка алгоритма
• методологическая ошибка архитектуры
6. Затраты на исправление
• исправление выражения/оператора
• исправление фрагмента кода в отдельном методе
• рефакторинг
• реинжиниринг
• изменения программной архитектуры проекта

8.

Причины появления ошибок
"Я понял. Оказывается, это неправильные
программисты. И они, наверное, делают
неправильный код". Винни Пух
• отсутствие или неправильная формулировка требований (анализ
требований)
• ошибочная интерпретация требований разработчиками (анализ
требований)
• отсутствие необходимого тестового покрытия (тестирование)
• недостаточное регрессионное тестирование (тестирование)
• незнание или отсутствие/недоступность информации (проектирование)
• стиль редактирования или структурирования кода, способствующий
появлению ошибок (конструирование)
• технологический стиль разработки (нарушение канонов ООП, отсутствие
шаблонов) (конструирование)
• несоблюдение соглашений по данным или инвариантов
(конструирование)
• несоответствие версий, конфигураций, настроек (управление
конфигурацией)

9.

Классификация ошибок
Ошибки, связанные с особенностями языка,
компилятора или системы исполнения кода
Могут быть обнаружены формально:
• синтаксический контроль источников синхронных исключений (Java)
• синтаксический контроль инициализации локальных переменных (Java)
Уровень контроля – исторически сложившийся, также связан с моделью
исполнения программы (адресная арифметика в Си).
Пример run-time дефекта в Си: возврат указателя на локальную переменную

10.

Ошибки вычислений и преобразований
1. Операции с вещественными числами –
дискретность шкалы вещественных чисел
2. Дефекты диапазонов представления
данных. Пример: DataOutputStream.writeUTF использует short в качестве
счетчика длины, размер строки ограничен 2^15
3. Дефекты явного и неявного преобразования типов данных:
• потеря значащих разрядов при уменьшении размерности целых
• арифметическое и логическое расширение для знаковых и беззнаковых
• автоматическое расширение коротких типов

11.

Ошибки структурирования и разработки кода
1. Дефекты инициализации – инициализация отсутствует, выполнена «не по
месту», не тем значением
2. Лишний или недостающий шаг цикла
3. Дефект смещения на один шаг цикла (на элемент последовательности)
4. Дефект начального или конечного шага цикла

12.

Ошибки форматов входных данных
• ошибка в программе, сгенерировавшей входной файл, что привело к
нарушению его формата
• содержимое файла изменено случайно или преднамеренно
• предъявлен файл от устаревшей версии программы
• используется база данных с устаревшей структурой таблиц (от
предыдущих версий)
• программа открывает файл с другим содержимым (файл другого типа)
• сетевое соединение закрывается раньше, чем будет передан весь файл
Способы предотвращения:
• внесение избыточности в структуры данных – контрольное суммирование
данных и счетчики размерности, уникальные сигнатуры
• перехват исключений от наведенных ошибок и их «тонкий» анализ
• совершенствование средств управления конфигурациями
Дефекты размерностей данных
Дефекты кода, связанного с перераспределением памяти и других
ресурсов, могут проявлять себя только при превышении определенной
размерности входных данных.

13.

Ошибки соглашений по данным
Соглашения по данным – допустимые конфигурации элементов и их
значений, которые обязанные соблюдаться всеми компонентами
программного кода, работающими с ними (например, методами,
работающими со структурами данных класса).
Ошибки сборки, конфигурирования, настройки
Ошибки, связанные с размерностью данных
Ошибки использования ресурсов
внешние утечки памяти
внутренние утечки памяти
зависшие ресурсы
количественные ограничения по ресурсам (деградация
производительности)
Ошибки восстановления и инициализации
эффект «повторного запуска»
Ошибки параллелизма и синхронизации
Ошибки GUI

14.

Ошибки реактивности и производительности
зависание GUI – асинхронное исполнение продолжительных по
времени операций в отдельном потоке
влияние фактора трудоемкости алгоритма
влияние чувствительности к данным
несоответствие размерностей данных и выделенных ресурсов
методические ошибки проектирования алгоритмов – «тупой» и
эффективный алгоритм. Решения:
• динамическое программирование – повторное использование
результатов повторяющихся подзадач
• «время за счет пространства» - качественное снижение
трудоемкости за счет дополнительной памяти
• эффективные алгоритмы для типовых задач
технологические ошибки (лишний цикл)
• незнание или отсутствие информации о внутренних процессах в
среде исполнения
• особенности среды исполнения, программного и аппаратного
окружения

15.

Дефекты общего доступа и разделения данных
Контекст – множество имен, видимых напрямую (не через операции
доступа) в данной точке кода. Область видимости – область программного
кода, где переменная может быть использована по прямому имени

16.

Дефекты общего доступа и разделения данных
Компоненты контекста:
• глобальные данные и функции или текущее пространство имен (Си++)
• имена импортированных классов
• статические методы и данные текущего класса
• методы и данные текущего класса (текущий объект)
• незатененные данные и неперекрытые методы базового класса
• для вложенных и анонимных классов – данные и методы родительского
класса
• для анонимных классов, создаваемых внутри методов, локальные
переменные и формальные параметры с модификатором final
• формальные параметры текущего метода
• локальные переменные текущего метода
Затенение – перекрытие одинаковых имен в разных компонентах
контекста (например, данных текущего класса – параметрами метода)

17.

Дефекты общего доступа и разделения данных
Дилемма ссылка – значение
Шаблоны проектирования: объект-значение, приспособленец
Побочные эффекты и дефекты доступа по ссылке. Доступность ссылки
на объект дает потенциальную возможность изменения его содержимого.
Поэтому ошибки возможны даже при хорошей модульной организации кода
и его малой связности по управлению. Меры предотвращения:
Уровень 1 – закрытость данных: безусловное закрытие прямого доступа
к данным вне класса (private, доступ через пару методов get/set):
• независимость внутреннего представления
• возможность локализовать ошибку, связанную с доступом к данным
• возможность добавить средства ограничения доступа, генерации
событий и сбора статистики для этих данных
Уровень 2 – средства «раздачи» ссылок и контроля доступа в объектам.
Объекты создаются и сохраняются в отдельном классе, сам класс
«раздает» ссылки на эти объекты и подсчитывает их количество (имеются
методы «получения» и «возвращения» ссылки). По максимуму, класс
сохраняет ссылки на «запросивших доступ» и может делать к ним
обратные вызовы

18.

Особенности среды исполнения, программного и
аппаратного окружения
Сравнение String и StringBuffer
Сохранившиеся поколения
% времени сбора мусора

19.

Особенности среды исполнения, программного и
аппаратного окружения
Парадокс двумерного массива (http://habrahabr.ru/post/211747/)
• обработка по столбцам на порядок медленнее, чем по строкам.
• предположение – влияние процессорного кэша
Эксперимент Java
• моделирование двумерного массива
через одномерный [i][j]=[i*n+j]
• двумерный массив – массив ссылок
на объекты – линейные массивы

20.

Результаты изменений Java (Desktop)
на границе 3Мб эффект кэширования перестает работать для «вертикали»

21.

Результаты изменений C++ (Desktop)

22.

Результаты изменений Java (Fly IQ245)

23.

Результаты изменений Java (AM2308G)

24.

Результаты профилирования Java (Desktop)
English     Русский Правила