Subject: Re: [PATCH 2/2] contrib/coccinelle: pass include paths to spatch(1)

From: Junio C Hamano <[email-masked]>
Date: Sat, 13 Dec 2025 10:22:52 +0900

Toon Claes <[email-masked]> writes:

> In the previous commit a new coccinelle rule is added. But neiter
> `make coccicheck` nor `meson compile coccicheck` did detect a case in
> builtin/last-modified.c.

I can reproduce this.  I started with only git-compat-util.h and
contrib/coccinelle/array.cocci from your [1/2] and without [2/2],
and "make coccicheck" produced all other changes contained in [1/2]
and the leftover changes to diffcore-delta.c, linear-assignment.c
and shallow.c I reported earlier in a separate message, but the one
in last-modified.c is left intact.  There are successful rewrites
that involve eword_t in other files, so I am not sure what the
problem is.

I used the following instead of your [1/2], as suggested by René in
an earlier exchange.  I did not see any changes but I did not expect
to, either.

 contrib/coccinelle/array.cocci | 22 ++++++++++++++++++++++
 git-compat-util.h              |  1 +
 2 files changed, 23 insertions(+)

diff --git a/contrib/coccinelle/array.cocci b/contrib/coccinelle/array.cocci
index 27a3b479c9..ae23114b68 100644
--- a/contrib/coccinelle/array.cocci
+++ b/contrib/coccinelle/array.cocci
@@ -101,3 +101,25 @@ expression dst, src, n;
 -ALLOC_ARRAY(dst, n);
 -COPY_ARRAY(dst, src, n);
 +DUP_ARRAY(dst, src, n);
+
+@@
+type T;
+T *ptr;
+expression n;
+@@
+- memset(ptr, \( '\0' \| 0 \), n * \( sizeof(T)
+-                                  \| sizeof(*ptr)
+-                                  \| sizeof(ptr[0])
+-                                  \) )
++ MEMZERO_ARRAY(ptr, n)
+
+@@
+type T;
+T[] ptr;
+expression n;
+@@
+- memset(ptr, \( '\0' \| 0 \), n * \( sizeof(T)
+-                                  \| sizeof(*ptr)
+-                                  \| sizeof(ptr[0])
+-                                  \) )
++ MEMZERO_ARRAY(ptr, n)
diff --git a/git-compat-util.h b/git-compat-util.h
index 398e0fac4f..2b8192fd2e 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -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 CALLOC_ARRAY(x, alloc) (x) = xcalloc((alloc), sizeof(*(x)))
 #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)) + \
 	BARF_UNLESS_COPYABLE((dst), (src)))