这个 C++ 代码有点蹩脚,但我需要维护它。我似乎无法弄清楚“缓冲区太小”的问题。我正在使用 Visual Studio 2010。我将根据我在调试器中看到的值提出重现所需的最少代码。抱歉,我不会测试实际的代码段本身。此外,由于我的系统剪贴板在调试时“忙”,我不能只是复制和粘贴,所以一些错误可能会在某处蔓延,但我会仔细检查内容。相信我,你不想看到整个功能 - 太长了,没有任何意义 :)
来自 tchar.h
#define _tcsncpy_s wcsncpy_s
从 afxstr.h:
typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > > CString;
来自 WinNT.h:
typedef WCHAR TCHAR, *PTCHAR;
哦,伙计,这些宏似乎永远不会结束。我会停在这里。最后,来自 myfile.cpp:
CString str; // Actually a function parameter with value "07/02/2010"
DWORD nIndex = 10;
DWORD nLast = 0;
LPCTSTR psz = (LPCTSTR) str; // Debugger says that it also gets "07/02/2010".
CString s;
_tcsncpy_s(
s.GetBuffer((int) (nIndex - nLast + 1)), // I added the " + 1" part hoping to fix a bug, but that changed nothing
nIndex - nLast,
psz + nLast,
(size_t) (nIndex - nLast)
);
有了这个我打了一个断言,调试器tcsncpy_s.inl
在最后打开以下代码:
53 ...
54 if (available == 0)
55 {
56 if (_COUNT == _TRUNCATE)
57 {
58 _DEST[_SIZE - 1] = 0;
59 _RETURN_TRUNCATE;
60 }
61 RESET_STRING(_DEST, _SIZE);
=>62 _RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);
63 }
64 _FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);
65 _RETURN_NO_ERROR;
66 }
67
68
调试器指向第 62 行:_RETURN_BUFFER_TOO_SMALL
. 不幸的是,我无法在tcsncpy_s.inl
. 也许有经验的编码员可以告诉我这里发生了什么?我相信(也许是错误的)这段代码已经很老了,并且没有考虑到 Unicode。解决这个问题的最佳方法是粘在旧的 N 支蹩脚的枪上(请不要使用 C++0X 技巧或其他花哨的东西)——我只想在子弹伤口上贴上补丁。