Merge tag 'trace-printf-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/trace...
[drm/drm-misc.git] / scripts / coccinelle / misc / minmax.cocci
blobca4830ae3042013946665f047ca8d4004b83f888
1 // SPDX-License-Identifier: GPL-2.0-only
2 ///
3 /// Check for opencoded min(), max() implementations.
4 /// Generated patches sometimes require adding a cast to fix compile warning.
5 /// Warnings/patches scope intentionally limited to a function body.
6 ///
7 // Confidence: Medium
8 // Copyright: (C) 2021 Denis Efremov ISPRAS
9 // Options: --no-includes --include-headers
11 // Keywords: min, max
15 virtual report
16 virtual org
17 virtual context
18 virtual patch
20 @rmax depends on !patch@
21 identifier func;
22 expression x, y;
23 binary operator cmp = {>, >=};
24 position p;
27 func(...)
29         <...
30 *       ((x) cmp@p (y) ? (x) : (y))
31         ...>
34 @rmaxif depends on !patch@
35 identifier func;
36 expression x, y;
37 expression max_val;
38 binary operator cmp = {>, >=};
39 position p;
42 func(...)
44         <...
45 *       if ((x) cmp@p (y)) {
46 *               max_val = (x);
47 *       } else {
48 *               max_val = (y);
49 *       }
50         ...>
53 // Ignore errcode returns.
54 @errcode@
55 position p;
56 identifier func;
57 expression x;
58 binary operator cmp = {<, <=};
61 func(...)
63         <...
64         return ((x) cmp@p 0 ? (x) : 0);
65         ...>
68 @rmin depends on !patch@
69 identifier func;
70 expression x, y;
71 binary operator cmp = {<, <=};
72 position p != errcode.p;
75 func(...)
77         <...
78 *       ((x) cmp@p (y) ? (x) : (y))
79         ...>
82 @rminif depends on !patch@
83 identifier func;
84 expression x, y;
85 expression min_val;
86 binary operator cmp = {<, <=};
87 position p;
90 func(...)
92         <...
93 *       if ((x) cmp@p (y)) {
94 *               min_val = (x);
95 *       } else {
96 *               min_val = (y);
97 *       }
98         ...>
101 @pmax depends on patch@
102 identifier func;
103 expression x, y;
104 binary operator cmp = {>=, >};
107 func(...)
109         <...
110 -       ((x) cmp (y) ? (x) : (y))
111 +       max(x, y)
112         ...>
115 @pmaxif depends on patch@
116 identifier func;
117 expression x, y;
118 expression max_val;
119 binary operator cmp = {>=, >};
122 func(...)
124         <...
125 -       if ((x) cmp (y)) {
126 -               max_val = x;
127 -       } else {
128 -               max_val = y;
129 -       }
130 +       max_val = max(x, y);
131         ...>
134 @pmin depends on patch@
135 identifier func;
136 expression x, y;
137 binary operator cmp = {<=, <};
138 position p != errcode.p;
141 func(...)
143         <...
144 -       ((x) cmp@p (y) ? (x) : (y))
145 +       min(x, y)
146         ...>
149 @pminif depends on patch@
150 identifier func;
151 expression x, y;
152 expression min_val;
153 binary operator cmp = {<=, <};
156 func(...)
158         <...
159 -       if ((x) cmp (y)) {
160 -               min_val = x;
161 -       } else {
162 -               min_val = y;
163 -       }
164 +       min_val = min(x, y);
165         ...>
168 @script:python depends on report@
169 p << rmax.p;
172 for p0 in p:
173         coccilib.report.print_report(p0, "WARNING opportunity for max()")
175 @script:python depends on org@
176 p << rmax.p;
179 for p0 in p:
180         coccilib.org.print_todo(p0, "WARNING opportunity for max()")
182 @script:python depends on report@
183 p << rmaxif.p;
186 for p0 in p:
187         coccilib.report.print_report(p0, "WARNING opportunity for max()")
189 @script:python depends on org@
190 p << rmaxif.p;
193 for p0 in p:
194         coccilib.org.print_todo(p0, "WARNING opportunity for max()")
196 @script:python depends on report@
197 p << rmin.p;
200 for p0 in p:
201         coccilib.report.print_report(p0, "WARNING opportunity for min()")
203 @script:python depends on org@
204 p << rmin.p;
207 for p0 in p:
208         coccilib.org.print_todo(p0, "WARNING opportunity for min()")
210 @script:python depends on report@
211 p << rminif.p;
214 for p0 in p:
215         coccilib.report.print_report(p0, "WARNING opportunity for min()")
217 @script:python depends on org@
218 p << rminif.p;
221 for p0 in p:
222         coccilib.org.print_todo(p0, "WARNING opportunity for min()")