gpt4 book ai didi

c++ - 无效转换导致的堆损坏?

转载 作者:行者123 更新时间:2023-11-28 07:49:49 25 4
gpt4 key购买 nike

我有代码:

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 循环中的转换引起的,如果我使用 signed char myArray 我没有得到错误,但我必须使用 unsigned char for我的其余代码。将 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;
}

在读到末尾后尝试读取不是问题——您会在数组的其余部分中得到垃圾,但您可以在最后处理它。

假设您的数组足够大以容纳整个文件会导致缓冲区损坏。涉及带有精心制作的不正确元数据的图像文件的缓冲区溢出攻击是众所周知的。

不要依赖整个文件内容适合计算出的缓冲区大小。

关于c++ - 无效转换导致的堆损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14075890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com