我正在尝试创建一个成员函数,用于从字符串中设置rapidxml::xml_document<>对象,重载的字符串用于std::string、const std::string和const *。
当我试图直接加载char *时,就会得到缓冲区溢出,使用复制的字符串工作(我想避免这种情况,因为字符串很长)。
我的系统:用g++ 4.8.2进行Debian测试
编辑:我知道该字符串将被rapidxml修改(对于const char * objects,因此我创建了一个副本(每个std::))
生成相同溢出的示例代码如下:
#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;
}发布于 2014-01-27 13:34:47
str指向字符串文本,因此修改它是非法的。
来自文档:
函数xml_document::parse ..。传递的字符串将由解析器修改..。
您可以将声明更改为
char str[] = "<efa><departures>data</departures></efa>";发布于 2014-01-27 13:41:07
RapidXML修改输入字符串,因此传递文字会导致问题。但是,文档中说的是Passed string will be modified by the parser, unless rapidxml::parse_non_destructive flag is used.,所以我想最好的方法是使用这个标志。
https://stackoverflow.com/questions/21382164
复制相似问题