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



              

Описание Функции isArray Проверяет - часть 6


В обоих этих случаях, как и при проверке большинства других предположений, нет возможности проверять предположение с помощью обычных функций или макросов. В этих ситуациях следует использовать технику условной компиляции, которая, как указывалось ранее, должна стать частью комплекта инструментов для проверки утверждений. Поскольку код, который выполняется во время условной компиляции, работает на "живых" данных, нужно предпринять дополнительные меры предосторожности, гарантирующие неизменность состояния программы. В программах на Microsoft Visual C++ и Visual Basic я предпочитаю, если возможно, реализовывать эти типы утверждений в виде отдельных функций. Таким способом можно защитить от изменений любые локальные переменные внутри исходной функции. Кроме того, условно компилированные функции утверждений могут свободно использовать окно Watch (об этом мы поговорим в главе 5, где речь пойдет об отладчике Visual C++). Следующий пример показывает условно компилированную функцию-утверждение ValidatePointerArray, которая выполняет глубокие проверки корректности на массивах данных.

#ifdef _DEBUG

void VaiidatePointerArray ( STDATA * pData, int iCount)

{

// Сначала проверить буфер массива. 

ASSERT ( FALSE == IsBadReadPtr ( pData,

iCount * sizeof ( STDATA *)));

 for ( int i = 0; i < iCount; i++) 

{

ASSERT ( pData[ i ].bFlags < DF_HIGHVAL);

ASSERT { FALSE == IsBadStringPtr ( pDataf i ].pszName,

MAX_PATH));

 }

}

#endif

void PlotDataltems ( STDATA * pData, int iCount)

#ifdef _DEBUG

VaiidatePointerArray ( pData, iCount);

#endif

}

Макрос VERIFY

Прежде чем двигаться дальше, поговорим о макросе VERIFY, который использовался при разработке библиотеки классов Microsoft Foundation Classes MFC). В отладочных построениях этот макрос ведет себя так же, как обычное утверждение: если условие установлено в 0, то VERIFY открывает панель с предупреждающим сообщением. Однако, в отличие от обычного утверждения, в выпускной конфигурации параметр этого макроса остается в исходном коде и считается нормальной частью программной процедуры.




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