check that wxString is valid before dumping it

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34895 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2005-07-20 15:32:07 +00:00
parent b903802e08
commit e1f2de5ab3

View File

@@ -399,10 +399,20 @@ wxDbgHelpDLL::DumpUDT(PSYMBOL_INFO pSym, void *pVariable, unsigned level)
{ {
wxString *ps = (wxString *)pVariable; wxString *ps = (wxString *)pVariable;
// take care to use c_str() here as otherwise we might hit an assert in // we can't just dump wxString directly as it could be corrupted or
// wxString code if it is currently locked for writing (i.e. we're // invalid and it could also be locked for writing (i.e. if we're
// between GetWriteBuf() and UngetWriteBuf() calls) // between GetWriteBuf() and UngetWriteBuf() calls) and assert when we
s << _T("(\"") << ps->c_str() << _T(")\""); // try to access it contents using public methods, so instead use our
// knowledge of its internals
const wxChar *p = ps->data();
wxStringData *data = (wxStringData *)p - 1;
if ( ::IsBadReadPtr(data, sizeof(wxStringData)) ||
::IsBadReadPtr(p, sizeof(wxChar *)*data->nAllocLength) )
{
p = _T("???");
}
s << _T("(\"") << p << _T(")\"");
} }
else // any other UDT else // any other UDT
#endif // !wxUSE_STL #endif // !wxUSE_STL