123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- // Check if refcount_t type and API should be used
- // instead of atomic_t type when dealing with refcounters
- //
- // Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation
- //
- // Confidence: Moderate
- // URL: http://coccinelle.lip6.fr/
- // Options: --include-headers --very-quiet
- virtual report
- @r1 exists@
- identifier a, x;
- position p1, p2;
- identifier fname =~ ".*free.*";
- identifier fname2 =~ ".*destroy.*";
- identifier fname3 =~ ".*del.*";
- identifier fname4 =~ ".*queue_work.*";
- identifier fname5 =~ ".*schedule_work.*";
- identifier fname6 =~ ".*call_rcu.*";
- @@
- (
- atomic_dec_and_test@p1(&(a)->x)
- |
- atomic_dec_and_lock@p1(&(a)->x, ...)
- |
- atomic_long_dec_and_lock@p1(&(a)->x, ...)
- |
- atomic_long_dec_and_test@p1(&(a)->x)
- |
- atomic64_dec_and_test@p1(&(a)->x)
- |
- local_dec_and_test@p1(&(a)->x)
- )
- ...
- (
- fname@p2(a, ...);
- |
- fname2@p2(...);
- |
- fname3@p2(...);
- |
- fname4@p2(...);
- |
- fname5@p2(...);
- |
- fname6@p2(...);
- )
- @script:python depends on report@
- p1 << r1.p1;
- p2 << r1.p2;
- @@
- msg = "atomic_dec_and_test variation before object free at line %s."
- coccilib.report.print_report(p1[0], msg % (p2[0].line))
- @r4 exists@
- identifier a, x, y;
- position p1, p2;
- identifier fname =~ ".*free.*";
- @@
- (
- atomic_dec_and_test@p1(&(a)->x)
- |
- atomic_dec_and_lock@p1(&(a)->x, ...)
- |
- atomic_long_dec_and_lock@p1(&(a)->x, ...)
- |
- atomic_long_dec_and_test@p1(&(a)->x)
- |
- atomic64_dec_and_test@p1(&(a)->x)
- |
- local_dec_and_test@p1(&(a)->x)
- )
- ...
- y=a
- ...
- fname@p2(y, ...);
- @script:python depends on report@
- p1 << r4.p1;
- p2 << r4.p2;
- @@
- msg = "atomic_dec_and_test variation before object free at line %s."
- coccilib.report.print_report(p1[0], msg % (p2[0].line))
- @r2 exists@
- identifier a, x;
- position p1;
- @@
- (
- atomic_add_unless(&(a)->x,-1,1)@p1
- |
- atomic_long_add_unless(&(a)->x,-1,1)@p1
- |
- atomic64_add_unless(&(a)->x,-1,1)@p1
- )
- @script:python depends on report@
- p1 << r2.p1;
- @@
- msg = "atomic_add_unless"
- coccilib.report.print_report(p1[0], msg)
- @r3 exists@
- identifier x;
- position p1;
- @@
- (
- x = atomic_add_return@p1(-1, ...);
- |
- x = atomic_long_add_return@p1(-1, ...);
- |
- x = atomic64_add_return@p1(-1, ...);
- )
- @script:python depends on report@
- p1 << r3.p1;
- @@
- msg = "x = atomic_add_return(-1, ...)"
- coccilib.report.print_report(p1[0], msg)
|