2014-01-27 3 views
0

Я пытаюсь создать функцию-член для создания объекта quickxml :: xml_document <> из строки, перегруженных для std :: string, const std :: string и const знак * произведение хорошо.RapidXml - переполнение буфера при разборе char *

Когда я пытаюсь загрузить char * напрямую, я получаю переполнение буфера, используя скопированную строку works (чего я бы хотел избежать, из-за длинных строк).

Моя система: тестирование Debian с г ++ 4.8.2

EDIT: Я знаю, что строка будет изменена rapidxml (для сопзЬ полукокса * объекты, поэтому я создаю копию (за станд :: вектор))

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

#include <iostream> 
#include <vector> 
#include "rapidxml.hpp" // RapidXml 1.13 


int main() { 
    char * str = (char *)"<efa><departures>data</departures></efa>"; 
    rapidxml::xml_document<> doc; 

// I'd like to avoid the copying in the following code block 
# if 0 
     std::vector<char> writable; 
     if (str) { 
      while (* str) { 
       writable.push_back(* str); 
       str++; 
      } 
     } else { 
      writable.push_back('\0'); 
     } 
#  define str &writable[0] 
# endif 

    std::cout << "pre" << std::endl; 
    doc.parse<rapidxml::parse_no_data_nodes> (str); 
    std::cout << "post" << std::endl; 

    std::cout << doc.first_node()->name() << std::endl; 
} 
+0

Ответы ниже правильные, но есть более простые способы копирования строки, например: 'std :: string writable (str);' – Roddy

ответ

2

str указывает на строку буквального, так мод ifying это незаконно.

Из docs:

функции xml_document :: синтаксический

[...] переданная строка будет изменена анализатором [...]

Вы может изменить декларацию на

char str[] = "<efa><departures>data</departures></efa>"; 
+0

works :) Я сначала использовал char str [] = (char *) "", который не работает Почему char [] работает, когда char * вылетает ?? – tempanon

2

RapidXML изменяет входную строку, поэтому передача литерала вызывает проблему. Тем не менее, документы говорят Passed string will be modified by the parser, unless rapidxml::parse_non_destructive flag is used., поэтому я думаю, что лучший способ - использовать этот флаг.

Смежные вопросы