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

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

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

6 голосов
/ 14 февраля 2012

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

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

...