Использование VERIFY вместо ASSERT

Предположим, что отладочная версия приложения MFC выполняется без проблем. Однако версия выпуска того же приложения завершается аварийно, возвращает неверные результаты и (или) демонстрирует аномальное поведение.

Такая ситуация может возникать, когда вы помещаете важный код в оператор ASSERT, чтобы проверить правильность его выполнения. Так как операторы ASSERT в сборке выпуска программы MFC закомментированы, этот код в сборке выпуска не выполняется.

Если вы с помощью оператора ASSERT проверяете успешность вызова функции, попробуйте вместо него использовать VERIFY. Макрос VERIFY оценивает собственные аргументы как в сборке отладки, так и в сборке выпуска приложения.

Другой рекомендуемый способ — назначение возвращаемого значения функции временной переменной, а затем проверка этой переменной в операторе ASSERT.

Рассмотрим следующий фрагмент кода.

enum {
    sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

Этот код прекрасно работает в отладочной версии приложения MFC. В случае сбоя вызова calloc( ) появляется диагностическое сообщение, в котором указан файл и номер строки. Однако в окончательной сборке приложения MFC:

  • вызов calloc( ) никогда не происходит, при этом buf не инициализируется, или

  • strcpy_s( ) копирует "Hello, World" в случайный фрагмент памяти, что может привести к сбою приложения или зависанию системы, или

  • free() пытается освободить память, которая никогда не была выделена.

Чтобы правильно использовать ASSERT, необходимо изменить пример кода следующим образом:

enum {
    sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

Можно также вместо ASSERT использовать VERIFY:

enum {
    sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

См. также

Устранение проблем сборки выпуска