RapidXML-解析char *上的缓冲区溢出

RapidXml - buffer overflow on parsing char *

本文关键字:缓冲区 溢出 解析 char RapidXML-      更新时间:2023-10-16

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

当我尝试直接加载char *时,我会使用复制的字符串作品(由于长字符串,我想避免使用)。

我的系统:Debian测试G 4.8.2

编辑:我知道字符串将由RapidXML修改(对于 const char *对象,因此我创建一个副本(per 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('');
        }
#       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;
}

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

来自文档:

功能XML_DOCUMEMENT :: PARSE

[...]通过的字符串将由解析器[...]

修改

您可以将声明更改为

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

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