Merge branch 'tc/memzero-array'

MEMZERO_ARRAY() helper is introduced to avoid clearing only the
first N bytes of an N-element array whose elements are larger than
a byte.

* tc/memzero-array:
  contrib/coccinelle: pass include paths to spatch(1)
  git-compat-util: introduce MEMZERO_ARRAY() macro
This commit is contained in:
Junio C Hamano 2025-12-23 11:33:16 +09:00
commit 396df67739
10 changed files with 36 additions and 10 deletions

View File

@ -982,7 +982,7 @@ SANITIZE_LEAK =
SANITIZE_ADDRESS = SANITIZE_ADDRESS =
# For the 'coccicheck' target # For the 'coccicheck' target
SPATCH_INCLUDE_FLAGS = --all-includes SPATCH_INCLUDE_FLAGS = --all-includes $(addprefix -I ,compat ewah refs sha256 trace2 win32 xdiff)
SPATCH_FLAGS = SPATCH_FLAGS =
SPATCH_TEST_FLAGS = SPATCH_TEST_FLAGS =

View File

@ -327,7 +327,7 @@ static void process_parent(struct last_modified *lm,
if (!(parent->object.flags & PARENT1)) if (!(parent->object.flags & PARENT1))
active_paths_free(lm, parent); active_paths_free(lm, parent);
memset(lm->scratch->words, 0x0, lm->scratch->word_alloc * sizeof(eword_t)); MEMZERO_ARRAY(lm->scratch->words, lm->scratch->word_alloc);
diff_queue_clear(&diff_queued_diff); diff_queue_clear(&diff_queued_diff);
} }

View File

@ -686,7 +686,7 @@ static LPSECURITY_ATTRIBUTES get_sa(struct my_sa_data *d)
goto fail; goto fail;
} }
memset(ea, 0, NR_EA * sizeof(EXPLICIT_ACCESS)); MEMZERO_ARRAY(ea, NR_EA);
ea[0].grfAccessPermissions = GENERIC_READ | GENERIC_WRITE; ea[0].grfAccessPermissions = GENERIC_READ | GENERIC_WRITE;
ea[0].grfAccessMode = SET_ACCESS; ea[0].grfAccessMode = SET_ACCESS;

View File

@ -101,3 +101,23 @@ expression dst, src, n;
-ALLOC_ARRAY(dst, n); -ALLOC_ARRAY(dst, n);
-COPY_ARRAY(dst, src, n); -COPY_ARRAY(dst, src, n);
+DUP_ARRAY(dst, src, n); +DUP_ARRAY(dst, src, n);
@@
type T;
T *ptr;
expression n;
@@
- memset(ptr, \( 0x0 \| 0 \), n * \( sizeof(T)
- \| sizeof(*ptr)
- \) )
+ MEMZERO_ARRAY(ptr, n)
@@
type T;
T[] ptr;
expression n;
@@
- memset(ptr, \( 0x0 \| 0 \), n * \( sizeof(T)
- \| sizeof(*ptr)
- \) )
+ MEMZERO_ARRAY(ptr, n)

View File

@ -50,6 +50,11 @@ foreach header : headers_to_check
coccinelle_headers += meson.project_source_root() / header coccinelle_headers += meson.project_source_root() / header
endforeach endforeach
coccinelle_includes = []
foreach path : ['compat', 'ewah', 'refs', 'sha256', 'trace2', 'win32', 'xdiff']
coccinelle_includes += ['-I', meson.project_source_root() / path]
endforeach
patches = [ ] patches = [ ]
foreach source : coccinelle_sources foreach source : coccinelle_sources
patches += custom_target( patches += custom_target(
@ -58,6 +63,7 @@ foreach source : coccinelle_sources
'--all-includes', '--all-includes',
'--sp-file', concatenated_rules, '--sp-file', concatenated_rules,
'--patch', meson.project_source_root(), '--patch', meson.project_source_root(),
coccinelle_includes,
'@INPUT@', '@INPUT@',
], ],
input: meson.project_source_root() / source, input: meson.project_source_root() / source,

View File

