[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