【发布时间】:2018-09-14 06:57:59
【问题描述】:
这里有一个关于 C++ Stackwalker 的问题: https://github.com/JochenKalmbach/StackWalker
#define _TRUNCATE ((size_t)-1)
enum
{
STACKWALK_MAX_NAMELEN = 1024
};
void StackWalker::OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName)
{
CHAR buffer[STACKWALK_MAX_NAMELEN];
size_t maxLen = STACKWALK_MAX_NAMELEN;
#if _MSC_VER >= 1400
maxLen = _TRUNCATE;
#endif
_snprintf_s(buffer, maxLen, "SymInit: Symbol-SearchPath: '%s', symOptions: %d, UserName: '%s'\n",
szSearchPath, symOptions, szUserName);
}
maxlen 首先设置为 1024,然后如果 VC++ 版本 >= 1400(它是)则设置为 (unsigned)-1,换句话说,至少为 UINT_MAX。
然后将maxlen传递给_snprintf_s,所以如果字符串大于1024个字符会再次导致缓冲区溢出。
我在这里遗漏了什么吗?将 maxlen 设置为 UINT_MAX 的原因可能是什么?使用安全的字符串函数但没有安全性?
【问题讨论】:
-
注意,代码不使用
(unsigned)-1,而是(size_t)-1,即SIZE_MAX。 -
很确定 size_t 总是无符号的
-
如果你想要
UINT_MAX,请使用UINT_MAX!不能保证(size_t)-1 == UINT_MAX. -
@ServeLaurijssen
size_t是一些 unsigned 类型。它可能与unsigned、unsigned long或其他相同。 -
没错,
SIZE_MAX./UINT_MAX是一个附带问题,但您可以修改帖子以不包括分心并提高清晰度。
标签: c++ c visual-c++