Это были времена, с которыми я работал с C++, поэтому, пожалуйста, несите меня.
Я разработчик С#, но это консольное приложение C++ сломалось, и теперь я управляю им. В настоящее время я отлаживаю его с помощью VS2010.
Из-за конфиденциальности и чистого количества кода я не могу опубликовать весь код.
Консоль по существу считывает и анализирует XML файл размером 6 МБ. Все, что работало до вчерашнего дня, где я получаю "Точка обнаружения нарушения доступа 0xcccccccc" со следующей строкой кода:
strtok_s(0, "=", &token);
Когда я помещаю курсор над "& token", я вижу ошибку "token = 0xcccccccc".
Я хотел прояснить несколько вещей:
strtok_s(buf, "=", &token);
strtok_s(0, "=", &token);
strtok_s(0, "=", &token);
что делает 0 в качестве параметра? Я предполагаю, что в первом * strtok_s * токен будет указывать на первый экземпляр char '=' в buf. Но во второй инструкции, какая цель "0"? Он ищет "=" внутри токена?
Очевидно, что что-то изменилось в XML. Итак, наконец, учитывая, что это синтаксический анализ файла размером 6 МБ (строки текста /870 КБ) и функция C++, которая читает XML, - это 700+ строки долго, что лучший способ отладить это? И нет, разрезание моих запястий еще не конкретизировано....
Благодарю.
Передача 0 в качестве первого аргумента (возможно, NULL более читаема) означает "найти следующий токен в строке". Увидев значение 0xcccccccc как значение последнего аргумента ("токен" - это неправильное имя) сообщает вам, что строка никогда не искала первый токен. Другими словами, вызов strtok_s(buf, "=". &token)
и не был выполнен. Или значение "токена" не сохранилось из предыдущего вызова strtok_s(). Поэтому он больше не знает, какую строку нужно искать. Kaboom.
В любом случае это сложная ошибка в коде, на который не влияет сама строка.
Вот ссылка на MSDN, которая объясняет использование strtok_s
с помощью примеров.
Первый параметр может быть NULL, если вы вызывали strtok_s
как минимум один раз, а третий параметр уже содержит указатель на последний найденный токен. В таком случае следующий вызов strtok_s
может занять его, откуда последний вызов нашел токен.
В частности, в вашем случае нарушение доступа обычно указывает на переполнение буфера или мусор в указателе. Что-то случилось с token
переменной, что привело к тому, что ее значение стало 0xcccccccc
. Вы должны указать код, в котором token
принимает это значение, и найти причину перерасхода.
сначала af all, я бы DIFF "сломанный" XML-код и рабочий. Я ДУМАЮ, что вы обнаружите, что сломанный имеет меньше = где ожидалось.
0 или bette NULL в качестве первого параметра, будет просто повторно использовать токен
strtok_s
? Он не работает сstd::string
(это то, что вы хотите использовать для хранения ваших строк), и его нельзя использовать со строковыми литералами. Просто анализируйте, используя строковые итераторы.