RapidXML-解析char *上的缓冲区溢出
RapidXml - buffer overflow on parsing char *
我正在尝试创建一个成员函数,以设置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.
,所以我想最好的方法是使用此标志。
相关文章:
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 使用向量的缓冲区溢出
- 重新增长阵列时出错:写入时缓冲区溢出
- Leetcode 1366:堆缓冲区溢出
- 缓冲区溢出 - 数组索引越界(严重)
- C++二维矢量导致缓冲区溢出
- 缓冲区溢出怎么会成为黑客的攻击
- 如何防止缓冲区溢出
- 应该如何读取堆缓冲区溢出错误消息?
- 自动截断和 null 终止缓冲区溢出中的字符串缓冲区
- 如果用户输入两个或多个由空格分隔的字符串C++如何防止缓冲区溢出?
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 为什么 LeetCode 给出错误:地址清理器:堆缓冲区溢出
- 为什么错误 C6386 缓冲区溢出与 strsafe.h 字符串 Cch 函数
- 读取文件时字符缓冲区溢出
- C 文本写入随机数据.是否有缓冲区溢出