c++ - 在 Debug模式下运行时缓冲区溢出

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

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

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());

我似乎无法弄清楚是什么原因造成的……有什么线索吗?

最佳答案

尝试将调用更改为

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

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

关于c++ - 在 Debug模式下运行时缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14456288/

相关文章:

c++ - C++ 中的智能引用

c++ - 如何使用一张 map 存储不同的功能

c - 如何创建具有自定义标记值的可变参数函数?

c++ - 如何将 boost::any 打印到流中?

c++ - 虚拟指针大小根据类数据成员而变化

c++ - Ruby rb_define_method - 无效转换

使用可变数量的参数调用 exec?

c++ - 允许在 VS2008 Native C++ 项目中进行特定于开发人员的设置

visual-studio-2008 - 我可以从 Visual Studio 中的构建后事件调用的控制台应用程序发送错误吗?

c# - 如何在 Visual Studio 输出窗口中运行控制台应用程序,而不是打开新的命令提示符?