CS50模糊滤镜上的UndefinedBehaviorSanitizer

鹦鹉螺

我似乎无法弄清楚为什么这个错误不断发生。我对编码还很陌生,该程序应该使用盒式模糊对图像进行模糊处理,但是在尝试执行该程序时出现错误。我知道这可能不是最有效的解决方案,但是任何有关如何使它工作的提示都将不胜感激!

void blur(int height, int width, RGBTRIPLE image[height][width])
{
    RGBTRIPLE old[height][width];

    for(int i = 0; i < height; i++)
    {
        for(int j = 0; j < width; j++)
        {
            old[i][j] = image[i][j];
        }
    } 
    for(int i = 0; i < height; i++)
    {
        for(int j = 0; j < width; j++)
        {
            //top left corner
            if(j == 0 && i == 0)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j+1].rgbtRed) /4);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j+1].rgbtGreen) /4);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j+1].rgbtBlue) /4);
            } 
            //top right corner
            else if(j == width && i == 0)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j-1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j-1].rgbtRed) /4);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j-1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j-1].rgbtGreen) /4);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j-1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j-1].rgbtBlue) /4);
            } 
            //bottom left corner
            else if(j == 0 && i == height - 1)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j+1].rgbtRed) /4);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j+1].rgbtGreen) /4);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j+1].rgbtBlue) /4);
            } 
            //bottom right corner
            else if(j == width && i == height - 1)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j-1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j-1].rgbtRed) /4);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j-1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j-1].rgbtGreen) /4);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j-1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j-1].rgbtBlue) /4);
            } 
            //first row
            else if(i == 0 && j > 0 && j < width - 1)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j+1].rgbtRed + old[i][j-1].rgbtRed + old[i+1][j-1].rgbtRed) /6);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j+1].rgbtGreen + old[i][j-1].rgbtGreen + old[i+1][j-1].rgbtGreen) /6);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j+1].rgbtBlue + old[i][j-1].rgbtBlue + old[i+1][j-1].rgbtBlue) /6);
            }
            //last row
            else if(i == height && j > 0 && j < width - 1)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j+1].rgbtRed + old[i][j-1].rgbtRed + old[i-1][j-1].rgbtRed) /6);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j+1].rgbtGreen + old[i][j-1].rgbtGreen + old[i-1][j-1].rgbtGreen) /6);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j+1].rgbtBlue + old[i][j-1].rgbtBlue + old[i-1][j-1].rgbtBlue) /6);
            }
            //first column 
            else if(j == 0 && i > 0 && i < height - 1)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j+1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j+1].rgbtRed) /6);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j+1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j+1].rgbtGreen) /6);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j+1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j+1].rgbtBlue) /6);
            }
            //last column
            else if(j == width && i > 0 && i < height - 1)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j-1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j-1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j-1].rgbtRed) /6);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j-1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j-1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j-1].rgbtGreen) /6);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j-1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j-1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j-1].rgbtBlue) /6);
            }
            else if(i < height - 1 && j < width - 1)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j+1].rgbtRed + old[i][j-1].rgbtRed + old[i+1][j-1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j-1].rgbtRed + old[j-1][i+1].rgbtRed) /9);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j+1].rgbtGreen + old[i][j-1].rgbtGreen + old[i+1][j-1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j-1].rgbtGreen + old[j-1][i+1].rgbtGreen) /9);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j+1].rgbtBlue + old[i][j-1].rgbtBlue + old[i+1][j-1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j-1].rgbtBlue + old[j-1][i+1].rgbtBlue) /9);
            }
        }
    }
}
UndefinedBehaviorSanitizer:DEADLYSIGNAL
==9889==ERROR: UndefinedBehaviorSanitizer: SEGV on unknown address 0x7fff298bd0b8 (pc 0x000000442a96 bp 0x7fff298bc2b0 sp 0x7fff298071c0 T9889)
==9889==The signal is caused by a READ memory access.
    #0 0x442a95  (/home/ubuntu/pset4/filter/filter+0x442a95)
    #1 0x4232f1  (/home/ubuntu/pset4/filter/filter+0x4232f1)
    #2 0x7f302ce5db96  (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
    #3 0x402e19  (/home/ubuntu/pset4/filter/filter+0x402e19)

UndefinedBehaviorSanitizer can not provide additional info.
==9889==ABORTING
雷克:

“我似乎无法弄清楚为什么这个错误不断发生。”
(关于异常信号:==9889==The signal is caused by a READ memory access.

尽管我同意其他答案中提供的建议,但是它不能解决您所询问的核心问题,这很可能是由于代码中未定义的行为引起的。

注意:错误声明:signal is caused by a READ memory access.未定义行为(UB)的症状,我最喜欢的定义与您所看到的有关。具体来说,您的代码在某些时候正试图写入它不拥有的内存。如果要写入的未拥有的内存碰巧被任何其他进程所拥有,那么您的程序甚至可能不会引发异常。但是,在您的情况下,您的进程不拥有的内存很可能由另一个进程拥有的,从而导致OS发出投诉并发出异常信号,表明您侵入了另一个人的属性(内存位置)。

有趣的是,您发布的代码没有明显的迹象表明分配正在尝试访问未拥有的内存。绑定所有分配的嵌套循环的条件:

   for(int i = 0; i < height; i++)
    {
        for(int j = 0; j < width; j++)

显然不允许ij索引超出image数组的边界以及随后的语句,例如:

else if(j == width && i == 0)

通过在条件for循环绝不允许有保证j == width,从而防止什么本来试图例如写入image[i][j].rgbtRed(其中,如果j == width将放在一个阵列存储器位置是否越界。),并作为异常的原因。

因此,我建议可能由于未发布代码而发生异常。(您从未在错误的确切位置注释中回答问题。)您尚未找到它。对您来说,这是一个非常好的举动,以发现根本原因,无论其原因在哪里,并将其消除。

或者,您可以发布一个最小但完整的可编译示例,从而更好地使其他访问此帖子的人可以帮助您找到它。

编辑 -我只用一个main()函数就可以运行您的代码(请参见下文),但在您发布的代码片段中没有发现读取内存访问冲突的迹象我坚信在这一点上问题出在其他地方,也许在一段代码中您没有包括:

   typedef struct {
        int rgbtRed;    
        int rgbtGreen;
        int rgbtBlue;
    }RGBTRIPLE;
    

    void blur(int height, int width, RGBTRIPLE image[height][width]);
    
    int main(void)
    {
        
        RGBTRIPLE image[2][3] = {{{12,13,14},{14,15,16},{15,16,17}},{{16,17,18},{17,18,19},{18,19,20}}};
        blur(2, 3, image);
        return 0;
    }

    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章