Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

coccinelle: misc: add flexible_array.cocci script

One-element and zero-length arrays are deprecated [1]. Kernel
code should always use "flexible array members" instead, except
for existing uapi definitions.

The script warns about one-element and zero-length arrays in structs.

[1] commit 68e4cd17e218 ("docs: deprecated.rst: Add zero-length and
one-element arrays")

Cc: Kees Cook <keescook@chromium.org>
Cc: Gustavo A. R. Silva <gustavoars@kernel.org>
Signed-off-by: Denis Efremov <efremov@linux.com>
Signed-off-by: Julia Lawall <julia.lawall@inria.fr>

authored by

Denis Efremov and committed by
Julia Lawall
7b36c139 44d8870f

+88
+88
scripts/coccinelle/misc/flexible_array.cocci
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /// 3 + /// Zero-length and one-element arrays are deprecated, see 4 + /// Documentation/process/deprecated.rst 5 + /// Flexible-array members should be used instead. 6 + /// 7 + // 8 + // Confidence: High 9 + // Copyright: (C) 2020 Denis Efremov ISPRAS. 10 + // Comments: 11 + // Options: --no-includes --include-headers 12 + 13 + virtual context 14 + virtual report 15 + virtual org 16 + virtual patch 17 + 18 + @initialize:python@ 19 + @@ 20 + def relevant(positions): 21 + for p in positions: 22 + if "uapi" in p.file: 23 + return False 24 + return True 25 + 26 + @r depends on !patch@ 27 + identifier name, array; 28 + type T; 29 + position p : script:python() { relevant(p) }; 30 + @@ 31 + 32 + ( 33 + struct name { 34 + ... 35 + * T array@p[\(0\|1\)]; 36 + }; 37 + | 38 + struct { 39 + ... 40 + * T array@p[\(0\|1\)]; 41 + }; 42 + | 43 + union name { 44 + ... 45 + * T array@p[\(0\|1\)]; 46 + }; 47 + | 48 + union { 49 + ... 50 + * T array@p[\(0\|1\)]; 51 + }; 52 + ) 53 + 54 + @depends on patch@ 55 + identifier name, array; 56 + type T; 57 + position p : script:python() { relevant(p) }; 58 + @@ 59 + 60 + ( 61 + struct name { 62 + ... 63 + T array@p[ 64 + - 0 65 + ]; 66 + }; 67 + | 68 + struct { 69 + ... 70 + T array@p[ 71 + - 0 72 + ]; 73 + }; 74 + ) 75 + 76 + @script: python depends on report@ 77 + p << r.p; 78 + @@ 79 + 80 + msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)" 81 + coccilib.report.print_report(p[0], msg) 82 + 83 + @script: python depends on org@ 84 + p << r.p; 85 + @@ 86 + 87 + msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)" 88 + coccilib.org.print_todo(p[0], msg)