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 11 virtual report 12 13 @r1 exists@ 14 identifier a, x; 15 position p1, p2; 16 identifier fname =~ ".*free.*"; 17 identifier fname2 =~ ".*destroy.*"; 18 identifier fname3 =~ ".*del.*"; 19 identifier fname4 =~ ".*queue_work.*"; 20 identifier fname5 =~ ".*schedule_work.*"; 21 identifier 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@ 55 p1 << r1.p1; 56 p2 << r1.p2; 57 @@ 58 msg = "WARNING: atomic_dec_and_test variation before object free at line %s." 59 coccilib.report.print_report(p1[0], msg % (p2[0].line)) 60 61 @r4 exists@ 62 identifier a, x, y; 63 position p1, p2; 64 identifier 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 ... 82 y=a 83 ... 84 fname@p2(y, ...); 85 86 87 @script:python depends on report@ 88 p1 << r4.p1; 89 p2 << r4.p2; 90 @@ 91 msg = "WARNING: atomic_dec_and_test variation before object free at line %s." 92 coccilib.report.print_report(p1[0], msg % (p2[0].line)) 93 94 @r2 exists@ 95 identifier a, x; 96 position p1; 97 @@ 98 99 ( 100 atomic_add_unless(&(a)->x,-1,1)@p1 101 | 102 atomic_long_add_unless(&(a)->x,-1,1)@p1 103 | 104 atomic64_add_unless(&(a)->x,-1,1)@p1 105 ) 106 107 @script:python depends on report@ 108 p1 << r2.p1; 109 @@ 110 msg = "WARNING: atomic_add_unless" 111 coccilib.report.print_report(p1[0], msg) 112 113 @r3 exists@ 114 identifier x; 115 position p1; 116 @@ 117 118 ( 119 x = atomic_add_return@p1(-1, ...); 120 | 121 x = atomic_long_add_return@p1(-1, ...); 122 | 123 x = atomic64_add_return@p1(-1, ...); 124 ) 125 126 @script:python depends on report@ 127 p1 << r3.p1; 128 @@ 129 msg = "WARNING: x = atomic_add_return(-1, ...)" 130 coccilib.report.print_report(p1[0], msg)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.