On 2026-03-15T23:11:03+0100, Alejandro Colomar wrote: > 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 > Cc: Markus Elfring > Cc: Julia Lawall > Cc: Nicolas Palix > Signed-off-by: Alejandro Colomar > --- > > Hi! > > This v3 only has one change: I've removed the comment about the false > negatives. They were due to spatch(1) not being able to correctly parse > unrelated code elsewhere. > > See range-diff and interdiff at the bottom. Oops, actually, only the range-diff. > > > Have a lovely night! > Alex > > scripts/coccinelle/misc/array_end.cocci | 73 +++++++++++++++++++++++++ > 1 file changed, 73 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..88c664de > --- /dev/null > +++ b/scripts/coccinelle/misc/array_end.cocci > @@ -0,0 +1,73 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/// Use ARRAY_END instead of an expression derived from ARRAY_SIZE > +// > +// Confidence: High > +// Copyright: 2026, Alejandro Colomar > +// 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: > 1: 9fd8d3d1 ! 1: 2ae22f8b scripts/coccinelle: Add script for using ARRAY_END() > @@ scripts/coccinelle/misc/array_end.cocci (new) > +// > +// Confidence: High > +// Copyright: 2026, Alejandro Colomar > -+// Comments: No known false positives, but has a few false negatives > +// Options: --no-includes --include-headers > + > +virtual patch > -- > 2.53.0 > --