[cocci] [PATCH v2] scripts/coccinelle: Add script for using ARRAY_END()

Alejandro Colomar <[email protected]> Mon, 9 Mar 2026 13:13:09 +0100
Newsgroups fr.inria.cocci
Message-ID <9fd8d3d1e7ef3efb6e6dae0972dd515ff02e42bd.1773058287.git.alx@kernel.org>
Recently, we added an ARRAY_END() macro to simplify finding a pointer
one past the last element in an array.  Such a pointer is often called
the 'end', and thus the macro name.

Make it easy to find more places where that macro should be used.

See also:
436debc9cad8 ("array_size.h: add ARRAY_END()")
8118f197b7b7 ("mm: fix benign off-by-one bugs")
a9e5620c9a9e ("kernel: fix off-by-one benign bugs")
61e9210e2392 ("mm: use ARRAY_END() instead of open-coding it")

Cc: Kees Cook <[email protected]>
Cc: Markus Elfring <[email protected]>
Cc: Julia Lawall <[email protected]>
Cc: Nicolas Palix <[email protected]>
Signed-off-by: Alejandro Colomar <[email protected]>
---
 scripts/coccinelle/misc/array_end.cocci | 74 +++++++++++++++++++++++++
 1 file changed, 74 insertions(+)
 create mode 100644 scripts/coccinelle/misc/array_end.cocci

diff --git a/scripts/coccinelle/misc/array_end.cocci b/scripts/coccinelle/misc/array_end.cocci
new file mode 100644
index 00000000..fc431c4a
--- /dev/null
+++ b/scripts/coccinelle/misc/array_end.cocci
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/// Use ARRAY_END instead of an expression derived from ARRAY_SIZE
+//
+// Confidence: High
+// Copyright: 2026, Alejandro Colomar <[email protected]>
+// Comments: No known false positives, but has a few false negatives
+// Options: --no-includes --include-headers
+
+virtual patch
+virtual context
+virtual org
+virtual report
+
+@depends on context@
+type T;
+T[] a;
+expression b;
+@@
+(
+* (a + ARRAY_SIZE(a))
+|
+* (&a[0] + ARRAY_SIZE(a))
+|
+* (&a[ARRAY_SIZE(a)])
+|
+* (&a[ARRAY_SIZE(a) - b])
+)
+
+@depends on patch@
+type T;
+T[] a;
+expression b;
+@@
+(
+- (a + ARRAY_SIZE(a))
++ ARRAY_END(a)
+|
+- (&a[0] + ARRAY_SIZE(a))
++ ARRAY_END(a)
+|
+- (&a[ARRAY_SIZE(a)])
++ ARRAY_END(a)
+|
+- (&a[ARRAY_SIZE(a) - b])
++ ARRAY_END(a) - b
+)
+
+@r depends on org || report@
+type T;
+T[] a;
+expression b;
+position p;
+@@
+(
+ (a@p + ARRAY_SIZE(a))
+|
+ (&a[0]@p + ARRAY_SIZE(a))
+|
+ (&a[ARRAY_SIZE(a)]@p)
+|
+ (&a[ARRAY_SIZE(a)@p - b])
+)
+
+@script:python depends on org@
+p << r.p;
+@@
+
+coccilib.org.print_todo(p[0], "WARNING should use ARRAY_END")
+
+@script:python depends on report@
+p << r.p;
+@@
+
+coccilib.report.print_report(p[0], "WARNING: opportunity for ARRAY_END")

Range-diff against v1:
1:  f1c9dff5 ! 1:  9fd8d3d1 scripts/coccinelle: Add script for using ARRAY_END()
    @@ Commit message
         one past the last element in an array.  Such a pointer is often called
         the 'end', and thus the macro name.
     
    -    This script makes it easy to find more places where that macro should be
    -    used.
    +    Make it easy to find more places where that macro should be used.
     
         See also:
         436debc9cad8 ("array_size.h: add ARRAY_END()")
    @@ Commit message
         61e9210e2392 ("mm: use ARRAY_END() instead of open-coding it")
     
         Cc: Kees Cook <[email protected]>
    +    Cc: Markus Elfring <[email protected]>
         Cc: Julia Lawall <[email protected]>
         Cc: Nicolas Palix <[email protected]>
         Signed-off-by: Alejandro Colomar <[email protected]>
    @@ scripts/coccinelle/misc/array_end.cocci (new)
     +// SPDX-License-Identifier: GPL-2.0-only
     +/// Use ARRAY_END instead of an expression derived from ARRAY_SIZE
     +//
    -+// Confidence: ???
    ++// Confidence: High
     +// Copyright: 2026, Alejandro Colomar <[email protected]>
    -+// Comments:
    ++// Comments: No known false positives, but has a few false negatives
     +// Options: --no-includes --include-headers
     +
     +virtual patch
    @@ scripts/coccinelle/misc/array_end.cocci (new)
     +virtual org
     +virtual report
     +
    -+@i@
    -+@@
    -+
    -+#include <linux/kernel.h>
    -+
    -+//----------------------------------------------------------
    -+//  For context mode
    -+//----------------------------------------------------------
    -+
    -+@depends on i&&context@
    ++@depends on context@
     +type T;
     +T[] a;
     +expression b;
    @@ scripts/coccinelle/misc/array_end.cocci (new)
     +* (&a[ARRAY_SIZE(a) - b])
     +)
     +
    -+//----------------------------------------------------------
    -+//  For patch mode
    -+//----------------------------------------------------------
    -+
    -+@depends on i&&patch@
    ++@depends on patch@
     +type T;
     +T[] a;
     +expression b;
    @@ scripts/coccinelle/misc/array_end.cocci (new)
     ++ ARRAY_END(a) - b
     +)
     +
    -+//----------------------------------------------------------
    -+//  For org and report mode
    -+//----------------------------------------------------------
    -+
    -+@r depends on (org || report)@
    ++@r depends on org || report@
     +type T;
     +T[] a;
     +expression b;
    @@ scripts/coccinelle/misc/array_end.cocci (new)
     +p << r.p;
     +@@
     +
    -+msg="WARNING: Use ARRAY_END"
    -+coccilib.report.print_report(p[0], msg)
    -+
    ++coccilib.report.print_report(p[0], "WARNING: opportunity for ARRAY_END")
-- 
2.53.0