Ошибки накопления погрешностей

Отладка, или debugging, — это поиск (локализация), анализ и устранение ошибок в программном обеспечении, которые были найдены во время тестирования.

Виды ошибок

Ошибки компиляции

Это простые ошибки, которые в компилируемых языках программирования выявляет компилятор (программа, которая преобразует текст на языке программирования в набор машинных кодов). Если компилятор показывает несколько ошибок, отладку кода начинают с исправления самой первой, так как она может быть причиной других.

В интерпретируемых языках (например Python) текст программы команда за командой переводится в машинный код и сразу исполняется. К моменту обнаружения ошибки часть программы уже может исполниться.

Ошибки компоновки

Ошибки связаны с разрешением внешних ссылок. Выявляет компоновщик (редактор связей) при объединении модулей программы. Простой пример — ситуация, когда требуется обращение к подпрограмме другого модуля, но при компоновке она не найдена. Ошибки также просто найти и устранить.

Ошибки выполнения (RUNTIME Error)

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

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

Ошибки выполнения можно разделить на три большие группы.

Ошибки определения данных или неверное определение исходных данных. Они могут появиться во время выполнения операций ввода-вывода.

К ним относятся:

  • ошибки преобразования;
  • ошибки данных;
  • ошибки перезаписи.

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

Логические ошибки. Они могут возникать из ошибок, которые были допущены при выборе методов, разработке алгоритмов, определении структуры данных, кодировании модуля.

В эту группу входят:

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

Ошибки накопления погрешностей. Могут возникать при неправильном округлении, игнорировании ограничений разрядной сетки, использовании приближенных методов вычислений и т.д. 

Методы отладки программного обеспечения

Метод ручного тестирования

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

Метод индукции

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

Вот как выглядит процесс:

Алгоритм отладки по методу индукции

Важно, чтобы выдвинутая гипотеза объясняла все проявления ошибки. Если объясняется только их часть, то либо гипотеза неверна, либо ошибок несколько.

Метод дедукции

Сначала специалисты предлагают множество причин, по которым могла возникнуть ошибка. Затем анализируют их, исключают противоречащие имеющимся данным. Если все причины были исключены, проводят дополнительное тестирование. В обратном случае наиболее вероятную причину пытаются доказать.

Отладка по методу дедукции

Метод обратного прослеживания

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

Как выполняется отладка в современных IDE

Ранние отладчики, например gdb, представляли собой отдельные программы с интерфейсами командной строки. Более поздние, например первые версии Turbo Debugger, были автономными, но имели собственный графический интерфейс для облегчения работы. Сейчас большинство IDE имеют встроенный отладчик. Он использует такой же интерфейс, как и редактор кода, поэтому можно выполнять отладку в той же среде, которая используется для написания кода.

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

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

Шаг с заходом (step into)

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

Шаг с обходом (step over)

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

Шаг с выходом (step out)

В отличие от step into и step over, step out выполняет не следующую строку кода, а весь оставшийся код функции, исполняемой в настоящее время. После возврата из функции он возвращает управление разработчику. Эта команда полезна, когда специалист случайно вошел в функцию, которую не нужно отлаживать.

Как правило, при пошаговом выполнении можно идти только вперед. Поэтому легко перешагнуть место, которое нужно проверить. Если это произошло, необходимо перезапустить отладку.

У некоторых отладчиков (таких как GDB 7.0, Visual Studio Enterprise Edition 15.5 и более поздних версий) есть возможность вернуться на шаг назад. Это полезно, если пропущена цель либо нужно повторно проверить выполненную инструкцию. 

Какие существуют методы анализа и локализации ошибки

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

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

Существует три основных способа тестирования:

Алгоритмическое тестирование применяется для контроля этапов алгоритмизации и программирования. Проектируются тесты и начинаются готовиться эталонные результаты на этапе алгоритмизации, а используются они на этапе отладки.

Функциональное или аналитическое тестирование

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

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

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

Тот вид контроля, который рассматривался выше, можно назвать тестированием основных функциональных возможностей программы — основной тест.

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

Тест граничных значений

Тест проверяет работу программы для граничных значений параметров, определяющих вычислительный процесс. Часто для граничных значений параметра работа программы носит особый характер, который, тем самым, требует и особого контроля.

Тест проверяет реакцию программы на возникновение разного рода аварийных ситуаций в программе, в частности, вызванных неправильными исходными данными. Другими словами, проверяется диагностика, выдаваемая программой, а также окончание ее работы или, может быть, попытка исправления неверных исходных данных.

Локализация ошибок

После того, как с помощью тестов (или каким либо другим путем) установлено, что в программе или в конкретном ее блоке имеется ошибка, возникает задача ее локализации, то есть установления точного места в программе, где находится ошибка.