@ -171,7 +171,7 @@ struct delta_index * create_delta_index(const void *buf, unsigned long bufsize)
mem = hash + hsize; mem = hash + hsize;
entry = mem; entry = mem;
memset(hash, 0, hsize * sizeof(*hash)); MEMZERO_ARRAY(hash, hsize);
/* allocate an array to count hash entries */ /* allocate an array to count hash entries */
hash_count = calloc(hsize, sizeof(*hash_count)); hash_count = calloc(hsize, sizeof(*hash_count));

View File

@ -46,8 +46,7 @@ static void bitmap_grow(struct bitmap *self, size_t word_alloc)
{ {
size_t old_size = self->word_alloc; size_t old_size = self->word_alloc;
ALLOC_GROW(self->words, word_alloc, self->word_alloc); ALLOC_GROW(self->words, word_alloc, self->word_alloc);
memset(self->words + old_size, 0x0, MEMZERO_ARRAY(self->words + old_size, (self->word_alloc - old_size));
(self->word_alloc - old_size) * sizeof(eword_t));
} }
void bitmap_set(struct bitmap *self, size_t pos) void bitmap_set(struct bitmap *self, size_t pos)
@ -192,8 +191,8 @@ void bitmap_or_ewah(struct bitmap *self, struct ewah_bitmap *other)
if (self->word_alloc < other_final) { if (self->word_alloc < other_final) {
self->word_alloc = other_final; self->word_alloc = other_final;
REALLOC_ARRAY(self->words, self->word_alloc); REALLOC_ARRAY(self->words, self->word_alloc);
memset(self->words + original_size, 0x0, MEMZERO_ARRAY(self->words + original_size,
(self->word_alloc - original_size) * sizeof(eword_t)); (self->word_alloc - original_size));
} }
ewah_iterator_init(&it, other); ewah_iterator_init(&it, other);

View File

@ -726,6 +726,7 @@ static inline uint64_t u64_add(uint64_t a, uint64_t b)
#define ALLOC_ARRAY(x, alloc) (x) = xmalloc(st_mult(sizeof(*(x)), (alloc))) #define ALLOC_ARRAY(x, alloc) (x) = xmalloc(st_mult(sizeof(*(x)), (alloc)))
#define CALLOC_ARRAY(x, alloc) (x) = xcalloc((alloc), sizeof(*(x))) #define CALLOC_ARRAY(x, alloc) (x) = xcalloc((alloc), sizeof(*(x)))
#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), st_mult(sizeof(*(x)), (alloc))) #define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), st_mult(sizeof(*(x)), (alloc)))
#define MEMZERO_ARRAY(x, alloc) memset((x), 0x0, st_mult(sizeof(*(x)), (alloc)))
#define COPY_ARRAY(dst, src, n) copy_array((dst), (src), (n), sizeof(*(dst)) + \ #define COPY_ARRAY(dst, src, n) copy_array((dst), (src), (n), sizeof(*(dst)) + \
BARF_UNLESS_COPYABLE((dst), (src))) BARF_UNLESS_COPYABLE((dst), (src)))

View File

@ -194,7 +194,7 @@ void hashmap_partial_clear_(struct hashmap *map, ssize_t entry_offset)
return; return;
if (entry_offset >= 0) /* called by hashmap_clear_entries */ if (entry_offset >= 0) /* called by hashmap_clear_entries */
free_individual_entries(map, entry_offset); free_individual_entries(map, entry_offset);
memset(map->table, 0, map->tablesize * sizeof(struct hashmap_entry *)); MEMZERO_ARRAY(map->table, map->tablesize);
map->shrink_at = 0; map->shrink_at = 0;
map->private_size = 0; map->private_size = 0;
} }

View File

@ -75,7 +75,7 @@ static void sort_revindex(struct revindex_entry *entries, unsigned n, off_t max)
for (bits = 0; max >> bits; bits += DIGIT_SIZE) { for (bits = 0; max >> bits; bits += DIGIT_SIZE) {
unsigned i; unsigned i;
memset(pos, 0, BUCKETS * sizeof(*pos)); MEMZERO_ARRAY(pos, BUCKETS);
/* /*
* We want pos[i] to store the index of the last element that * We want pos[i] to store the index of the last element that