History

coccinelle: misc: add swap script

Check for opencoded swap() implementation.

Denis Efremov committed 5 years ago

Commit 7845daa1 parent cb627321 file · +122 −0Browse files

Unified · Split

scripts/coccinelle/misc/swap.cocci+122−0
@@ -0,0 +1,122 @@
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()")