读取文件时字符缓冲区溢出
Character buffer being overrun while reading file
我正在尝试从文件中读取数据,但收到STATUS_STACK_BUFFER_OVERRUN错误并且应用程序崩溃。
我有一个结构:
struct BSPEntities
{
char* ents;
};
我正在阅读文件:
BSPEntities entities
ifstream mapfile;
int size = 54506;
int offset = 5182600;
entities.ents = new char[size];
mapfile.seekg(offset, ios::beg);
mapfile.read((char *)(&entities.ents), size);
">size"和"offset"是从文件加载的值,已知有效。我有预处理器指令 #pragma pack(1( 和 #pragma 推动 BSPEntities 结构。
谢谢。
&entities.ents
是指向字符的指针。 指向的对象(指向 char 的指针(可能只有 4 或 8 个字节,具体取决于您要面向的体系结构,但您尝试向其写入 54,506 个字节。 显然,54,506 大于 8,因此您正在写入指针的末尾,并且行为未定义。
这种解读应该只是mapfile.read(entities.ents, size);
此外,您不需要在这里弄乱#pragma pack
,除非有更复杂的事情发生,而您没有显示。
mapfile.read((char *)(&entities.ents), size);
应该是
mapfile.read(entities.ents, size);
传递的不是传递ents
指向的堆内存块的地址,而是传递ents
本身的地址。由于ents
是在堆栈上分配的,因此您将字节读取到堆栈上,直到它溢出。
相关文章:
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 使用向量的缓冲区溢出
- 重新增长阵列时出错:写入时缓冲区溢出
- Leetcode 1366:堆缓冲区溢出
- 缓冲区溢出 - 数组索引越界(严重)
- C++二维矢量导致缓冲区溢出
- 缓冲区溢出怎么会成为黑客的攻击
- 如何防止缓冲区溢出
- 应该如何读取堆缓冲区溢出错误消息?
- 自动截断和 null 终止缓冲区溢出中的字符串缓冲区
- 如果用户输入两个或多个由空格分隔的字符串C++如何防止缓冲区溢出?
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 为什么 LeetCode 给出错误:地址清理器:堆缓冲区溢出
- 为什么错误 C6386 缓冲区溢出与 strsafe.h 字符串 Cch 函数
- 读取文件时字符缓冲区溢出
- C 文本写入随机数据.是否有缓冲区溢出