cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

atomic_as_refcounter.cocci (2272B)


      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)