声明硬编码的std :: string会导致缓冲区溢出

时间:2012-02-13 21:23:53

标签: c++ string boost buffer-overflow

我的程序中有以下行导致运行时警告:

if (!is_directory("C:\\NGFMS_Debug\\Files") && !create_directories("C:\\NGFMS_Debug\\Files"))

警告文本如下:“XXX.exe中发生缓冲区溢出,损坏了程序的内部状态。”

警告来自对“is_directory(...)”的调用。我猜测字符串的空间没有被分配,但我认为这样的语法是合法的。

is_directory函数是boost / filesystem.hpp的一部分,我使用以下命名空间:

using namespace boost;
using namespace boost::filesystem;
using namespace std;

这是在VS2005 C ++下编译的。有什么想法吗?

更新

我尝试了几个不同的东西并逐步完成了代码,这就是我找到的。

如果我这样做

char* path_chars_c;
path_chars_c = "C:\\Debug\\Files";
string path_str_c(path_chars_c);

变量path_chars_c包含适当的字符串,但变量path_str_c在初始化后包含垃圾。所以看起来字符串初始化在这里被打破了。有没有人见过这个?

1 个答案:

答案 0 :(得分:6)

这是一个令人惊讶的错误 - 这似乎是一个非常标准的使用boost :: filesystem :: is_directory()。您是否尝试过使用调试器来查看问题发生的位置?

我想到了一种(远程)可能性 - 如果您将启用了NDEBUG的库与禁用NDEBUG的库链接起来,则可能会遇到麻烦。特别是,一些boost数据类型将在打开调试时分配一些额外的调试字段。因此,如果一个对象是由一段代码创建的,该代码认为调试已关闭,但后来又被另一段认为调试打开的代码使用,则可能会出现随机内存错误(例如缓冲区溢出)。