Процесс локализации ошибок состоит из следующих трех компонент:

Получение на машине тестовых результатов.

Анализ тестовых результатов и сверка их с эталонными.

Выявление ошибки или формулировка предположения о характере и месте ошибки в программе.

Технология отладки автоматизированного рабочего места

При отладке программы использовались следующие методы контроля и локализации ошибок: просмотр текста программы с целью обнаружения явных синтаксических и логических ошибок и трансляция программы (транслятор выдает сообщения об обнаруженных им ошибках в тексте программы).

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

1) Отладка программы производилась следующим образом:

2) Запуск программы с набором тестовых входных данных и выявление наличия ошибок.

3) Выделение области программы, в которой может находиться ошибка.

4) Просмотр листинга программы с целью возможного визуального обнаружения ошибок. В противном случае — установка контрольной точки примерно в середине выделенной области.

Новая прогонка программы. Если работа программы прервалась до обработки контрольной точки, значит, ошибка произошла раньше. Контрольная точка переносится, и процесс отладки возвращается к шагу 2.

Если контрольная точка программы была обработана, то далее следует изучение значений стека, переменных и параметров программы с тем, чтобы убедиться в их правильности. При появлении ошибки — новый перенос контрольной точки и возврат к шагу 2.

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

В данном разделе были рассмотрены вопросы разработки, отладки и тестирования программных продуктов. Было приведено обоснование необходимости и важности этапа отладки в процессе разработки программного обеспечения, даны краткие описания основных способов отладки и тестирования.

В отношении разработанной в специальной части программы было дано описание алгоритма, использовавшегося при ее отладки и тестировании. Представлено обоснование выбора языка программирования.

7. Локализация ошибок

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

Процесс локализации ошибок состоит из следующих трех компонент:

1. Получение на машине тестовых результатов.

2. Анализ тестовых результатов и сверка их с эталонными.

3. Выявление ошибки или формулировка предположения о характере и месте ошибки в программе.

По принципам работы средства локализации разделяются на 4 типа :

1. Аварийная печать.

2. Печать в узлах.

АВАРИЙНАЯ ПЕЧАТЬ осуществляется один раз при работе отлаживаемой программы, в момент возникновения аварийной ситуации в программе, препятствующей ее нормальному выполнению. Тем самым, конкретное место включения в работу аварийной печати определяется автоматически без использования информации от программиста, который должен только определить список выдаваемых на печать переменных.

ПЕЧАТЬ В УЗЛАХ включается в работу в выбранных программистом местах программы; после осуществления печати значений данных переменных продолжается выполнение отлаживаемой программы.

СЛЕЖЕНИЕ производится или по всей программе, или на заданном программистом участке. Причем слежение может осуществляться как за переменными (арифметическое слежение), так и за операторами (логическое слежение). Если обнаруживается, что происходит присваивание заданной переменной или выполнение оператора с заданной меткой, то производится печать имени переменной или метки и выполнение программы продолжается. Отличием от печати в узлах является то, что место печати может точно и не определяться программистом (для арифметического слежения); отличается также и содержание печати.

ПРОКРУТКА производится на заданных участках программы, и после выполнения каждого оператора заданного типа (например, присваивания или помеченного) происходит отладочная печать.

По типам печатаемых значений (числовые и текстовые или меточные) средства разделяются на арифметические и логические.

7.2. Классификация средств локализации ошибок

Ниже дана классификация средств локализации.

ТИПЫ СРЕДСТВ ЛОКАЛИЗАЦИИ ОШИБОК :

СРЕДСТВА ЛОКАЛИЗАЦИИ:

1. Аварийная печать (арифметическая).

1.1. Специальные средства языка.

1.2. Системные средства.

2. Печать в узлах (арифметическая).

2.1. Обычные средства языка.

2.2. Специальные средства языка.

3. Слежение (специальные средства).

4. Прокрутка (специальные средства).

8. Технология отладки программы автоматизации учета движения товаров на складе малого предприятия

При отладке программы использовались следующие методы контроля и локализации ошибок (обзор методов см. в теоретической части раздела) :

1. Просмотр текста программы и прокрутка с целью обнаружения явных синтаксических и логических ошибок.

2. Трансляция программы (транслятор выдает сообщения об обнаруженных им ошибках в тексте программы).

3. Тестирование. Тестирование проводилось посредством ввода исходных данных, с дальнейшей их обработкой, выводом результатов на печать и экран. Результаты работы программы сравнивались заданными в техническом задании.

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

Отладка программы производилась по следующему алгоритму :

