无效强制转换导致的堆损坏
Heap Corruption caused by Invalid Casting?
我有代码:
unsigned char *myArray = new unsigned char[40000];
char pixelInfo[3];
int c = 0;
while(!reader.eof()) //reader is a ifstream open to a BMP file
{
reader.read(pixelInfo, 3);
myArray[c] = (unsigned char)pixelInfo[0];
myArray[c + 1] = (unsigned char)pixelInfo[1];
myArray[c + 2] = (unsigned char)pixelInfo[2];
c += 3;
}
reader.close();
delete[] myArray; //I get HEAP CORRUPTION here
经过一些测试,我发现它是由while循环中的强制转换引起的,如果我使用带符号的char myArray我没有得到错误,但我必须为我的代码的其余部分使用unsigned char。将pixelInfo转换为unsigned char也会给出相同的错误。
有什么解决办法吗?
你应该这样做:
reader.read((char*)myArray, myArrayLength); /* note, that isn't (sizeof myArray) */
if (!reader) { /* report error */ }
如果循环中正在进行处理,则
int c = 0;
while (c + 2 < myArraySize) //reader is a ifstream open to a BMP file
{
reader.read(pixelInfo, 3);
myArray[c] = (unsigned char)pixelInfo[0];
myArray[c + 1] = (unsigned char)pixelInfo[1];
myArray[c + 2] = (unsigned char)pixelInfo[2];
c += 3;
}
尝试在到达末尾后读取不是问题——在数组的其余部分会得到垃圾,但是可以在末尾处理。
假设您的数组大到足以容纳整个文件会导致缓冲区损坏。缓冲区溢出攻击涉及带有精心制作的错误元数据的图像文件,这是众所周知的。
- 在Mozilla Mozilla中的
- 在MSN Messenger Windows XP中的
不要依赖整个文件内容来匹配计算的缓冲区大小
reader.eof()
只会告诉您之前的读取是否到达了文件的末尾,这将导致您的最终迭代写入超过了数组的末尾。相反,您需要检查当前读取是否到达文件末尾。将while
循环更改为:
while(reader.read(pixelInfo, 3)) //reader is a ifstream open to a BMP file
{
// ...
}
请注意,您每次读取3个字节。如果总字节数不能被3整除(不是3的倍数),那么只有pixelInfo数组的一部分会被正确的数据填充,这可能会导致程序出错。您可以尝试下面这段未测试的代码。
while(!reader.eof()) //reader is a ifstream open to a BMP file
{
reader.read(pixelInfo, 3);
for (int i = 0; i < reader.gcount(); i++) {
myArray[c+i] = pixelInfo[i];
}
c += 3;
}
您的代码确实遵循cplusplus.com上的文档非常好,因为eof位将在不完整读取后设置,因此此代码将在您最后一次读取后终止,但是,正如我之前提到的,您的问题的可能原因是您将可能的垃圾数据分配给堆,因为pixelInfo[x]可能不一定要设置如果3字节未读取。
相关文章:
- 防止主数据类型C++的隐式转换
- 为什么会发生堆损坏
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 与强制转换相关的堆损坏错误
- 将大双精度转换为无符号 int 期间堆栈损坏
- 如何在不损坏数据的情况下将缓冲区强制转换为结构
- WinDbg是否能够检测由于无效的下转换而导致的内存堆损坏
- DirectX 11-使用AVX的AoS到SoA转换导致重映射时顶点缓冲区损坏
- Qt Creator错误:LNK1123:转换到COFF时失败:文件无效或损坏
- utf 8 - 将 UTF16(Windows wchar_t) 转换为 UTF8 C++ 非英语字母损坏(韩语)
- 无效强制转换导致的堆损坏