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


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


Неправильная индикация дескриптора #include <iostream.h> #include <windows.h> static long get_alignment(void) { SYSTEM_INFO sys_info; GetSystemInfo(&sys_info); return(sys_info.dwAllocationGranularity); } int main(int, char **) { const long align = get_alignment(); HANDLE file_handle = CreateFile("file.txt", GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (file_handle == INVALID_HANDLE_VALUE) { cerr << "ОШИБКА файла\n"; return(1); } HANDLE map_handle = CreateFileMapping(file_handle, NULL, PAGE_READWRITE, 0, align, "mymap"); if (map_handle == INVALID_HANDLE_VALUE) { cerr << "Unable to create actual mapping\n"; return(1); } char *pointer = (char *) MapViewOfFile(map_handle, FILE_MAP_WRITE, 0, 0, align); if (pointer == NULL) { cerr << "Unable to map into address space\n"; return(1); } strcpy(pointer, "hello\n"); //HIU: map_handle все еще доступный и правильный //HIU: file_handle все еще доступный и правильный return(0); }

ILK: COM Interface Leak Утечка COM интерфейса #include <windows.h> int main(int, char **) { LPMALLOC lpIm; CoGetMalloc( MEMCTX_TASK, (LPMALLOC*)&lpIm); IMalloc_Release(lpIm); //НЕВЕРНЫЙ ЗАПРОС return(0); }

IPR: Invalid Pointer Read Ошибка обращения к памяти, когда программа пытается произвести чтение из недоступной области #include <iostream.h> #include <windows.h> int main(int, char **) { int *ptr = (int *) 0x80000000; //ОШИБКА: Указатель на зарезервированную часть адресного пространства for (int i=0; i < 2; i++) { //IPR: Попытка обращения к недопустимому указателю cerr << "ptr[" << i << "] == " << ptr[i] << '\n'; } return(0); }

IPW: Invalid Pointer Write Ошибка обращения к памяти, когда программа пытается произвести запись из недоступной области #include <iostream.h> #include <windows.h> int main(int, char **) { int *ptr = (int *) 0x80000000; //ОШИБКА: Указатель на зарезервированную часть адресного пространства for (int i=0; i < 2; i++) { //IPW + IPR: Попытка обращения к недопустимому указателю ptr[i] = i; cerr << "ptr[" << i << "] == " << ptr[i] << '\n'; } return(0); }

MAF: Memory Allocation Failure Ошибка в запросе на распределение памяти #include <iostream.h> #include <windows.h> #define VERY_LARGE 3000000000 //Больше, чем можем получить int main(int, char **) { int *ptr = new int[VERY_LARGE / sizeof(int)]; //MAF: нельзя так много if (ptr == 0) { cerr << "Failed to alloc, as expected\n"; return (1); } else { cerr << "Got " << VERY_LARGE << " bytes @" << (unsigned long)ptr << '\n'; delete[] ptr; return(0); } }

MLK: Memory Leak Утечка памяти #include <windows.h> #include <iostream.h> int main(int, char **) { (void) new char[1000]; (void) new char[1000]; (void) new char[1000]; (void) new char[1000]; (void) new char[1000]; //5 килобайт потерь return(0); }

ИЛИ void All::OnAppAbout() { char *alex; //Указатель alex=(char *)malloc(20000); //MLK: берем, но не отдаем CAboutDlg aboutDlg; aboutDlg.DoModal(); }

MPK: Potential Memory Leak Потенциальная утечка памяти (возникает когда производится операция над массивом не с нулевого элемента) #include <iostream.h> #include <windows.h> int main(int, char **) { static char *ptr = new char[500000]; ptr += 100; //MPK: обнаружится, как потенциально пропущенное return(0); }

NPR: Null Pointer Read Попытка чтения с нулевого адреса #include <iostream.h> #include <windows.h> int main(int, char **) { int *ptr = (int *) 0x0; //ОШИБКА for (int i=0; i < 2; i++) { //NPR: ошибка доступа cerr << "ptr[" << i << "] == " << ptr[i] << '\n'; } return(0); }

NPW: Null Pointer Write Попытка записи в нулевой адрес #include <iostream.h> #include <windows.h> int main(int, char **) { int *ptr = (int *) 0x0; //ОШИБКА for (int i=0; i < 2; i++) { //NPW: ошибка доступа ptr[i] = i; cerr << "ptr[" << i << "] == " << ptr[i] << '\n'; } return(0); }

UMC: Uninitialized Memory Copy Попытка копирования непроинициализированного блока памяти #include <iostream.h> #include <windows.h> #include <string.h> int main(int, char **) { char *ptr = new char[10]; char var[10]; memcpy(var, ptr, 10); //UMC предупреждение delete[] ptr; return(0); }

UMR: Uninitialized Memory Read Попытка чтения непроинициализированного блока памяти #include <iostream.h> #include <windows.h> int main(int, char **) { int *ptr = new int; cerr << "*ptr is " << *ptr << '\n'; //UMR: нет значения в ptr delete[] ptr; return(0); }

Подведем итоги статьи описанием основных возможностей Purify:

  1. Отслеживание ошибок доступа к памяти
  2. Сбор и вывод статистики по использованию памяти
  3. Использование комплексного подхода к тщательному тестированию
  4. Технология OCI - Object Code Insertion позволяет детально отследить и выловить ошибку не только в контролируемом модуле, но и в модулях DLL сторонних разработчиков
  5. Тестирование ActiveX, COM/DCOM, ODBC, DLL
  6. Настраиваемый, двухуровневый способ тестирования (придирчивости) приложений
  7. Интеграция с Visual Studio
  8. Открытое API.Позволяет дописывать разработчикам собственные модули и присоединять их.
  9. Совместная работа с любым отладчиком
  10. Тестирование системных вызовов

Связаться с автором и получить дополнительную информацию можно по e-mail:

См. также:

 


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



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