Matthias Maennich | ef349ab | 2019-07-25 11:17:04 +0100 | [diff] [blame] | 1 | // SPDX-License-Identifier: GPL-2.0-only |
Elena Reshetova | b56e535 | 2017-09-01 12:40:20 +0300 | [diff] [blame] | 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 | |
| 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 = "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 = "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 = "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 = "x = atomic_add_return(-1, ...)" |
| 130 | coccilib.report.print_report(p1[0], msg) |