1. Прогонка программы с набором тестовых входных данных и выявление наличия ошибок.

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

3. Новая прогонка программы. Если работа программы прервалась до обработки контрольной точки, значит, ошибка произошла раньше. Контрольная точка переносится, и процесс отладки возвращается к шагу 2.

4. Если контрольная точка программы была обработана, то далее следует изучение значений регистров, переменных и параметров программы с тем, чтобы убедиться в их правильности. При появлении ошибки — новый перенос контрольной точки и возврат к шагу 2.

5. В случае не обнаружения ошибки продолжение выполнения программы покомандно, с контролем правильности выполнения переходов и содержимого регистров и памяти в контрольных точках. При локализации ошибки она исправляется и процесс возвращается к шагу 1.

В качестве тестовых входных данных использовалась последовательность частотных выборок, генерируемых имитатором в режиме 1. (Каждому интервалу соответствует фиксированное значение выборок.)

Итоговый тест по дисциплине «Поддержка и тестирование программных модулей»

Является ли программа аналогом математической формулы?

Варианты ответов
  • Да
  • Нет
  • Математические формулы и программы не сводятся друг к другу
Вопрос 2

Какие подходы используются для обоснования истинности программ?

Варианты ответов
  • использование аналогий
  • эксперимент над программой
  • доказательство программы
  • формальный и интерпретационный
Вопрос 3

Отметьте верные утверждения

Варианты ответов
  • тестирование – процесс поиска ошибок
  • в фазу тестирования входят поиски и исправление ошибок
  • отладка – процесс локализации и исправления ошибок
Вопрос 4

Зачем нужна спецификация тестирования?

Варианты ответов
  • для формирования команды тестировщиков
  • для разработки тестового набора
  • для понимания смысла программы
Вопрос 5
Варианты ответов
  • выполнение программы в уме
  • пошаговое выполнение
  • метод контрольных точек и анализа трасс
Вопрос 6

Зачем нужен Log-файл?

Варианты ответов
  • для изучения результатов тестирования в режиме on-line
  • для фиксации результатов прогона test-suite
  • для записи комментариев после прогона тестов
Вопрос 7
Варианты ответов
  • разработка тестового набора
  • прогон программы на тестовом наборе
  • доказательство правильности программы
  • анализ результатов тестирования
Вопрос 8
Варианты ответов
  • определение областей эквивалентности входных параметров
  • анализ покрытия тестами всех возможных случаев поведения
  • проверка граничных значений
Вопрос 9

Что такое управляющий граф программы (УГП)?

Варианты ответов
  • множество операторов программы.
  • граф, вершины которого кодируют операторы программы, а дуги — управления (порядок исполнения) операторов
  • множество операторов управления
Вопрос 10
Варианты ответов
  • множество связанных дуг УГП
  • последовательность вершин и дуг УГП с фиксированными начальной и конечной вершиной
  • последовательность ветвей УГП с фиксированными начальной вершиной первой ветви и конечной вершиной последней ветви пути
Вопрос 11
Варианты ответов
  • нереализуемый путь недоступен при корректном исполнении программы
  • нереализуемый путь недоступен всегда
  • нереализуемый путь доступен при сбое
  • нереализуемый путь доступен при реализации недопустимых состояний переменных программы
Вопрос 12

Возможно ли тестирование программы на всех допустимых значениях параметров?

Варианты ответов
  • да, всегда
  • никогда
  • возможно в отдельных случаях
Вопрос 13

Какие предъявляются требования к идеальному критерию тестирования?

Варианты ответов
  • достаточность
  • достижимость
  • полнота
  • проверяемость
Вопрос 14

Какие классы критериев тестируемости известны

Варианты ответов
  • структурные критерии
  • мутационные критерии
  • функциональные критерии
  • сценарные критерии
  • стохастические критерии
Вопрос 15
Варианты ответов
  • сценарный критерий
  • такого критерия не существует
  • критерий «черного ящика»
Вопрос 16
Варианты ответов
  • критерий тестирования команд
  • критерий тестирования ветвей
  • критерий тестирования циклов
  • критерий тестирования путей
Вопрос 17
Варианты ответов
  • не проверяется соответствие со спецификацией
  • не проверяется соответствие со спецификацией, не зафиксированное в структуре программы
  • не проверяются ошибки в структурах данных
Вопрос 18
Варианты ответов
  • тестирование пунктов спецификации
  • тестирование классов входных данных
  • тестирование классов выходных данных
  • тестирование функций
  • тестирование правил
Вопрос 19
Варианты ответов
  • не проверяется соответствие со спецификацией
  • не проверяются ошибки, требования к которым не зафиксированы в спецификации
  • не проверяются ошибки в структурах данных, требования к которым не зафиксированы в спецификации
