0

I am taking a beginner programming course, CS50 and we're currently working with C. Current topic is on Memory and taking up a problem on this. The problem requires us to blur an image using a 'box blur' algorithm. I get no errors compiling the source code but get the following error with the executable:

UndefinedBehaviorSanitizer:DEADLYSIGNAL
==6429==ERROR: UndefinedBehaviorSanitizer: SEGV on unknown address 0x7fffec49f13a (pc 0x000000428c30 
bp 0x7fffec49c670 sp 0x7fffec3ec380 T6429)
==6429==The signal is caused by a WRITE memory access.
#0 0x428c2f  (/home/ubuntu/pset4/filter/filter+0x428c2f)
#1 0x4232b1  (/home/ubuntu/pset4/filter/filter+0x4232b1)

My code:

// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])

{

int sum_red = 0;
int sum_green = 0;
int sum_blue = 0;
int counter = 0 ;

//Temporary variable to copy image
RGBTRIPLE temps[height][width] ;


//Copying image to temporary variable
for(int i = 0; i < width; i++)
{
    for(int j = 0; j < height; j++)
    {
            temps[i][j].rgbtRed = image[i][j].rgbtRed;
            temps[i][j].rgbtGreen = image[i][j].rgbtGreen;
            temps[i][j].rgbtBlue = image[i][j].rgbtBlue;
    }
}


//Iterating over each pixel
for(int i = 0; i < height; i++)
{
    for(int j = 0; j < width; j++)

   //Getting the adjacent pixels to current pixel
    {
        for (int k = i - 1; k < i + 2; k++)
        {
            for (int l = j - 1 ; l < j + 2 ; l++)
            {
                //Skipping iteration if neighbouring pixel is outside image boundary
                if(l < 0 || k < 0 || l >= height || k >= width)
                {
                    continue;

                }
                   sum_red += temps[k][l].rgbtRed;
                   sum_green += temps[k][l].rgbtGreen;
                   sum_blue += temps[k][l].rgbtBlue;

                   counter ++ ;

            }
        }

     

        //Getting the average of RGB of each pixel
        image[i][j].rgbtRed = (round)((float)sum_red/counter);
        image[i][j].rgbtBlue = (round)((float)sum_blue/counter);
        image[i][j].rgbtGreen = (round)((float)sum_green/counter);

        //Resetting variables to zero for next iteration
        sum_red = 0;
        sum_green = 0;
        sum_blue = 0;
        counter = 0;


    }
}

return;
}

RGBTRIPLE Definition:

 #include <stdint.h>

 /**
 * RGBTRIPLE
 *
 * This structure describes a color consisting of relative intensities of
 * red, green, and blue.
 *
 * Adapted from http://msdn.microsoft.com/en-us/library/aa922590.aspx.
 */
 typedef struct
 {
    BYTE  rgbtBlue;
    BYTE  rgbtGreen;
    BYTE  rgbtRed;
 } __attribute__((__packed__))
 RGBTRIPLE;

Would appreciate any assistance offered as to why I get the error above. Pardon any code inefficiencies (unless they are the problem cause), still in the learning process. A similar question was posted here but the solution was unclear (unclear as to how they reduced memory, if this is indeed the problem).

user4581301
  • 33,082
  • 7
  • 33
  • 54
learner254
  • 165
  • 1
  • 2
  • 12
  • OT weird: parts of the code have been italicised between `_`underscores`_` but not further down the code.... and now it has corrected ??? – Weather Vane Oct 26 '20 at 22:25
  • 1
    image and temps are defined as arrays of size [height][width]. However you access them as [width][height]. This may explain your error. – jmq Oct 26 '20 at 22:36
  • @jmq this turned out to be the issue. I could have spotted this with the debugger as well upon learning further. Will learn to use it more. If you can post your comment as answer, I can mark it as answer. – learner254 Oct 27 '20 at 19:43
  • Glad it worked out for you. Since the question is closed as a duplicate I can't add an answer to it. – jmq Oct 27 '20 at 20:21
  • @jmq Noted. Appreciated nonetheless. – learner254 Oct 27 '20 at 20:25

0 Answers0