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: http://coccinelle.lip6.fr/ 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