Вопрос 20
Варианты ответов
  • создание программ-мутантов на основе изменения модульной структуры основной программы
  • создание программ-мутантов с функциональными дефектами
  • оценка числа ошибок в программе на основе искусственно внесенных мелких ошибок
Вопрос 21
Варианты ответов
  • оценка проекта интегрирует оценки оттестированности модулей
  • оценка проекта может вычисляться инкрементально
  • в результате получаем наихудшую оценку оттестированности
  • в результате получаем наилучшую оценку оттестированности
Вопрос 22

Какие существуют разновидности уровней тестирования?

Варианты ответов
  • модульное
  • интеграционное
  • структурное
  • системное
  • регрессионное
Вопрос 23

Какие задачи у модульного тестирования?

Варианты ответов
  • выявление ошибок при вызове модулей
  • выявление ошибок взаимодействия модуля с окружением
  • выявление локальных ошибок реализации алгоритмов модулей
Вопрос 24

На основе каких принципов строятся тесты для модульного тестирования?

Варианты ответов
  • анализ потоков управления модуля
  • анализ потоков данных модуля
  • анализ покрытия в соответствии с заданными структурными критериями
Вопрос 25
Варианты ответов
  • построение УГП (управляющего графа программы)
  • выбор тестовых путей
  • генерация тестов, соответствующих выбранным тестовым путям
Вопрос 26
Варианты ответов
  • статические
  • динамические
  • методы реализуемых путей
Вопрос 27
Варианты ответов
  • Регрессионное тестирование
  • монолитное тестирование
  • нисходящее тестирование
  • восходящее тестирование
Вопрос 28
Варианты ответов
  • необходимость разработки заглушек
  • параллельная разработка эффективных модулей
  • необходимость разработки среды управления очередностью вызовов модулей
  • необходимость разработки драйверов
Вопрос 29
Варианты ответов
  • тесты оперируют пользовательским или другими внешними интерфейсами
  • структура проекта тестируется на уровне подсистем
  • тестированию подлежит система в целом
  • тестирование осуществляется по методу «черного ящика»
Вопрос 30
Варианты ответов
  • выявление дефектов в функционировании приложения или в работе с ним
  • выявление дефектов использования ресурсов
  • выявление несовместимости с окружением
  • выявление непредусмотренных сценариев применения или использования непредусмотренных комбинаций данных
Вопрос 31
Варианты ответов
  • перетестирование предусматривает только контроль частей приложения, связанных с изменениями
  • выбор между полным и частичным перетестированием и пополнением тестовых наборов
  • регрессионное тестирование является подмножеством системного тестирования
Вопрос 32

Какие типы дефектов выявляются при системном и регрессионном тестировании

Программные ошибки. Методы отладки

Прежде всего определимся с некоторыми понятиями, связанными с отладкой программного обеспечения.

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

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

Локализация — это определение оператора/операторов программы, выполнение которого вызвало нарушение вычислительного процесса.

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

В соответствии с этапом обработки, на котором появляются ошибки, различают ошибки компиляции, ошибки компоновки, ошибки выполнения (рис. 5.1) [7].

Группы программных ошибок

Рис. 5.1. Группы программных ошибок

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

Ошибки компоновки — ошибки, обнаруженные компоновщиком (редактором связей) при объединении модулей программы. Ошибки компоновки связаны с проблемами, обнаруженными при разрешении внешних ссылок. Например, предусмотрено обращение к подпрограмме другого модуля, а при объединении модулей данная подпрограмма не найдена или не стыкуются списки параметров.

Ошибки выполнения — ошибки, обнаруженные операционной системой, аппаратными средствами или пользователем при выполнении программы. Ошибки выполнения являются самыми непредсказуемыми. Некоторые из них обнаруживаются и документируются операционной системой. Они могут иметь разную природу и поэтому по-разному проявляться:

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

Причины ошибок выполнения очень разнообразны, а потому их

сложно локализовать. Все возможные причины ошибок выполнения можно разделить на следующие группы:

  • • ошибки определения данных;
  • • логические ошибки;
  • • ошибки накопления погрешностей.

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

Логические ошибки имеют разную природу и могут следовать из ошибок, допущенных при проектировании, например при выборе методов, разработке алгоритмов или определении структуры данных (классов), а могут быть непосредственно внесены при кодировании модуля. К ошибкам кодирования относятся:

  • • ошибки некорректного использования переменных, например неудачный выбор типов данных, использование переменных до их инициализации, использование индексов, выходящих за границы определения массивов, нарушения соответствия типов данных и т.п.;
  • • ошибки вычислений, например некорректная работа с переменными, некорректное преобразование типов данных в процессе вычислений и т.п.;

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

