95 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
/// Many iterators have the property that the first argument is always bound
 | 
						|
/// to a real list element, never NULL.
 | 
						|
//# False positives arise for some iterators that do not have this property,
 | 
						|
//# or in cases when the loop cursor is reassigned.  The latter should only
 | 
						|
//# happen when the matched code is on the way to a loop exit (break, goto,
 | 
						|
//# or return).
 | 
						|
///
 | 
						|
// Confidence: Moderate
 | 
						|
// Copyright: (C) 2010-2012 Nicolas Palix.  GPLv2.
 | 
						|
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.  GPLv2.
 | 
						|
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.
 | 
						|
// URL: http://coccinelle.lip6.fr/
 | 
						|
// Comments:
 | 
						|
// Options: --no-includes --include-headers
 | 
						|
 | 
						|
virtual patch
 | 
						|
virtual context
 | 
						|
virtual org
 | 
						|
virtual report
 | 
						|
 | 
						|
@depends on patch@
 | 
						|
iterator I;
 | 
						|
expression x,E,E1,E2;
 | 
						|
statement S,S1,S2;
 | 
						|
@@
 | 
						|
 | 
						|
I(x,...) { <...
 | 
						|
(
 | 
						|
- if (x == NULL && ...) S
 | 
						|
|
 | 
						|
- if (x != NULL || ...)
 | 
						|
  S
 | 
						|
|
 | 
						|
- (x == NULL) ||
 | 
						|
  E
 | 
						|
|
 | 
						|
- (x != NULL) &&
 | 
						|
  E
 | 
						|
|
 | 
						|
- (x == NULL && ...) ? E1 :
 | 
						|
  E2
 | 
						|
|
 | 
						|
- (x != NULL || ...) ?
 | 
						|
  E1
 | 
						|
- : E2
 | 
						|
|
 | 
						|
- if (x == NULL && ...) S1 else
 | 
						|
  S2
 | 
						|
|
 | 
						|
- if (x != NULL || ...)
 | 
						|
  S1
 | 
						|
- else S2
 | 
						|
|
 | 
						|
+ BAD(
 | 
						|
  x == NULL
 | 
						|
+ )
 | 
						|
|
 | 
						|
+ BAD(
 | 
						|
  x != NULL
 | 
						|
+ )
 | 
						|
)
 | 
						|
  ...> }
 | 
						|
 | 
						|
@r depends on !patch exists@
 | 
						|
iterator I;
 | 
						|
expression x,E;
 | 
						|
position p1,p2;
 | 
						|
@@
 | 
						|
 | 
						|
*I@p1(x,...)
 | 
						|
{ ... when != x = E
 | 
						|
(
 | 
						|
*  x@p2 == NULL
 | 
						|
|
 | 
						|
*  x@p2 != NULL
 | 
						|
)
 | 
						|
  ... when any
 | 
						|
}
 | 
						|
 | 
						|
@script:python depends on org@
 | 
						|
p1 << r.p1;
 | 
						|
p2 << r.p2;
 | 
						|
@@
 | 
						|
 | 
						|
cocci.print_main("iterator-bound variable",p1)
 | 
						|
cocci.print_secs("useless NULL test",p2)
 | 
						|
 | 
						|
@script:python depends on report@
 | 
						|
p1 << r.p1;
 | 
						|
p2 << r.p2;
 | 
						|
@@
 | 
						|
 | 
						|
msg = "ERROR: iterator variable bound on line %s cannot be NULL" % (p1[0].line)
 | 
						|
coccilib.report.print_report(p2[0], msg)
 |