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:
Ben Harris
2023-02-26 14:24:38 +00:00
parent 9dbcfa765b
commit 93be3f7cca
2 changed files with 4 additions and 4 deletions

View File

@ -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
* habit of shifting left by zero instead. We'll shift by
* bits-1 and then separately shift by one.
*/
ret &= (1 << (bits-1)) * 2 - 1;
ret &= (1UL << (bits-1)) * 2 - 1;
return ret;
}