aboutsummaryrefslogtreecommitdiff
path: root/twiddle.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2019-09-01 22:26:22 +0100
committerSimon Tatham <anakin@pobox.com>2019-09-01 22:26:22 +0100
commit907c42bcf0f06826279d5be91be7f7f9c45876d9 (patch)
tree373f5ed652ab67c33ee8c1b6692a70b4a6732bb5 /twiddle.c
parente2135d51c51a39f05e2c20c70111b27c15952803 (diff)
downloadpuzzles-907c42bcf0f06826279d5be91be7f7f9c45876d9.zip
puzzles-907c42bcf0f06826279d5be91be7f7f9c45876d9.tar.gz
puzzles-907c42bcf0f06826279d5be91be7f7f9c45876d9.tar.bz2
puzzles-907c42bcf0f06826279d5be91be7f7f9c45876d9.tar.xz
Fix build failure reported in gcc 9.
Apparently gcc 9 is clever enough to say 'Hey, runtime field width in an sprintf targeting a fixed-size buffer!', but not clever enough to notice that the width was computed earlier as the max of lots of default-width sprintfs into the same buffer (so _either_ it's safe, or else - on a hypothetical platform with a 263-bit int - the damage was already done). Added a bounds check or two to keep it happy.
Diffstat (limited to 'twiddle.c')
-rw-r--r--twiddle.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/twiddle.c b/twiddle.c
index 06f6ff1..07e2f81 100644
--- a/twiddle.c
+++ b/twiddle.c
@@ -550,6 +550,12 @@ static char *game_text_format(const game_state *state)
int i, x, y, col, maxlen;
bool o = state->orientable;
+ /* Pedantic check: ensure buf is large enough to format an int in
+ * decimal, using the bound log10(2) < 1/3. (Obviously in practice
+ * int is not going to be larger than even 32 bits any time soon,
+ * but.) */
+ assert(sizeof(buf) >= 1 + sizeof(int) * CHAR_BIT/3);
+
/*
* First work out how many characters we need to display each
* number. We're pretty flexible on grid contents here, so we
@@ -561,6 +567,11 @@ static char *game_text_format(const game_state *state)
if (col < x) col = x;
}
+ /* Reassure sprintf-checking compilers like gcc that the field
+ * width we've just computed is not now excessive */
+ if (col >= sizeof(buf))
+ col = sizeof(buf)-1;
+
/*
* Now we know the exact total size of the grid we're going to
* produce: it's got h rows, each containing w lots of col+o,