Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
трпп_2012.docx
Скачиваний:
63
Добавлен:
30.08.2019
Размер:
727.99 Кб
Скачать

8 Классификация ошибок программного обеспечения

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

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

Ошибки пользовательского интерфейса. С программой может быть трудно (или даже невозможно) работать по множеству причин. Их все можно объединить под названием “ошибки пользовательского интерфейса”. Вот несколько разновидностей таких ошибок.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Характерные ошибки программирования:

Вид ошибки

Пример

Неправильная постановка задачи

Правильное решение неверно сформулированной задачи

Неверный метод (алгоритм)

Выбор метода (алгоритма) приводящего к неточному или не эффективному решению задач

Логические ошибки

Неполный учет ситуаций, которые могут возникнуть

Например,

  • неверное указание ветви алгоритма после проверки некоторого условия,

  • неверное условие выполнения или окончания цикла,

  • неполный учет возможных условий,

  • пропуск в программе одного или более блоков алгоритма.

Семантические ошибки

Непонимание работы оператора

Синтаксические ошибки

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

Например,

  • неправильная запись формата оператора,

  • повторное использование имени переменной для обозначения другой,

  • ошибочное использование одной переменной вместо другой,

  • несогласованность скобок,

  • пропуск разделителей.

Ошибки времени выполнения

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

Вопросы для самопроверки:

  1. Дайте определение понятия «программная ошибка».

  2. Перечислите источники ошибок программного обеспечения.

  3. Классифицируйте ошибки программного обеспечения.