Поделиться через


Изучение операторов ASSERT

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

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

Если операторы 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 );

Или можно использовать вместо него макрос VERIFY:

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

См. также

Ссылки

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