Объявление жестко закодированного std::string вызывает переполнение буфера

У меня есть следующая строка в моей программе, которая вызывает предупреждение во время выполнения:

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 ответ

Решение

Это удивительная ошибка, которая выглядит как стандартное использование boost::filesystem::is_directory(). Вы пытались войти в него с отладчиком, чтобы увидеть, где происходит проблема?

На ум приходит одна (удаленная) возможность - если вы связываете библиотеки с включенным NDEBUG с библиотеками, у которых отключен NDEBUG, вы можете столкнуться с проблемами. В частности, несколько типов данных boost будут выделять дополнительные поля отладки при включении отладки. Поэтому, если объект создается одним фрагментом кода, который считает, что отладка отключена, но затем используется другим фрагментом кода, который считает, что отладка включена, тогда вы можете получить случайные ошибки памяти (например, переполнение буфера).

Другие вопросы по тегам