Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
161
Добавлен:
10.07.2016
Размер:
2.02 Mб
Скачать

43. Характерные ошибки программистов.

Вид ошибки

Пояснение , пример

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

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

2. Неверный алгоритм

Выбор неверного или неэффективного алгоритма

3. Ошибки анализа

Неправильное программирование алгоритма, большие и не большие логические ошибки

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

непонимание порядка выполнения оператора

5. Грамматические

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

6. Ошибка при выполнении операций

Отсутствие указаний или ограничений, деление на 0

7. Ошибки данных

Неудачное определение возможного диапазона изменение данных

8. Ошибки с документацией

Документация пользователя не отвечает действующему варианту программы

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

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

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

int main()

{

int debug;

if (debug)

cout << "main : вход \n";

….

if (debug)

cout << "main : вызов f1() с параметрами ...\n";

if (debug)

cout << "main : выход из f1() с параметрами ...\n";

if (debug)

cout << "main : выход \n";

}

void f1(....)

{

if (debug)

cout << "f1 : вход с параметрами ...\n";

if (debug)

cout << "f1 : выход с выходными параметрами ...\n";

}

45. Инструментальная отладка.

Инструменты, снижающие потребность в отладке

1. Сделать так, чтобы отладка нужна была как можно реже. Для этого применяются:

1. Самопроверка программы в ключевых точках

2. Модульное тестирование. Проверка поведения программы по частям

3. Статический анализ кода - проверка кода на стандартные ошибки по недосмотру

4. Высокая культура программирования - использование паттернов проектирование

5. Соглашения об именовании

6. Прозрачное поведение отдельных блоков кода

7. Широкое использование проверенных внешних библиотек

46. Тестирование по. Невозможность исчерпывающего тестирования.

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

Необходимая полнота тестирования.

Очевидным кажется, что в программе должна быть проверена каждая ветка программы на всех наборах данных. При таком количестве ситуаций(2^64) программу, которая работает одну миллисекунду, пришлось бы тестировать на протяжении трёхсот миллионов лет. Таким образом, даже в таких простых примерах, реализовать исчерпывающее тестирование невозможно. Тестовые примеры должны подбираться очень тщательно. Часто проводят многократное тестирование одних и тех же ветвей, тратя на это большое количество времени. Каждый тестовый пример должен проверять какую-нибудь новую ветвь программы. Задача тестирования состоит в том, чтобы создать для программы предельно нагруженный напряжённый режим работы, а это требует от программиста хорошего воображения и критического отношения к своей программе.