From 14825944d7c57b6acd7e1a05a4c6046965efc6a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlo=20Marcelo=20Arenas=20Bel=C3=B3n?= Date: Sun, 8 Aug 2021 18:38:31 -0700 Subject: [PATCH 1/3] oidtree: avoid nested struct oidtree_node MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 92d8ed8ac1 (oidtree: a crit-bit tree for odb_loose_cache, 2021-07-07) adds a struct oidtree_node that contains only an n field with a struct cb_node. unfortunately, while building in pedantic mode witch clang 12 (as well as a similar error from gcc 11) it will show: oidtree.c:11:17: error: 'n' may not be nested in a struct due to flexible array member [-Werror,-Wflexible-array-extensions] struct cb_node n; ^ because of a constrain coded in ISO C 11 6.7.2.1¶3 that forbids using structs that contain a flexible array as part of another struct. use a strict cb_node directly instead. Signed-off-by: Carlo Marcelo Arenas Belón Signed-off-by: Junio C Hamano --- oidtree.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/oidtree.c b/oidtree.c index 7eb0e9ba050115..580cab8ae27e08 100644 --- a/oidtree.c +++ b/oidtree.c @@ -6,11 +6,6 @@ #include "alloc.h" #include "hash.h" -struct oidtree_node { - /* n.k[] is used to store "struct object_id" */ - struct cb_node n; -}; - struct oidtree_iter_data { oidtree_iter fn; void *arg; @@ -35,13 +30,13 @@ void oidtree_clear(struct oidtree *ot) void oidtree_insert(struct oidtree *ot, const struct object_id *oid) { - struct oidtree_node *on; + struct cb_node *on; if (!oid->algo) BUG("oidtree_insert requires oid->algo"); on = mem_pool_alloc(&ot->mem_pool, sizeof(*on) + sizeof(*oid)); - oidcpy_with_padding((struct object_id *)on->n.k, oid); + oidcpy_with_padding((struct object_id *)on->k, oid); /* * n.b. Current callers won't get us duplicates, here. If a @@ -49,7 +44,7 @@ void oidtree_insert(struct oidtree *ot, const struct object_id *oid) * that won't be freed until oidtree_clear. Currently it's not * worth maintaining a free list */ - cb_insert(&ot->tree, &on->n, sizeof(*oid)); + cb_insert(&ot->tree, on, sizeof(*oid)); } From dd3c8a72a2eaecf0c752a37e1f4ba4de59818e93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlo=20Marcelo=20Arenas=20Bel=C3=B3n?= Date: Sun, 8 Aug 2021 18:38:32 -0700 Subject: [PATCH 2/3] object-store: avoid extra ';' from KHASH_INIT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cf2dc1c238 (speed up alt_odb_usable() with many alternates, 2021-07-07) introduces a KHASH_INIT invocation with a trailing ';', which while commonly expected will trigger warnings with pedantic on both clang[-Wextra-semi] and gcc[-Wpedantic], because that macro has already a semicolon and is meant to be invoked without one. while fixing the macro would be a worthy solution (specially considering this is a common recurring problem), remove the extra ';' for now to minimize churn. Signed-off-by: Carlo Marcelo Arenas Belón Signed-off-by: Junio C Hamano --- object-store.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/object-store.h b/object-store.h index e679acc4c31316..d24915ced1b2dd 100644 --- a/object-store.h +++ b/object-store.h @@ -34,7 +34,7 @@ struct object_directory { }; KHASH_INIT(odb_path_map, const char * /* key: odb_path */, - struct object_directory *, 1, fspathhash, fspatheq); + struct object_directory *, 1, fspathhash, fspatheq) void prepare_alt_odb(struct repository *r); char *compute_alternate_path(const char *path, struct strbuf *err); From 581a3bb155c157094ca486e3a10c4a9b70c8f650 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scharfe?= Date: Fri, 6 Aug 2021 19:53:47 +0200 Subject: [PATCH 3/3] object-file: use unsigned arithmetic with bit mask MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 33f379eee6 (make object_directory.loose_objects_subdir_seen a bitmap, 2021-07-07) replaced a wasteful 256-byte array with a 32-byte array and bit operations. The mask calculation shifts a literal 1 of type int left by anything between 0 and 31. UndefinedBehaviorSanitizer doesn't like that and reports: object-file.c:2477:18: runtime error: left shift of 1 by 31 places cannot be represented in type 'int' Make sure to use an unsigned 1 instead to avoid the issue. Signed-off-by: René Scharfe Signed-off-by: Junio C Hamano --- object-file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/object-file.c b/object-file.c index 35f3e7e9bb74c2..dcb18592252d64 100644 --- a/object-file.c +++ b/object-file.c @@ -2463,7 +2463,7 @@ struct oidtree *odb_loose_cache(struct object_directory *odb, struct strbuf buf = STRBUF_INIT; size_t word_bits = bitsizeof(odb->loose_objects_subdir_seen[0]); size_t word_index = subdir_nr / word_bits; - size_t mask = 1 << (subdir_nr % word_bits); + size_t mask = 1u << (subdir_nr % word_bits); uint32_t *bitmap; if (subdir_nr < 0 ||