RapidXml - 解析char *时的缓冲区溢出

时间:2014-01-27 13:29:57

标签: c++ char rapidxml

我正在尝试创建一个成员函数来设置rapidxml :: xml_document<>来自字符串的对象,std :: string的重载,const std :: string和const char *工作正常。

当我尝试直接加载char *时,我得到一个缓冲区溢出,使用复制的字符串工作(我想避免,因为长字符串)。

我的系统:使用g ++ 4.8.2进行Debian测试

编辑: 我知道字符串将被rapidxml修改 (对于 const char *对象,因此我创建了一个副本(每个std :: vector))

示例代码,产生相同的溢出:

#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;
}

2 个答案:

答案 0 :(得分:2)

str指向字符串文字,因此修改它是非法的。

来自docs

  

function xml_document :: parse

     

[...]传递的字符串将由解析器[...]

修改

您可以将声明更改为

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

答案 1 :(得分:2)

RapidXML修改输入字符串,因此传递文字会导致问题。但是,文档说Passed string will be modified by the parser, unless rapidxml::parse_non_destructive flag is used.所以我想最好的方法是使用这个标志。