Просмотр содержимого документа
«Лекция. Ошибки в программном коде»
Ошибки
Классификация ошибок
- Ошибки времени компиляции: синтаксические ошибки и ошибки, связанные с типами.
- Ошибки времени редактирования связей. Это ошибки, обнаруженные редактором связей при попытке объединить объектные файлы в выполнимый модуль.
Классификация ошибок
- Ошибки времени выполнения. Это ошибки, обнаруженные проверками в работающей программе: ошибки, обнаруженные компьютером; ошибки, обнаруженные библиотекой; ошибки, обнаруженные кодом пользователя.
- Логические ошибки. Это ошибки, найденные программистом в поисках причин неправильных результатов.
Предполагается, что программа удовлетворяет следующим условиям:
- Должна вычислить желаемые результаты при всех допустимых входных данных.
- Должна выдавать осмысленные сообщения обо всех неправильных входных данные.
- Не обязана беспокоиться о некорректном поведении аппаратного обеспечения.
- Не обязана беспокоиться о некорректном поведении системного программного обеспечения.
- Она может завершать работу после обнаружения ошибки.
Три подхода к разработке приемлемого ПО:
- Организовать ПО так, чтобы минимизировать количество ошибок.
- Исключить большинство сделанных ошибок в ходе отладки и тестирования.
- Убедиться, что оставшиеся ошибки не серьезны.
Источники ошибок
- Плохая спецификация.
- Неполные программы.
- Непредусмотренные аргументы.
- Непредусмотренные входные данные.
- Непредусмотренные состояния.
- Логические ошибки.
Ошибки времени компиляции
int area(int length, int width);
//вычисление площади треугольника
Синтаксические ошибки
int s1=area(7;
int s2=area(7);
Int s3=area(7);
int s1=area(‘7);
Ошибки, связанные с типами
int x0=arena(7);
int x1=area(7);
int x2=area(“seven”, 2)
Не ошибки
int x4=area(10, -7);
int x5=area(10.7, 9.3);
char x6=area(100, 9999);
Ошибки времени редактирования связей
Каждая функция в программе должна быть объявлена с одним и тем же типом во всех отдельно компилируемых частях, в которых она используется. Каждая функция должна быть определена в программе один раз.
int area(int length, int width);
int main()
{
int x = area(2, 3);
}
double area(double x, double y)
{
/* … */
}
int area(int x, int y, char unit)
{
/* … */
}
Ошибки времени выполнения программы
int area(int length, int width)
{
{
int x=-1;
return length*width;
}
int y=2;
int z=4;
int framed_area(int x, int y)
{
//…
int area1=area(x, y);
return area(x-2, y-2);
int area2=framed_area(1, z);
}
int area3=framed_area(y, z);
int main()
double ratio=double(area1)/area3; //преобразуем в тип double, чтобы выполнить деление с плавающей точкой
}
Обработка ошибок в вызывающем коде
1. «Пользователь должен быть внимательным!»
Обработка ошибок в вызывающем коде
Обработка ошибок в вызываемом коде
Сообщения об ошибках
Отладка
Поиск и удаление ошибок (багов).
Отладка
- Компилируем программу.
- Редактируем связи.
- Выполняем программу и проверяем, делает ли она то, для чего предназначена.
Цель: структурировать программу так, чтобы минимизировать вероятность ошибок и максимально увеличить вероятность их обнаружения.
Практические советы по отладке
- Хорошо комментируйте свою программу (название, цель, автор, дата, номер версии, какие фрагменты кода могут вызвать сложности, основные идеи проекта, как организован код, какие сделаны предположения о вводных данных, чего в программе пока не хватает).
- Используйте осмысленные имена.
- Используйте последовательную схему кода.
- Разбивайте программу на небольшие фрагменты, каждый из которых выражает определенные логически выделенные действия (размер функции не должен превышать страницу или две).
- Избегайте сложных выражений (пытайтесь избегать вложенных циклов, вложенных инструкций, сложных условия).
- Где только можно, используйте библиотечные функции, а не собственный код.