C++ 堆栈cookie检测代码检测到基于堆栈的缓冲区溢出-已修复
所以我对这个用于像素化图像的程序有一些问题。一个问题是,我得到了一个“围绕变量'pixArray'的堆栈已损坏”,然后,当我在中断后单击continue时,它在标题中给出了错误 我不确定使用pastebin是否可以接受,但我会使用它,因为我有一篇“简短”的帖子 此外,当它穿过时,所有像素化的正方形在正方形的左侧和顶部都短了一个像素。当它写入输出文件时,它只是使用原始数据。如果你能找出为什么会发生这种情况,你会得到额外的分数 最后,平均值似乎没有正确平均,正如运行程序后图像最右侧周围的正方形所示 如果您能帮助解决这些问题,我们将不胜感激。提前谢谢 编辑:我对代码进行了排序,注释掉了使用C++ 堆栈cookie检测代码检测到基于堆栈的缓冲区溢出-已修复,c++,image-processing,buffer-overrun,pixelate,stack-based,C++,Image Processing,Buffer Overrun,Pixelate,Stack Based,所以我对这个用于像素化图像的程序有一些问题。一个问题是,我得到了一个“围绕变量'pixArray'的堆栈已损坏”,然后,当我在中断后单击continue时,它在标题中给出了错误 我不确定使用pastebin是否可以接受,但我会使用它,因为我有一篇“简短”的帖子 此外,当它穿过时,所有像素化的正方形在正方形的左侧和顶部都短了一个像素。当它写入输出文件时,它只是使用原始数据。如果你能找出为什么会发生这种情况,你会得到额外的分数 最后,平均值似乎没有正确平均,正如运行程序后图像最右侧周围的正方形所
pixArray
的部分,注释掉后修复问题的部分位于函数的底部,getAveragesForRGB
start = 0;//reset start number
for(int row = 0; row < squareSize; row++) {
if(row != 0)
start = ((square * MAXROWS) / (MAXCOLS / squareSize)) + 1;
stop = (((square + 1) * MAXROWS) / (MAXCOLS / squareSize));
for (int col = start; col < stop; col++) {
//write each average into each piece of the array
pixArray[row][col].red = redAvg;
pixArray[row][col].green = greenAvg;
pixArray[row][col].blue = blueAvg;
}
}
似乎您正在覆盖某个函数中的本地数组。仔细检查所有循环限制。SO上没有人会在300多行代码上玩“发现错误”。简化您的代码,直到它仍然产生错误,但没有所有的“额外”代码。特别是代码中有十几种“pixArray”的用法,很难说是哪个函数导致了问题。这是一个非常好的观点。很抱歉。万一有人来了,我从VS2010改为VS2012时遇到了一个看似罕见的错误,没有升级我的DLL。特别是在SFML中。
void getAveragesForRGB(Pixel pixArray[][MAXCOLS], int squareSize, int square, int numSquaresPerStripe) {
//initialize variables needed for function
int start, stop;
int redAvg, greenAvg, blueAvg;
//reset averages for current square's usage
redAvg = 0;
greenAvg = 0;
blueAvg = 0;
start = 0; //reset start number
for (int row=0; row < squareSize; row++) {
if (row != 0)
start = ((square * MAXROWS) / (MAXCOLS / squareSize)) - 1; //starting point for loop over the columns
stop = start + squareSize;//stopping point for ^^^
for (int col = start; col < stop - 1; col++) {
//add each rgb value to the sum to be divided later
redAvg += pixArray[row][col].red;
greenAvg += pixArray[row][col].green;
blueAvg += pixArray[row][col].blue;
}
}
//divide by number of pixels in square for average
redAvg /= (squareSize * squareSize);
greenAvg /= (squareSize * squareSize);
blueAvg /= (squareSize * squareSize);
start = 0;//reset start number
for (int row = 0; row < squareSize; row++) {
if (row != 0)
start = ((square * MAXROWS) / (MAXCOLS / squareSize)) - 1; //starting point for loop over the columns
stop = (((square + 1) * MAXROWS) / (MAXCOLS / squareSize)); //stopping point for ^^^
for (int col = start; col < stop - 1; col++) {
//write each average into each piece of the array
pixArray[row][col].red = redAvg;
pixArray[row][col].green = greenAvg;
pixArray[row][col].blue = blueAvg;
}
}
}