Возможны и другие ошибки кодирования, например неправильная реализация логики программы при кодировании, игнорирование особенностей или ограничений конкретного языка программирования.

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

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

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

Методы отладки программного обеспечения можно классифицировать следующим образом [7]:

  • • метод ручного тестирования;
  • • метод индукции;
  • • метод дедукции;
  • • метод обратного прослеживания.

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

Метод индукции предусматривает подробный анализ проявления ошибки. Это могут быть неверные результаты вычислений или сообщение об ошибке. Если компьютер просто «зависает», то место проявления ошибки в программном обеспечении определяют исходя из последних полученных результатов и действий пользователя. Полученную таким образом информацию можно изучить, просматривая соответствующий фрагмент программы. В результате выдвигаются гипотезы об ошибках, которые затем проверяются. Если гипотеза верна, то детализируют информацию об ошибке, иначе — выдвигают другую гипотезу. Если в результате изучения данных никаких гипотез не появляется, то необходима дополнительная информация об ошибке.

Метод дедукции работает по следующему алгоритму. Сначала формируют множество причин, которые могли бы вызвать данное проявление ошибки. Затем, анализируя причины, исключают те, которые противоречат имеющимся данным. Если все причины исключены, то необходима дополнительная информация об ошибке и следует выполнить дополнительное тестирование исследуемого фрагмента. В противном случае наиболее вероятную гипотезу пытаются доказать. Если гипотеза объясняет полученные признаки ошибки, то ошибка найдена, иначе — проверяют следующую причину.

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

Рассмотрим категории программных ошибок, которые встречаются наиболее часто.

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

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

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

Некорректная обработка ошибок. Правильно определив ошибку, программа должна выдать о ней сообщение. Отсутствие такого сообщения является ошибкой в работе программы.

Некорректная обработка граничных условий. Существует много различных граничных ситуаций. Любой аспект работы программы, к которому применимы понятия «больше» или «меньше», «раньше» или «позже», «первый» или «последний», «короче» или «длиннее», обязательно должен быть проверен на границах диапазона. Внутри диапазонов программа может работать правильно, а на их границах могут происходить неожиданные ситуации, которые, в свою очередь, приводят к ошибкам в работе программного обеспечения.

Ошибки вычислений. К ошибкам вычислений относятся ошибки, вызванные неправильным выбором алгоритма вычислений, неправильными формулами либо формулами, неприменимыми к обрабатываемым данным. Самыми распространенными среди ошибок вычислений являются ошибки округления.

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

Ситуация гонок. Предположим, в системе ожидаются два события: А и Б. Если первым наступит событие А, то выполнение программы продолжится, а если событие Б, то в работе программы произойдет сбой. Разработчики предполагают, что первым всегда должно быть событие А, и не ожидают, что Б может выиграть гонки и наступить раньше. Такова классическая ситуация гонок. Тестировать ситуации гонок довольно сложно. Наиболее типичны они для систем, где параллельно выполняются взаимодействующие процессы и потоки, а также для многопользовательских систем реального времени. Ошибки в таких системах трудно воспроизвести, и на их выявление обычно требуется очень много времени.

Перегрузки. Сбои в работе программы могут происходить из-за нехватки памяти или отсутствия других необходимых системных ресурсов. У каждой программы свои пределы, программа может не справляться с повышенными нагрузками, например со слишком большими объемами данных. Вопрос в том, соответствуют ли реальные возможности программы, ее требования к ресурсам спецификации программы, и как она себя поведет при перегрузках.

Некорректная работа с аппаратурой компьютера. Программы могут отправлять аппаратным устройствам неверные данные, игнорировать их сообщения об ошибках, пытаться использовать устройства, которые заняты или вообще отсутствуют. Даже если нужное устройство просто неисправно, программа должна понять это, а не «зависать» при попытке к нему обратиться.

при численном решении алгебраических уравнений — суммарное влияние округлений, сделанных на отдельных шагах вычислительного процесса, на точность полученного решения линейной алгебраич. системы. Наиболее распространенным способом априорной оценки суммарного влияния ошибок округления в численных методах линейной алгебры является схема т. н. обратного анализа. В применении к решению системы линейных алгебраич. уравнений

схема обратного анализа заключается в следующем. Вычисленное прямым методом Мрешение хуи не удовлетворяет (1), но может быть представлено как точное решение возмущенной системы

Качество прямого метода оценивается по наилучшей априорной оценке, к-рую можно дать для норм матрицы и вектора . Такие «наилучшие»и наз. соответственно матрицей и вектором эквивалентного возмущения для метода М.

