Skip to content

Commit ab2a205

Browse files
gitsterdscho
authored andcommitted
bswap.h: squelch potential sparse -Wcast-truncate warnings
In put_be32(), we right-shift a uint32_t value various amounts and then assign the low 8-bits to individual "unsigned char" bytes, throwing away the high bits. For shifts smaller than 24 bits, those thrown away bits will be arbitrary bits from the original uint32_t. This works exactly as we want, but if you feed a constant, then sparse complains. For example if we write this (which we plan to do in a future patch): put_be32(hdr, PACK_SIGNATURE); then "make sparse" produces: compat/bswap.h:175:22: error: cast truncates bits from constant value (5041 becomes 41) compat/bswap.h:176:22: error: cast truncates bits from constant value (504143 becomes 43) compat/bswap.h:177:22: error: cast truncates bits from constant value (5041434b becomes 4b) And the same issue exists in the other put_be*() functions, when used with a constant. We can silence this warning by explicitly masking off the truncated bits. The compiler is smart enough to know the result is the same, and the asm generated by gcc (with both -O0 and -O2) is identical. Curiously this line already exists: put_be32(&hdr_version, INDEX_EXTENSION_VERSION2); in the fsmonitor.c file, but it does not get flagged because the CPP macro expands to a small integer (2). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
1 parent 5cc2d6c commit ab2a205

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

compat/bswap.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -171,23 +171,23 @@ static inline uint64_t get_be64(const void *ptr)
171171
static inline void put_be32(void *ptr, uint32_t value)
172172
{
173173
unsigned char *p = ptr;
174-
p[0] = value >> 24;
175-
p[1] = value >> 16;
176-
p[2] = value >> 8;
177-
p[3] = value >> 0;
174+
p[0] = (value >> 24) & 0xff;
175+
p[1] = (value >> 16) & 0xff;
176+
p[2] = (value >> 8) & 0xff;
177+
p[3] = (value >> 0) & 0xff;
178178
}
179179

180180
static inline void put_be64(void *ptr, uint64_t value)
181181
{
182182
unsigned char *p = ptr;
183-
p[0] = value >> 56;
184-
p[1] = value >> 48;
185-
p[2] = value >> 40;
186-
p[3] = value >> 32;
187-
p[4] = value >> 24;
188-
p[5] = value >> 16;
189-
p[6] = value >> 8;
190-
p[7] = value >> 0;
183+
p[0] = (value >> 56) & 0xff;
184+
p[1] = (value >> 48) & 0xff;
185+
p[2] = (value >> 40) & 0xff;
186+
p[3] = (value >> 32) & 0xff;
187+
p[4] = (value >> 24) & 0xff;
188+
p[5] = (value >> 16) & 0xff;
189+
p[6] = (value >> 8) & 0xff;
190+
p[7] = (value >> 0) & 0xff;
191191
}
192192

193193
#endif /* COMPAT_BSWAP_H */

0 commit comments

Comments
 (0)