Средства тестирования приложений для разработчиков


Сообщения об ошибках и предупреждениях Настройка фильтра


Rational Purify по своей природе способна выловить не только ошибки, связанные с потерей памяти, но также ряд других не менее важных ошибок. Следует определить, что все сообщения делятся на две категории: ОШИБКИ и ПРЕДУПРЕЖДЕНИЯ. Во время запуска программа будет дотошно собирать все виды сообщений, и только настройка фильтра позволит отказаться от заведомо лишней, ненужной информации. Система фильтров Purify способна настроить не только уровень "придирчивости" к программе, но и количество исследуемых внешних модулей (чтобы разработчик мог концентрироваться только на собственных ошибках и не огорчался по поводу системных ошибок).

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

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

Попробуем рассмотреть некоторые сообщения Purify c комментариями и примерами:

ABR: Array Bounds Read Выход за пределы массива при чтении #include <iostream.h> #include <windows.h> int main(int, char **) { int *ptr = new int[2]; //Определить число элементов ptr[0] = 0; ptr[1] = 1; for (int i=0; i <= 2; i++) { //ОШИБКА //ABR when i is 2 cerr << "ptr[" << i << "] == " << ptr[i] << '\n'; } delete[] ptr; return(0); }

ABW: Array Bounds Write Выход за пределы массива при записи #include <iostream.h> #include <windows.h> int main(int, char **) { int *ptr = new int[2]; //Определить число элементов for (int i=0; i <= 2; i++) { //ОШИБКА ptr[i] = i; cerr << "ptr[" << i << "] == " << ptr[i] << '\n'; //ABW + ABR when i is 2 } delete[] ptr; return(0); }

ABWL: Late Detect Array Bounds Write Cообщение указывает, что программа записала значение перед началом или после конца распределенного блока памяти #include <iostream.h> #include <windows.h> int main(int, char **) { int *ptr = new int[2]; //Определить число элементов for (int i=0; i <= 2; i++) { //ОШИБКА ptr[i] = i; cerr << "ptr[" << i << "] == " << ptr[i] << '\n'; } delete[] ptr; //ABWL: ОШИБКА return(0); }

BSR: Beyond Stack Read сообщение указывает, что функция в программе собирается читать вне текущего указателя вершины стека #include <windows.h> #include <iostream.h> #define A_LOT 256 int * setup_values(void) { int values[A_LOT]; //ОШИБКА: должен быть статичным for (int i=0; i < A_LOT; i++) { values[i] = i; } return(values); //ОШИБКА: неизвестно, что возвращать } int main(int, char **) { int *values; values = setup_values(); for (int i=0; i < A_LOT; i++) { //BSR: значения из "setup_values" больше не находятся в стеке cerr << "element #" << i << " is " << values[i] << '\n'; } return(0); }

BSW: Beyond Stack Write сообщение указывает, что функция в программе собирается писать вне текущего указателя вершины стека (пример см.


- Начало -  - Назад -  - Вперед -



Книжный магазин