运行时检查失败 #2 - 变量周围的堆栈'...'已损坏

Run-Time Check Failure #2 - Stack around the variable '...' was corrupted

本文关键字:堆栈 已损坏 周围 失败 检查 变量 运行时      更新时间:2023-10-16

我正在处理一个旧的C++项目并尝试调试以下函数:

inline void WriteByteList( /*[in]*/  PBYTE pbytSrc
, /*[in]*/  size_t tSrcSize
, /*[out]*/ LPWSTR pszDest
, /*[out]*/ size_t tDestSize ) {
wchar_t szItem[ 12 ], *pszNumber = &szItem[0];
size_t tSize = sizeof(szItem) / sizeof(szItem[0]);  
for ( size_t tByte=0; tByte<tSize; tByte++ ) {      
if ( tByte == 1 ) {
*pszNumber++ = L' ';
}
_ultow_s((unsigned long)pbytSrc[tByte], pszNumber, tSize, 10);
wcscat_s(pszDest, tDestSize, szItem);
}
}

我真的看不出代码有什么问题。

以下是产生问题的调用:

WriteByteList( (PBYTE)pProgramId->Byte, nliPROGRAM_ID_LEN, szMsg, tMsgSize );

pProgramId 指向一个结构,Byte 成员是一个由 8 个无符号字符组成的数组。 这包含以下值:

128, 0, 1, 1, 1, 1, 1, 1

nliPROGRAM_ID_LEN是一个常数,声明为 8。

szMsg 是一个声明为的数组:

wchar_t szMsg[500];

tMsgSize 是 szMsg 中的元素数:

tMsgSize = sizeof(szMsg) / sizeof(szMsg[0]);

当我循环访问此例程时,我得到:

local variable tSize initialised to 12
pszNumber initialised to point to szItem

循环迭代 0: szItem 包含 '128',后跟 0(空( pszDest 包含 '128'

循环迭代 1: szItem 包含 ' 0' pszDest 包含 '128 0'

循环迭代 2: szItem 包含 ' 1' pszDest 包含 '128 0 1'

循环迭代 3: szItem 包含 ' 1' pszDest 包含 '128 0 1 1'

循环迭代 4: szItem 包含 ' 1' pszDest 包含 '128 0 1 1 1'

循环迭代 5: szItem 包含 ' 1' pszDest 包含 '128 0 1

1 1 1'循环迭代 6: szItem 包含 ' 1' pszDest 包含 '128 0

1 1 1 1 1 1'循环迭代 7: szItem 包含 ' 1' pszDest 包含 '128 0

1 1 1 1 1 1 1'循环完成后,离开函数时将显示消息:

Run-Time Check Failure #2 - Stack around the variable 'szItem' was corrupted.

重写函数:

inline void WriteByteList( /*[in]*/  PBYTE pbytSrc
, /*[in]*/  size_t tSrcSize
, /*[out]*/ LPWSTR pszDest
, /*[out]*/ size_t tDestSize ) {
wchar_t szItem[ 12 ];
size_t tSize = sizeof(szItem) / sizeof(szItem[0]);  
for ( size_t tByte=0; tByte<tSrcSize; tByte++ ) {       
size_t tOffset = 0;
szItem[tOffset] = L' ';
if ( tByte > 0 ) {
tOffset++;
}
_ultow_s((unsigned long)pbytSrc[tByte], &szItem[tOffset], tSize - tOffset, 10);
wcscat_s(pszDest, tDestSize, szItem);
}
}

现在可以工作,没有任何错误。