131 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0-only
 | |
| // 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: https://coccinelle.gitlabpages.inria.fr/website
 | |
| // 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 = "WARNING: 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 = "WARNING: 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 = "WARNING: 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 = "WARNING: x = atomic_add_return(-1, ...)"
 | |
| coccilib.report.print_report(p1[0], msg)
 |