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