From 7caa22a78cfbab6e65a40c44cd9c0b96c5ea283b Mon Sep 17 00:00:00 2001 From: Adeel Mujahid Date: Tue, 30 Apr 2019 22:35:34 +0300 Subject: [PATCH] Compute sizeof array instead of pointer (dotnet/coreclr#24288) * Compute sizeof array instead of pointer * Consolidate element count in dumpStack Commit migrated from https://github.com/dotnet/coreclr/commit/cdc344f7475e9e193b6bf7a454f5782b4d793be8 --- src/coreclr/src/vm/debughelp.cpp | 19 ++++++++++--------- src/coreclr/src/vm/frames.h | 5 ++++- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/coreclr/src/vm/debughelp.cpp b/src/coreclr/src/vm/debughelp.cpp index aa52a18..6f46d0a 100644 --- a/src/coreclr/src/vm/debughelp.cpp +++ b/src/coreclr/src/vm/debughelp.cpp @@ -461,6 +461,7 @@ int dumpStack(BYTE* topOfStack, unsigned len) int nLen = MAX_CLASSNAME_LENGTH * 4 + 400; // this should be enough wchar_t *buff = (wchar_t *) qb.AllocThrows(nLen * sizeof(wchar_t)); + wchar_t *buffEnd = buff + nLen; while (ptr < end) { @@ -476,7 +477,7 @@ int dumpStack(BYTE* topOfStack, unsigned len) if (isRetAddr((TADDR)*ptr, &whereCalled)) { - if (_snwprintf_s(buffPtr, buff+NumItems(buff)-buffPtr-1, _TRUNCATE, W("STK[%08X] = %08X "), (size_t)ptr, *ptr) <0) + if (_snwprintf_s(buffPtr, buffEnd - buffPtr, _TRUNCATE, W("STK[%08X] = %08X "), (size_t)ptr, *ptr) < 0) { return(0); } @@ -519,7 +520,7 @@ int dumpStack(BYTE* topOfStack, unsigned len) ftn = ExecutionManager::GetCodeMethodDesc((PCODE)(*ptr)); } - if(_snwprintf_s(buffPtr, buff+ nLen -buffPtr-1, _TRUNCATE, W("%s "), kind) < 0) + if (_snwprintf_s(buffPtr, buffEnd - buffPtr, _TRUNCATE, W("%s "), kind) < 0) { return(0); } @@ -529,7 +530,7 @@ int dumpStack(BYTE* topOfStack, unsigned len) if (ftn != 0) { // buffer is not large enough - if( formatMethodDesc(ftn, buffPtr, static_cast(buff+ nLen -buffPtr-1)) == NULL) + if (formatMethodDesc(ftn, buffPtr, static_cast(buffEnd - buffPtr)) == NULL) { return(0); } @@ -538,13 +539,13 @@ int dumpStack(BYTE* topOfStack, unsigned len) } else { - wcsncpy_s(buffPtr, nLen - (buffPtr - buff), W(""), _TRUNCATE); + wcsncpy_s(buffPtr, buffEnd - buffPtr, W(""), _TRUNCATE); buffPtr += wcslen(buffPtr); } if (whereCalled != 0) { - if(_snwprintf_s(buffPtr, buff+ nLen -buffPtr-1, _TRUNCATE, W(" Caller called Entry %X"), whereCalled) <0) + if (_snwprintf_s(buffPtr, buffEnd - buffPtr, _TRUNCATE, W(" Caller called Entry %X"), whereCalled) < 0) { return(0); } @@ -552,7 +553,7 @@ int dumpStack(BYTE* topOfStack, unsigned len) buffPtr += wcslen(buffPtr); } - wcsncpy_s(buffPtr, nLen - (buffPtr - buff), W("\n"), _TRUNCATE); + wcsncpy_s(buffPtr, buffEnd - buffPtr, W("\n"), _TRUNCATE); buffPtr += wcslen(buffPtr); WszOutputDebugString(buff); } @@ -561,21 +562,21 @@ int dumpStack(BYTE* topOfStack, unsigned len) if (pMT != 0) { buffPtr = buff; - if( _snwprintf_s(buffPtr, buff+ nLen -buffPtr-1, _TRUNCATE, W("STK[%08X] = %08X MT PARAM "), (size_t)ptr, *ptr ) <0) + if ( _snwprintf_s(buffPtr, buffEnd - buffPtr, _TRUNCATE, W("STK[%08X] = %08X MT PARAM "), (size_t)ptr, *ptr ) < 0) { return(0); } buffPtr += wcslen(buffPtr); - if( formatMethodTable(pMT, buffPtr, static_cast(buff+ nLen -buffPtr-1)) == NULL) + if (formatMethodTable(pMT, buffPtr, static_cast(buffEnd - buffPtr)) == NULL) { return(0); } buffPtr += wcslen(buffPtr); - wcsncpy_s(buffPtr, nLen - (buffPtr - buff), W("\n"), _TRUNCATE); + wcsncpy_s(buffPtr, buffEnd - buffPtr, W("\n"), _TRUNCATE); WszOutputDebugString(buff); } diff --git a/src/coreclr/src/vm/frames.h b/src/coreclr/src/vm/frames.h index d219ac3..434569f 100644 --- a/src/coreclr/src/vm/frames.h +++ b/src/coreclr/src/vm/frames.h @@ -3610,9 +3610,12 @@ public: if (true) { DEBUG_ASSURE_NO_RETURN_BEGIN(GCPROTECT) #define GCPROTECT_BEGININTERIOR(ObjRefStruct) do { \ + /* work around Wsizeof-pointer-div warning as we */ \ + /* mean to capture pointer or object size */ \ + UINT subjectSize = sizeof(ObjRefStruct); \ FrameWithCookie __gcframe( \ (OBJECTREF*)&(ObjRefStruct), \ - sizeof(ObjRefStruct)/sizeof(OBJECTREF), \ + subjectSize/sizeof(OBJECTREF), \ TRUE); \ /* work around unreachable code warning */ \ if (true) { DEBUG_ASSURE_NO_RETURN_BEGIN(GCPROTECT) -- 2.7.4