Если оценки для и имеются, то теоретически ошибка приближенного решения может быть оценена неравенством

Здесь — число обусловленности матрицы А, а матричная норма в (3) предполагается подчиненной векторной норме

В действительности оценка для редко бывает известна, и основной смысл (2) состоит в возможности сравнения качества различных методов. Ниже приводится вид нек-рых типичных оценок для матрицы Для методов с ортогональными преобразованиями и арифметики с плавающей запятой (в системе (1) Аи bсчитаются действительными)

В этой оценке — относительная точность арифметич. операций в ЭВМ,— евклидова матричная норма, f(n) — функция вида , где п- порядок системы. Точные значения константы Си показателя kопределяются такими деталями вычислительного процесса, как способ округления, использование операции накопления скалярных произведений и т. д. Наиболее часто k=1 или 3/2.

В случае методов типа Гаусса в правую часть оценки (4) входит еще множитель , отражающий возможность роста элементов матрицы Ана промежуточных шагах метода по сравнению с первоначальным уровнем (такой рост отсутствует в ортогональных методах). Чтобы уменьшить значение , применяют различные способы выбора ведущего элемента, препятствующие возрастанию элементов матрицы.

Для квадратного корня метода, к-рый применяется обычно в случае положительно определенной матрицы А, получена наиболее сильная оценка

Существуют прямые методы (Жордана, окаймления, сопряженных градиентов), для к-рых непосредственное применение схемы обратного анализа не приводит к эффективным оценкам. В этих случаях при исследовании Н. п. применяются и иные соображения (см. [6] — [9]).

Лит.:[1] Givens W., «TJ. S. Atomic Energy Commiss. Repts. Ser. OR NL», 1954, № 1574; [2] Wilkinson J. H., Rounding errors in algebraic processes, L., 1963; [3] Уилкинсон Д ж. <Х., Алгебраическая проблема собственных значений, пер. с англ., М., 1970; [4] Воеводин В. В., Ошибки округления и устойчивость в прямых методах линейной алгебры, М., 1969; [5] его же, Вычислительные основы линейной алгебры, М., 1977; [6] Peters G., Wilkinsоn J. H., «Communs Assoc. Comput. Math.», 1975, v. 18, № 1, p. 20-24; [7] Вrоуden C. G., «J. Inst. Math, and Appl.», 1974, v. 14, № 2, p. 131-40; [8] Reid J. К., в кн.: Large Sparse Sets of Linear Equations, L.- N. Y., 1971, p. 231 — 254; [9] Икрамов Х. Д., «Ж. вычисл. матем. и матем. физики», 1978, т. 18, № 3, с. 531-45.

X. Д. Икрамов.

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

Значительная часть таких задач связана с решением алгебраич. задач, линейных или нелинейных (см. выше). В свою очередь среди алгебраич. задач наиболее распространены задачи, возникающие при аппроксимации дифференциальных уравнений. Этим задачам свойственны нек-рые специфич. особенности.

Н. п. метода решения задачи происходит по тем же или по более простым законам, что и Н. п. вычислительной погрешности; Н. ,п. метода исследуется при оценке метода решения задачи.

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

Характер Н. п. зависит от решаемой задачи, метода решения и ряда других факторов, на первый взгляд могущих показаться несущественными; сюда относятся форма записи чисел в ЭВМ (с фиксированной запятой или с плавающей запятой), порядок выполнения арифметич. операций и т. д. Напр., в задаче вычисления суммы Nчисел

существенен порядок выполнения операций. Пусть вычисления производятся на машине с плавающей запятой с tдвоичными разрядами и все числа лежат в пределах . При непосредственном вычислении с помощью рекуррентной формулы мажорантная оценка погрешности имеет порядок 2-tN. Можно поступить иначе (см. [1]). При вычислении попарных сумм (если N=2l+1 нечетно) полагают . Далее вычисляются их попарные суммы и т. д. При после тшагов образования попарных сумм по формулам

получают мажорантная оценка погрешности порядка

В типичных задачах величины а т вычисляются по формулам, в частности рекуррентным, или поступают последовательно в оперативную память ЭВМ; в этих случаях применение описанного приема приводит к увеличению загрузки памяти ЭВМ. Однако можно организовать последовательность вычислений так, что загрузка оперативной памяти не будет превосходить -log2N ячеек.

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

Для устойчивых методов характерен рост погрешности как Оценка погрешности таких методов обычно производится следующим образом. Строится уравнение относительно возмущения, вносимого или округлением, или погрешностями метода и затем исследуется решение этого уравнения (см. [2], [3]).

