【问题标题】:Buffer overrun when running in debug mode在调试模式下运行时缓冲区溢出
【发布时间】:2013-01-05 13:11:17
【问题描述】:

在调试模式下运行我们的游戏时,我遇到缓冲区溢出崩溃 - 调用堆栈是香蕉(看起来它卡在递归循环中)但是我将崩溃跟踪到以下函数:

std::wstring formatWstring(const wchar_t *first, ...)
{
    wchar_t str[4096];
    va_list marker;
    va_start(marker, first);
    vswprintf_s(str, sizeof(str), first, marker);
    va_end(marker);
    return str;
}

按以下方式调用:

std::wstring gmh = io::lexicon->getString("FE_gamemode_header");
std::wstring gms = io::lexicon->getString(formatString("FE_gamemode_%s", game->getCurrentMapGameMode().c_str()));
m_gameMode = formatWstring(L"%S: %S", gmh.c_str(), gms.c_str());

我似乎无法弄清楚这到底是怎么回事……有什么线索吗?

【问题讨论】:

  • sizeof(str) 应该是sizeof(str)/sizeof(wchar_t)
  • @LuchianGrigore 这应该是答案。
  • @AlexeyFrunze IDK 如果这是实际问题。
  • 致 OP:不要忽视阅读您正在使用的功能的说明。
  • @LuchianGrigore 这肯定会导致缓冲区溢出。

标签: c++ visual-studio-2008 variadic-functions widechar printf


【解决方案1】:

尝试将调用更改为

vswprintf_s(str, sizeof(str)/sizeof(wchar_t), first, marker);

您操作的尺寸有误。 wchar_t 不保证 char 的大小为 1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-19
    • 2014-10-05
    • 2019-07-15
    • 2015-12-16
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2013-10-28
    相关资源
    最近更新 更多