/*
* The following values are non-zero, constant, odd, large, and atypical
* Non-zero values help find bugs assuming zero filled data.
* Constant values are good so that memory filling is deterministic
* (to help make bugs reproducible). Of course it is bad if
* the constant filling of weird values masks a bug.
* Mathematically odd numbers are good for finding bugs assuming a cleared
* lower bit, as well as useful for trapping on the Mac.
* Large numbers (byte values at least) are less typical, and are good
* at finding bad addresses.
* Atypical values (i.e. not too often) are good since they typically
* cause early detection in code.
* For the case of no-man's land and free blocks, if you store to any
* of these locations, the memory integrity checker will detect it.
*/
static unsigned char _bNoMansLandFill = 0xFD; /* fill no-man's land w/this */
static unsigned char _bDeadLandFill = 0xDD; /* fill free objects w/this */
static unsigned char _bCleanLandFill = 0xCD; /* fill new objects w/this */
Figure 2 AfxAssertValidObject
void AFXAPI AfxAssertValidObject(const CObject* pOb,
LPCSTR lpszFileName, int nLine)
{
if (pOb == NULL) {
TRACE0("ASSERT_VALID fails with NULL pointer.\n");
•
•
•
}
if (!AfxIsValidAddress(pOb, sizeof(CObject))) {
TRACE0("ASSERT_VALID fails with illegal pointer.\n");
•
•
•
}
// check to make sure the VTable pointer is valid
ASSERT(sizeof(CObject) == sizeof(void*));
if (!AfxIsValidAddress(*(void**)pOb, sizeof(void*), FALSE)) {
TRACE0("ASSERT_VALID fails with illegal vtable pointer.\n");
•
•
•
}
if (!AfxIsValidAddress(pOb,
pOb->GetRuntimeClass()->m_nObjectSize, FALSE)) {
TRACE0("ASSERT_VALID fails with illegal pointer.\n");
•
•
•
}
pOb->AssertValid();
}