From: Junio C Hamano <gitster@pobox.com>
To: Jeff King <peff@peff.net>
Cc: Koakuma <koachan@protonmail.com>,
"git@vger.kernel.org" <git@vger.kernel.org>
Subject: Re: [PATCH 2/3] parse_pack_header_option(): avoid unaligned memory writes
Date: Fri, 17 Jan 2025 17:27:21 -0800 [thread overview]
Message-ID: <xmqq7c6s52ti.fsf@gitster.g> (raw)
In-Reply-To: <20250117125530.GB2893666@coredump.intra.peff.net> (Jeff King's message of "Fri, 17 Jan 2025 07:55:30 -0500")
Jeff King <peff@peff.net> writes:
> + put_be32(hdr, PACK_SIGNATURE);
Tonight's comedy. PACK_SIGNATURE is defined as 0x5041434b (in pack.h)
In <compat/bswap.h> we want to take advantage of the fact that
assigning any unsigned integer to *(unsigned char *) would assign
the integer's least significant 8 bits.
static inline void put_be32(void *ptr, uint32_t value)
{
unsigned char *p = ptr;
p[0] = value >> 24;
p[1] = value >> 16;
p[2] = value >> 8;
p[3] = value >> 0;
}
But sparse seems not to like that.
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)
Of course we could do the mask, but should we have to?
I think the real compiler would be clever ehough to produce the
identical binary with the following patch that is only needed to
squelch this error, but I feel dirty after writing this.
By the way, a "git grep" finds
put_be32(&hdr_version, INDEX_EXTENSION_VERSION2);
in the fsmonitor.c file, which does not get flagged only because the
CPP macro expands to a small integer (2). That is doubly insulting.
compat/bswap.h | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git c/compat/bswap.h w/compat/bswap.h
index 512f6f4b99..b34054f2bd 100644
--- c/compat/bswap.h
+++ w/compat/bswap.h
@@ -171,23 +171,23 @@ static inline uint64_t get_be64(const void *ptr)
static inline void put_be32(void *ptr, uint32_t value)
{
unsigned char *p = ptr;
- p[0] = value >> 24;
- p[1] = value >> 16;
- p[2] = value >> 8;
- p[3] = value >> 0;
+ p[0] = (value >> 24) & 0xff;
+ p[1] = (value >> 16) & 0xff;
+ p[2] = (value >> 8) & 0xff;
+ p[3] = (value >> 0) & 0xff;
}
static inline void put_be64(void *ptr, uint64_t value)
{
unsigned char *p = ptr;
- p[0] = value >> 56;
- p[1] = value >> 48;
- p[2] = value >> 40;
- p[3] = value >> 32;
- p[4] = value >> 24;
- p[5] = value >> 16;
- p[6] = value >> 8;
- p[7] = value >> 0;
+ p[0] = (value >> 56) & 0xff;
+ p[1] = (value >> 48) & 0xff;
+ p[2] = (value >> 40) & 0xff;
+ p[3] = (value >> 32) & 0xff;
+ p[4] = (value >> 24) & 0xff;
+ p[5] = (value >> 16) & 0xff;
+ p[6] = (value >> 8) & 0xff;
+ p[7] = (value >> 0) & 0xff;
}
#endif /* COMPAT_BSWAP_H */
next prev parent reply other threads:[~2025-01-18 1:27 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-17 3:30 [BUG] git crashes with a SIGBUS on sparc64 during pull Koakuma
2025-01-17 12:11 ` Jeff King
2025-01-17 12:52 ` Jeff King
2025-01-17 12:54 ` [PATCH 1/3] packfile: factor out --pack_header argument parsing Jeff King
2025-01-17 22:45 ` Junio C Hamano
2025-01-18 9:23 ` Jeff King
2025-01-18 16:57 ` Koakuma
2025-01-17 12:55 ` [PATCH 2/3] parse_pack_header_option(): avoid unaligned memory writes Jeff King
2025-01-18 1:27 ` Junio C Hamano [this message]
2025-01-18 9:36 ` Jeff King
2025-01-17 12:56 ` [PATCH 3/3] index-pack, unpack-objects: use skip_prefix to avoid magic number Jeff King
2025-01-17 15:55 ` [BUG] git crashes with a SIGBUS on sparc64 during pull Koakuma
2025-01-18 9:20 ` Jeff King
2025-01-18 16:50 ` Koakuma
2025-01-19 13:12 ` [PATCH v2 0/5] " Jeff King
2025-01-19 13:23 ` [PATCH v2 1/5] bswap.h: squelch potential sparse -Wcast-truncate warnings Jeff King
2025-01-19 13:23 ` [PATCH v2 2/5] packfile: factor out --pack_header argument parsing Jeff King
2025-01-19 13:23 ` [PATCH v2 3/5] parse_pack_header_option(): avoid unaligned memory writes Jeff King
2025-01-19 13:25 ` [PATCH v2 4/5] index-pack, unpack-objects: use get_be32() for reading pack header Jeff King
2025-01-19 13:25 ` [PATCH v2 5/5] index-pack, unpack-objects: use skip_prefix to avoid magic number Jeff King
2025-01-20 15:20 ` [PATCH v2 0/5] git crashes with a SIGBUS on sparc64 during pull Koakuma
2025-01-21 16:37 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqq7c6s52ti.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=koachan@protonmail.com \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.