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@only_field depends on patch@
55identifier name, array;
56type T;
57position q;
58@@
59
60(
61  struct name {@q
62    T array[0];
63  };
64|
65  struct {@q
66    T array[0];
67  };
68)
69
70@depends on patch@
71identifier name, array;
72type T;
73position p : script:python() { relevant(p) };
74// position @q with rule "only_field" simplifies
75// handling of bitfields, arrays, etc.
76position q != only_field.q;
77@@
78
79(
80  struct name {@q
81    ...
82    T array@p[
83-       0
84    ];
85  };
86|
87  struct {@q
88    ...
89    T array@p[
90-       0
91    ];
92  };
93)
94
95@script: python depends on report@
96p << r.p;
97@@
98
99msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)"
100coccilib.report.print_report(p[0], msg)
101
102@script: python depends on org@
103p << r.p;
104@@
105
106msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)"
107coccilib.org.print_todo(p[0], msg)
108