1// SPDX-License-Identifier: GPL-2.0-only
2// Check if refcount_t type and API should be used
3// instead of atomic_t type when dealing with refcounters
4//
5// Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation
6//
7// Confidence: Moderate
8// URL: https://coccinelle.gitlabpages.inria.fr/website
9// Options: --include-headers --very-quiet
10
11virtual report
12
13@r1 exists@
14identifier a, x;
15position p1, p2;
16identifier fname =~ ".*free.*";
17identifier fname2 =~ ".*destroy.*";
18identifier fname3 =~ ".*del.*";
19identifier fname4 =~ ".*queue_work.*";
20identifier fname5 =~ ".*schedule_work.*";
21identifier fname6 =~ ".*call_rcu.*";
22
23@@
24
25(
26 atomic_dec_and_test@p1(&(a)->x)
27|
28 atomic_dec_and_lock@p1(&(a)->x, ...)
29|
30 atomic_long_dec_and_lock@p1(&(a)->x, ...)
31|
32 atomic_long_dec_and_test@p1(&(a)->x)
33|
34 atomic64_dec_and_test@p1(&(a)->x)
35|
36 local_dec_and_test@p1(&(a)->x)
37)
38...
39(
40 fname@p2(a, ...);
41|
42 fname2@p2(...);
43|
44 fname3@p2(...);
45|
46 fname4@p2(...);
47|
48 fname5@p2(...);
49|
50 fname6@p2(...);
51)
52
53
54@script:python depends on report@
55p1 << r1.p1;
56p2 << r1.p2;
57@@
58msg = "atomic_dec_and_test variation before object free at line %s."
59coccilib.report.print_report(p1[0], msg % (p2[0].line))
60
61@r4 exists@
62identifier a, x, y;
63position p1, p2;
64identifier fname =~ ".*free.*";
65
66@@
67
68(
69 atomic_dec_and_test@p1(&(a)->x)
70|
71 atomic_dec_and_lock@p1(&(a)->x, ...)
72|
73 atomic_long_dec_and_lock@p1(&(a)->x, ...)
74|
75 atomic_long_dec_and_test@p1(&(a)->x)
76|
77 atomic64_dec_and_test@p1(&(a)->x)
78|
79 local_dec_and_test@p1(&(a)->x)
80)
81...
82y=a
83...
84fname@p2(y, ...);
85
86
87@script:python depends on report@
88p1 << r4.p1;
89p2 << r4.p2;
90@@
91msg = "atomic_dec_and_test variation before object free at line %s."
92coccilib.report.print_report(p1[0], msg % (p2[0].line))
93
94@r2 exists@
95identifier a, x;
96position p1;
97@@
98
99(
100atomic_add_unless(&(a)->x,-1,1)@p1
101|
102atomic_long_add_unless(&(a)->x,-1,1)@p1
103|
104atomic64_add_unless(&(a)->x,-1,1)@p1
105)
106
107@script:python depends on report@
108p1 << r2.p1;
109@@
110msg = "atomic_add_unless"
111coccilib.report.print_report(p1[0], msg)
112
113@r3 exists@
114identifier x;
115position p1;
116@@
117
118(
119x = atomic_add_return@p1(-1, ...);
120|
121x = atomic_long_add_return@p1(-1, ...);
122|
123x = atomic64_add_return@p1(-1, ...);
124)
125
126@script:python depends on report@
127p1 << r3.p1;
128@@
129msg = "x = atomic_add_return(-1, ...)"
130coccilib.report.print_report(p1[0], msg)
131