mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-20 15:41:30 -07:00
Be more careful with type of left operand of <<
On a 32-bit system, evaluating 1<<31 causes undefined behaviour because 1 is signed and so it produces signed overflow. UBSan has spotted a couple of occasions where this happens in Puzzles, so in each case I've converted the left operand to the unsigned result type we actually want.
This commit is contained in:
4
cube.c
4
cube.c
@ -202,8 +202,8 @@ struct game_grid {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define SET_SQUARE(state, i, val) \
|
#define SET_SQUARE(state, i, val) \
|
||||||
((state)->bluemask[(i)/32] &= ~(1 << ((i)%32)), \
|
((state)->bluemask[(i)/32] &= ~(1UL << ((i)%32)), \
|
||||||
(state)->bluemask[(i)/32] |= ((!!val) << ((i)%32)))
|
(state)->bluemask[(i)/32] |= ((unsigned long)(!!val) << ((i)%32)))
|
||||||
#define GET_SQUARE(state, i) \
|
#define GET_SQUARE(state, i) \
|
||||||
(((state)->bluemask[(i)/32] >> ((i)%32)) & 1)
|
(((state)->bluemask[(i)/32] >> ((i)%32)) & 1)
|
||||||
|
|
||||||
|
4
random.c
4
random.c
@ -254,12 +254,12 @@ unsigned long random_bits(random_state *state, int bits)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* `(1 << bits) - 1' is not good enough, since if bits==32 on a
|
* `(1UL << bits) - 1' is not good enough, since if bits==32 on a
|
||||||
* 32-bit machine, behaviour is undefined and Intel has a nasty
|
* 32-bit machine, behaviour is undefined and Intel has a nasty
|
||||||
* habit of shifting left by zero instead. We'll shift by
|
* habit of shifting left by zero instead. We'll shift by
|
||||||
* bits-1 and then separately shift by one.
|
* bits-1 and then separately shift by one.
|
||||||
*/
|
*/
|
||||||
ret &= (1 << (bits-1)) * 2 - 1;
|
ret &= (1UL << (bits-1)) * 2 - 1;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user