12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- /// 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 Nicolas Palix, DIKU. GPLv2.
- // Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
- // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
- // URL: http://coccinelle.lip6.fr/
- // Comments:
- // Options: -no_includes -include_headers
- virtual 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
- + )
- )
- ...> }
|