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



              

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


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

}

Следует всегда стремиться к полной проверке условия. Например, если контролируемая функция в качестве параметра принимает указатель на функцию, и вы просто проверяете этот параметр на равенство значению NULL

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

// Пример проверки только части ошибочного условия

BOOL EnumerateListltems ( PFNELCALLBACK pfnCallback)

{

ASSERT ( NULL != pfnCallback);

}

Для полной проверки корректности указателя, в операторе ASSERT можно также использовать API-функцию isBadCodePtr:

// Пример полной проверки ошибочного условия

BOOL EnumerateListltems (PFNELCALLBACK pfnCallback)

{

ASSERT ( FALSE = IsBadCodePtr ( pfnCallback));

}

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

 Пример неправильного определения аргумента оператора утверждения: 

 отрицательное значение nCount не будет обнаружено функцией утверждения.

 Function UpdateListEntries(ByVal nCount As Integer) as Integer

Debug.Assert nCount

.

.

.

End Function

' Здесь аргумент вызова определен так (nCount>0) , что Assert-функция 

' правильно отреагирует на отрицательное значение nCount 

Function UpdateListEntries(ByVal nCount As Integer) as Integer

 Debug.Assert nCount > 0

.

.

.

End Function

В первом примере, по существу, проверяются все значения nCount, не равные нулю, так что неправильные значения параметра (nCount <= 0) не будут обнаружены функцией Assert. Во втором условие проверки сформулировано точнее (nCount > 0), так что утверждение, во-первых, оказывается самодокументированным (т.


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