C++ C++;在向量缓冲区上迭代时执行非法操作
所以我写这个程序是为了在二进制文件中搜索某个块,我得到了一个我不理解的错误 下面是生成错误的函数的代码C++ C++;在向量缓冲区上迭代时执行非法操作,c++,clang,buffer,chunks,chunking,C++,Clang,Buffer,Chunks,Chunking,所以我写这个程序是为了在二进制文件中搜索某个块,我得到了一个我不理解的错误 下面是生成错误的函数的代码 (还要注意,返回值是一个int,因为我希望它首先以字节的形式返回大小,以查看它是否有效) int GetChunkBuffer(ifstream&imageFile,char chunkName[4]) { //包含新打开的图像作为一个整体 向量imageBuffer(istreambuf_迭代器(imageFile),{}); //指针“数组”类型的东西 vector::iterator b
(还要注意,返回值是一个int,因为我希望它首先以字节的形式返回大小,以查看它是否有效)
int GetChunkBuffer(ifstream&imageFile,char chunkName[4])
{
//包含新打开的图像作为一个整体
向量imageBuffer(istreambuf_迭代器(imageFile),{});
//指针“数组”类型的东西
vector::iterator bufferIterator=imageBuffer.begin();
对于(;bufferIterator!=imageBuffer.end();bufferIterator++)
{
如果(*bufferIterator==chunkName[0])
{
//我认为这会使程序更快
如果(*(bufferIterator+1)==chunkName[1]&&
*(bufferIterator+2)=chunkName[2]&&
*(bufferIterator+3)=chunkName[3])
{
//块名称匹配
//获取块的长度
无符号字符len[4]={*(缓冲迭代器-4),
*(缓冲迭代器-3),
*(缓冲迭代器-2),
*(缓冲迭代器-1)
};
无符号整数chunkLength=0;
对于(int i=0;i)错误指出哪一行?在前3次迭代中,bufferIterator-4
指向哪里?@youngtrashbag否,对于bufferIterator=imageBuffer.begin()缓冲迭代器-4
是非法的。如果If
在前3次迭代中不能为真,为什么不跳过它们呢?不是所有的路径都返回(当没有匹配时),在这些情况下导致UB。无符号字符长度[4];for(int i=0;当i==4
时,i越界访问)。
int GetChunkBuffer(ifstream &imageFile, char chunkName[4])
{
//contains the newly opened image as a whole
vector<unsigned char> imageBuffer(istreambuf_iterator<char>(imageFile), {});
//pointer "array" type of thing
vector<unsigned char>::iterator bufferIterator = imageBuffer.begin();
for(; bufferIterator != imageBuffer.end(); bufferIterator++)
{
if(*bufferIterator == chunkName[0])
{
//i think this makes the program faster
if(*(bufferIterator + 1) == chunkName[1] &&
*(bufferIterator + 2) == chunkName[2] &&
*(bufferIterator + 3) == chunkName[3])
{
//chunk name matches
//get length of chunk
unsigned char len[4] = { *(bufferIterator - 4),
*(bufferIterator - 3),
*(bufferIterator - 2),
*(bufferIterator - 1)
};
unsigned int chunkLength = 0;
for(int i = 0; i <= 4; i++)
{
chunkLength += len[i] << 1;
}
return chunkLength;
}
}
}
}