В более сложных случаях применяется метод эквивалентных возмущений (см. [1], [4]), развитый в отношении задачи исследования накопления вычислительной погрешности при решении дифференциальных уравнений (см. [3], [5], [6]). Вычисления по нек-рой расчетной схеме с округлениями рассматриваются как вычисления без округлений, но для уравнения с возмущенными коэффициентами. Сравнивая решение исходного сеточного уравнения с решением уравнения с возмущенными коэффициентами получают оценку погрешности.

Уделяется существенное внимание выбору метода по возможности с меньшими значениями qи A(h). При фиксированном методе решения задачи расчетные формулы обычно удается преобразовать к виду, где (см. [3], [5]). Это особенно существенно в случае обыкновенных дифференциальных уравнений, где число шагов в отдельных случаях оказывается очень большим.

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

В случае численного решения обыкновенного дифференциального уравнения уравнение в вариациях имеет вид

и потому при решении задачи на отрезке ( х 0 , X )нельзя рассчитывать на константу A(h)в мажорантной оценке вычислительной погрешности существенно лучшую, чем

Поэтому при решении этой задачи наиболее употребительны однощаговые методы типа Рунге — Кутта или методы типа Адамса (см. [3], [7]), где Н. п. в основном определяется решением уравнения в вариациях.

Для ряда методов главный член погрешности метода накапливается по подобному закону, в то время как вычислительная погрешность накапливается существенно быстрее (см. [3]). Область практич. применимости таких методов оказывается существенно уже.

Накопление вычислительной погрешности существенно зависит от метода, применяемого для решения сеточной задачи. Напр., при решении сеточных краевых задач, соответствующих обыкновенным дифференциальным уравнениям, методами стрельбы и прогонки Н. п. имеет характер A(h)h-q, где qодно и то же. Значения A(h)у этих методов могут отличаться настолько, что в определенной ситуации один из методов становится неприменимым. При решении методом пристрелки сеточной краевой задачи для уравнения Лапласа Н. п. имеет характер с 1/h, с>1, а в случае метода прогонки Ah-q. При вероятностном подходе к исследованию Н. п. в одних случаях априорно предполагают какой-то закон распределения погрешности (см. [2]), в других случаях вводят меру на пространстве рассматриваемых задач и, исходя из этой меры, получают закон распределения погрешностей округления (см. [8], [9]).

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

Лит.:[1] Воеводин В. В., Вычислительные основы линейной алгебры, М., 1977; [2] Шура-Бура М. Р., «Прикл. матем. и механ.», 1952, т. 16, № 5, с. 575-88; [3] Бахвалов Н. С, Численные методы, 2 изд., М., 1975; [4] Уилкинсон Дж. X., Алгебраическая проблема собственных значений, пер. с англ., М.. 1970; [5] Бахвалов Н. С, в кн.: Вычислительные методы и программирование, в. 1, М., 1962, с, 69-79; [6] Годунов С. К., Рябенький В. С, Разностные схемы, 2 изд., М., 1977; [7] Бахвалов Н. С, «Докл. АН СССР», 1955, т. 104, № 5, с. 683-86; [8] его же, «Ж. вычислит, матем. и матем. физики», 1964; т. 4, № 3, с. 399- 404; [9] Лапшин Е. А., там же, 1971, т. 11, № 6, с.1425-36.

Н. С. Бахвалов.

Математическая энциклопедия. — М.: Советская энциклопедия.
.
1977—1985.

Закон накопления случайных ошибоккосвенных измерений выглядит следующим
образом:

;
.

Закон накопления возможных предельных
абсолютных систематических ошибок
косвенных измерений представляется
следующими зависимостями:

;
.

Закон накопления возможных предельных
относительных систематических ошибок
косвенных измерений имеет следующий
вид:

;

.

В случаях, когда искомая величина (y)рассчитывается как функция результатов
нескольких независимых прямых измерений
вида
,
закон накопления предельных относительных
систематических ошибок косвенных
измерений принимает более простой вид:

;
.

Ошибки и погрешности измерений определяют
их точность, воспроизводимость, сходимость
и правильность.

Чем меньше величина погрешности
измерения, тем выше его точность.

Воспроизводимостьисходимостьрезультатов измерений улучшаются при
уменьшении случайных ошибок измерений.

Правильностьрезультата измерений
увеличивается с уменьшением остаточных
систематических ошибок измерений.

Более подробно с теорией ошибок измерений
и их особенностями познакомьтесь в
[6,9]. Я же
обращу Ваше внимание на то, что современные
формы представления конечных результатов
измерений обязательно требуют приведения
ошибок или погрешностей измерения
(вторичных данных). Погрешности и ошибки
измерений должны представлятьсячислами,
которые содержат не болеедвух значащих
цифр
.

