xref: /linux/scripts/coccinelle/misc/flexible_array.cocci (revision 20c7775aecea04d8ca322039969d49dcf568e0e9)
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
13virtual context
14virtual report
15virtual org
16virtual patch
17
18@initialize:python@
19@@
20def 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@
27identifier name, array;
28type T;
29position 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@
55identifier name, array;
56type T;
57position 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@
77p << r.p;
78@@
79
80msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)"
81coccilib.report.print_report(p[0], msg)
82
83@script: python depends on org@
84p << r.p;
85@@
86
87msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)"
88coccilib.org.print_todo(p[0], msg)
89