GNU Linux-libre 6.1.90-gnu
[releases.git] / 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 @only_field depends on patch@
55 identifier name, array;
56 type T;
57 position 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@
71 identifier name, array;
72 type T;
73 position p : script:python() { relevant(p) };
74 // position @q with rule "only_field" simplifies
75 // handling of bitfields, arrays, etc.
76 position 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@
96 p << r.p;
97 @@
98
99 msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)"
100 coccilib.report.print_report(p[0], msg)
101
102 @script: python depends on org@
103 p << r.p;
104 @@
105
106 msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)"
107 coccilib.org.print_todo(p[0], msg)