Отладка приложений



         

Как и что следует проверять с помощью утверждений


Проверять нужно все — любое условие, потому что это может пригодиться для исправления ошибок в будущем. Не переживайте, что включение слишком большого количества утверждений будет препятствовать работе программы — утверждения обычно активны только в отладочных построениях, а создаваемые ими возможности поиска ошибок более чем оправдывают небольшое падение эффективности программы.

Подчеркну, что операторы утверждений не должны изменять те переменные или состояния, которые они контролируют. Считайте, что все данные, которые проверяются в утверждениях, имеют атрибут "только для чтения". Поскольку утверждения активны только в отладочных построениях, то любая попытка модифицировать данные с их помощью приведет к изменению поведения программы в отладочных и выпускных конфигурациях, и проследить эти различия будет чрезвычайно трудно.

Правила использования утверждений

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

// Неправильный способ записи утверждения. Какой параметр был

// неправильным?

BOOL GetPathltem ( int i, LPTSTR szltem, int iLen)

{

ASSERT ( ( i > 0 ) &&

( NULL != szltem ) && 

( ( iLen > 0) && ( iLen < MAX_PATH) ) && 

( FALSE = IsBadWriteStringPtr ( szltem, iLen)));

}

// Подходящий способ. Каждый параметр проверяется

// индивидуально, так что вы можете видеть, какой из них неправильный.

BOOL GetPathltem ( int i, LPTSTR szltem, int iLen)

{

ASSERT ( i > 0);

ASSERT ( NULL != szltem);

ASSERT ( ( iLen > 0) && ( iLen < MAX_PATH));




Содержание  Назад  Вперед