1/// Many iterators have the property that the first argument is always bound 2/// to a real list element, never NULL. False positives arise for some 3/// iterators that do not have this property, or in cases when the loop 4/// cursor is reassigned. The latter should only happen when the matched 5/// code is on the way to a loop exit (break, goto, or return). 6/// 7// Confidence: Moderate 8// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. 9// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2. 10// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2. 11// URL: http://coccinelle.lip6.fr/ 12// Comments: 13// Options: -no_includes -include_headers 14 15virtual patch 16 17@@ 18iterator I; 19expression x,E,E1,E2; 20statement S,S1,S2; 21@@ 22 23I(x,...) { <... 24( 25- if (x == NULL && ...) S 26| 27- if (x != NULL || ...) 28 S 29| 30- (x == NULL) || 31 E 32| 33- (x != NULL) && 34 E 35| 36- (x == NULL && ...) ? E1 : 37 E2 38| 39- (x != NULL || ...) ? 40 E1 41- : E2 42| 43- if (x == NULL && ...) S1 else 44 S2 45| 46- if (x != NULL || ...) 47 S1 48- else S2 49| 50+ BAD( 51 x == NULL 52+ ) 53| 54+ BAD( 55 x != NULL 56+ ) 57) 58 ...> }