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;
            }
        }
    }
}