GNU Linux-libre 6.1.90-gnu
[releases.git] / scripts / coccinelle / misc / swap.cocci
1 // SPDX-License-Identifier: GPL-2.0-only
2 ///
3 /// Check for opencoded swap() implementation.
4 ///
5 // Confidence: High
6 // Copyright: (C) 2021 Denis Efremov ISPRAS
7 // Options: --no-includes --include-headers
8 //
9 // Keywords: swap
10 //
11
12 virtual patch
13 virtual org
14 virtual report
15 virtual context
16
17 @rvar depends on !patch@
18 identifier tmp;
19 expression a, b;
20 type T;
21 position p;
22 @@
23
24 (
25 * T tmp;
26 |
27 * T tmp = 0;
28 |
29 * T *tmp = NULL;
30 )
31 ... when != tmp
32 * tmp = a;
33 * a = b;@p
34 * b = tmp;
35 ... when != tmp
36
37 @r depends on !patch@
38 identifier tmp;
39 expression a, b;
40 position p != rvar.p;
41 @@
42
43 * tmp = a;
44 * a = b;@p
45 * b = tmp;
46
47 @rpvar depends on patch@
48 identifier tmp;
49 expression a, b;
50 type T;
51 @@
52
53 (
54 - T tmp;
55 |
56 - T tmp = 0;
57 |
58 - T *tmp = NULL;
59 )
60 ... when != tmp
61 - tmp = a;
62 - a = b;
63 - b = tmp
64 + swap(a, b)
65   ;
66 ... when != tmp
67
68 @rp depends on patch@
69 identifier tmp;
70 expression a, b;
71 @@
72
73 - tmp = a;
74 - a = b;
75 - b = tmp
76 + swap(a, b)
77   ;
78
79 @depends on patch && (rpvar || rp)@
80 @@
81
82 (
83   for (...;...;...)
84 - {
85         swap(...);
86 - }
87 |
88   while (...)
89 - {
90         swap(...);
91 - }
92 |
93   if (...)
94 - {
95         swap(...);
96 - }
97 )
98
99
100 @script:python depends on report@
101 p << r.p;
102 @@
103
104 coccilib.report.print_report(p[0], "WARNING opportunity for swap()")
105
106 @script:python depends on org@
107 p << r.p;
108 @@
109
110 coccilib.org.print_todo(p[0], "WARNING opportunity for swap()")
111
112 @script:python depends on report@
113 p << rvar.p;
114 @@
115
116 coccilib.report.print_report(p[0], "WARNING opportunity for swap()")
117
118 @script:python depends on org@
119 p << rvar.p;
120 @@
121
122 coccilib.org.print_todo(p[0], "WARNING opportunity for swap()")