Ошибки инструментария и других компонентов системы
Ошибки самого компилятора или интерпретатора. Очень редко, но и такое бывает. Например, лет пять назад мною была обнаружена следующая ошибка:
// bug BC++3.1 & MSVC++4.2 print 0, it is wrong
// watcom & others print 2, it is right
#include<stdio.h>
void main()
{
int x=10,y=8;
x>y?x-=y:y-=x;
printf("%d\n",x);
}
BorlandC3.1 и MSVisualC 4.2 выдавали ноль, а остальные компиляторы выдавали 2. Ниже идет пример еще одной, обнаруженной мной, ошибки для любителей C++
/*
msvc++5.0
*/
#include<new>
struct A{
};
typedef A TYPE;
typedef TYPE* pTYPE;
void main()
{
pTYPE p = new TYPE;
pTYPE* pp = (pTYPE*)new char[sizeof(pTYPE)];
new(pp) pTYPE(p);
//pp->~pTYPE(); // pp[0].~pTYPE(); // don't work, why?
pp[0].pTYPE::~pTYPE();
delete [] (char*)pp;
delete p;
}
Ну и чтобы совсем уж быть полным, приведу недавно обнаруженную мной ошибку в СУБД MySQL. Ее обещали исправить только в четвертой версии. Ниже приведены два SQL-запроса из программы анализа посетителей веб-сайта. Первый работает нормально. Второй очень похож на первый и полностью удовлетворяет синтаксису SQL. Но второй запрос MySQL отказывается выполнять и возвращает пустую таблицу.
SELECT COUNT(DISTINCT ip), COUNT(*), CONCAT(shref,href) FROM hit GROUP BY 3
SELECT COUNT(*), CONCAT(shref, href) FROM hit GROUP BY 2
После классификации ошибок давайте рассмотрим методы их поиска. В первую очередь, один простой и, казалось бы, очевидный совет: "надо думать, анализировать, почему программа не работает так, как было задумано, что надо в ней исправить". Никакой самый навороченный отладчик за вас ошибку не найдет. Никакая самая лучшая методика не найдет и не ускорит поиск ошибки, если вы не включите мозги по полной программе и не сосредоточитесь целиком и полностью на поимке ошибки. Итак, допустим вами, пользователем или тестирующим, было зафиксировано некорректное поведение программы. Что делать? Ниже перечислены методы в порядке их приоритетности, которые используют многие программисты.