4.2. Формы представления конечных результатов измерений

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

  1. При одном единичном значении результата
    измерений

(n = 1):

y = y1y,пр..

2. При наличии нескольких единичных
результатов измерений
(n 2) и отсутствии сведений о функции их
распределения:

a) y = y; S­y; n ; y,пр.(может дополнительно еще приводиться
значение вероятности Р, если расчет
y,пр.носил вероятностный характер;

б) y=y
Пy; Sy; n ; P.

3. При наличии нескольких единичных
результатов измерений
(n 2) и знании функции их распределения:

а) y =yПy; P (при симметричной погрешности);

б) y =y; Пyот Пy,
н
до Пy,
в
; P (для несимметричной погрешности,
где Пy,
н
— нижняя граница общей абсолютной
погрешности, а Пy,
в
— верхняя граница общей абсолютной
погрешности).

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

Пример.
При трехкратном взвешивании образца
на аналитических весах (класс точности
0,01 ) были получены следующие единичные
результаты измерения его массы

(m
i
): 1,2356; 1,2345;
1,2348 г. Результаты метрологической
поверки весов свидетельствуют об их
постоянной абсолютной систематической
ошибке
m
= — 0,0003 г (для примененной гирьки из
разновесов массой 1 г систематическая
ошибка была равной нулю). Тогда ряд
исправленных единичных результатов
измерения массы образца (m
i)
будет иметь вид: 1,2359; 1,2348; 1,2351 г.

Первоначально проведем поиск грубых
ошибок измерения (промахов). Так как для
данной выборки n < 8 (n = 3), то согласно
[6, с. 82-84] для обнаружения промахов
используем Q-критерий. Единичные
результаты измерений представим в виде
нового ряда с возрастающими величинами
массы образца: 1,2348; 1,2351; 1,2359 г. Проверим
на промахи крайние члены этого нового
ряда, которые кажутся сомнительными:

1. mn (проверяемый результат)
= 1,2359 г ; m
n-1 (результат
соседний с проверяемым) = 1,2351 г ; R (размах)
= 1,2359 — 1,2348 = 0,0011 г ;

.

Из данных табл.1 [6, с.82] выбираем табличное
значение Q-кри­терия (Q
Т)
для n = 3 и Р = 0,95 (принимаем наиболее часто
задаваемое значение вероятности в химии
и химической технологии). Так как

QТ > QР
(0,94 > 0,73), то проверяемый результат
(1,2359 г) не является грубой ошибкой
измерения.

2. mn = 1,2348 г ; mn-1
= 1,2351 г ;

.

И этот проверяемый результат (1,2348 г)
не является промахом, так как Q
Т
> Q
Р (0,94 > 0,27).

Учитывая то, что для непредставительных
выборок (n < 10) не рекомендуется проверять
их подчинение законам распределения,
сделаем допущение о соответствии
единичных результатов измерения массы
образца нормальному закону распределения.
Так как истинный закон распределения
результатов измерений неизвестен, то
для представления конечных результатов
измерения выберем форму 2б(с. 42). Выполним
следующие расчеты, применяя правила
математических действий и округления
с приближенными и случайными числами:

г ;
(г)2;г ;
Пm,пр.=m,пр.+
Sm
;10-4г ;=
4,3 (из таблицы квантилей распределения
Стьюдента при n = 3 для Р = 0,95);
m,пр.
=

=
Е
m
m (делаем допущение, что систематическая
ошибка весов намного превосходит прочие
систематические ошибки и ими можно
пренебречь);
Е
m
= 0,01
10-2
(исходя из обозначения класса точности
весов).

Поскольку
,
то систематическими ошибками можно
пренебречь. Тогда:
П
m,пр.
4,33,291410-4
= 1,415302
10-3
110-3
г (так как в ошибках оставляют не более
двух первых разрядов цифр).

Таким образом, по форме 2б результат
измерения массы образца будет выглядеть
следующим образом:

m = 1,235
0,001 г ; S
m
= 3
10-4
г ; n = 3 ; P = 0,95.

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

Спецификой измерений в химии и химической
технологии (и особенно при выполнении
лабораторных работ) можно считать малое
число, а иногда и отсутствие параллельных
(повторных, кратных) измерений, что
затрудняет оценку погрешностей,
проведение анализа и выбор формы
представления конечных результатов
измерений.

Соседние файлы в папке 100_v9_Глухих В.В.

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Понравилась статья? Поделить с друзьями:
  • Ошибки нейросети картинки
  • Ошибки найти легче чем истину
  • Ошибки неисправности котла иммергаз
  • Ошибки надо уметь прощать а подвиги помнить
  • Ошибки неисправности котла бош 4000