Operation on ... may be undefined?
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.
gbhall
Updated on July 17, 2022Comments
-
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 over 3 years… or without division:
if (++trackTail[nodeNumber-1] > 9) trackTail[nodeNumber-1] = 0;