Operation on ... may be undefined?

37,597

Solution 1

Line 77 is the line

trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;

You are changing trackTail[nodeNumber-1] twice between sequence points: once through ++, and once through assignment.

This is undefined behaviour.

The remedy is to rephrase the statement, for example like so:

trackTail[nodeNumber-1] = (trackTail[nodeNumber-1] + 1) % 10;

or like so:

trackTail[nodeNumber-1]++;
trackTail[nodeNumber-1] %= 10;

Solution 2

trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;

Yep, that's undefined behavior just as the error message says. You're not allowed to modify the same value twice without a sequence point in between. In this case that means you're not allowed to both increment trackTail[nodeNumber-1] using ++ and reassign it using =.

If you just use + 1 instead of ++, it will work fine.

Share:
37,597
gbhall
Author by

gbhall

Updated on July 17, 2022

Comments

  • gbhall
    gbhall almost 2 years

    I have the following code

    FRAME frameArray[5][10]; // Create the array of frames
    int trackBufferFull[5] = {0, 0, 0, 0, 0};// Keeps track of how full the buffer for each node is
    int trackFront[5] = {0, 0, 0, 0, 0}; // Array to keep track of which is the front of the array
    int trackTail[5] = {0, 0, 0, 0, 0};
    
    
    // Function to add to the array (CHANGE int frame)
    void addFrame (int nodeNumber, FRAME frame)
    {
        //Calc tail
        int tail = trackTail[nodeNumber-1];
    
        // Calc frames in buffer
        int framesinBuffer = trackBufferFull[nodeNumber-1];
    
        if (framesinBuffer == 10)
        {
            printf("Buffer is full\n");
        }
        else
        {
    
            // Add frame to frameArray
            frameArray[nodeNumber-1][tail] = frame; 
            printf("\nAdded a frame in node: %i to the buffer\n", nodeNumber);
    
            // Increment the count
            trackBufferFull[nodeNumber-1]++;
            trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;
    
    
        }  
    }
    

    The arrays I use for frameArray is a wrap-around/cyclic array of length 10, hence why I have the code

    trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;
    

    Everything works perfectly in a standalone file, however when run inside of a larger file, I get the following compile errors:

    $ cnet GARETH -m 30
    compiling gareth.c
    gareth.c: In function ‘addFrame’:
    gareth.c:77:27: error: operation on ‘trackTail[nodeNumber + -0x00000000000000001]’ may be undefined [-Werror=sequence-point]
    gareth.c: In function ‘removeFirstFrame’:
    gareth.c:98:28: error: operation on ‘trackFront[nodeNumber + -0x00000000000000001]’ may be undefined [-Werror=sequence-point]
    gareth.c:105:1: error: control reaches end of non-void function [-Werror=return-type]
    cc1: all warnings being treated as errors
    

    Line 77 is the line

    trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;
    

    Help.

    To see the code with line numbers and the errors side by side, I've uploaded an image to: http://i.imgur.com/wyO5a.png

  • Torsten Crull
    Torsten Crull over 3 years
    … or without division: if (++trackTail[nodeNumber-1] > 9) trackTail[nodeNumber-1] = 0;