From 93be3f7ccaa63b0fd953bcfd88d685b47b76605e Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Sun, 26 Feb 2023 14:24:38 +0000 Subject: 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. --- cube.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'cube.c') diff --git a/cube.c b/cube.c index 69a9d35..3b4e975 100644 --- a/cube.c +++ b/cube.c @@ -202,8 +202,8 @@ struct game_grid { }; #define SET_SQUARE(state, i, val) \ - ((state)->bluemask[(i)/32] &= ~(1 << ((i)%32)), \ - (state)->bluemask[(i)/32] |= ((!!val) << ((i)%32))) + ((state)->bluemask[(i)/32] &= ~(1UL << ((i)%32)), \ + (state)->bluemask[(i)/32] |= ((unsigned long)(!!val) << ((i)%32))) #define GET_SQUARE(state, i) \ (((state)->bluemask[(i)/32] >> ((i)%32)) & 1) -- cgit v1.1