Home | History | Annotate | Download | only in iterators
      1 /// If list_for_each_entry, etc complete a traversal of the list, the iterator
      2 /// variable ends up pointing to an address at an offset from the list head,
      3 /// and not a meaningful structure.  Thus this value should not be used after
      4 /// the end of the iterator.
      5 //#False positives arise when there is a goto in the iterator and the
      6 //#reported reference is at the label of this goto.  Some flag tests
      7 //#may also cause a report to be a false positive.
      8 ///
      9 // Confidence: Moderate
     10 // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.  GPLv2.
     11 // Copyright: (C) 2012 Gilles Muller, INRIA/LIP6.  GPLv2.
     12 // URL: http://coccinelle.lip6.fr/
     13 // Comments:
     14 // Options: --no-includes --include-headers
     15 
     16 virtual context
     17 virtual org
     18 virtual report
     19 
     20 @r exists@
     21 identifier c,member;
     22 expression E,x;
     23 iterator name list_for_each_entry;
     24 iterator name list_for_each_entry_reverse;
     25 iterator name list_for_each_entry_continue;
     26 iterator name list_for_each_entry_continue_reverse;
     27 iterator name list_for_each_entry_from;
     28 iterator name list_for_each_entry_safe;
     29 iterator name list_for_each_entry_safe_continue;
     30 iterator name list_for_each_entry_safe_from;
     31 iterator name list_for_each_entry_safe_reverse;
     32 iterator name hlist_for_each_entry;
     33 iterator name hlist_for_each_entry_continue;
     34 iterator name hlist_for_each_entry_from;
     35 iterator name hlist_for_each_entry_safe;
     36 statement S;
     37 position p1,p2;
     38 @@
     39 
     40 (
     41 list_for_each_entry@p1(c,...,member) { ... when != break;
     42                                  when forall
     43                                  when strict
     44 }
     45 |
     46 list_for_each_entry_reverse@p1(c,...,member) { ... when != break;
     47                                  when forall
     48                                  when strict
     49 }
     50 |
     51 list_for_each_entry_continue@p1(c,...,member) { ... when != break;
     52                                  when forall
     53                                  when strict
     54 }
     55 |
     56 list_for_each_entry_continue_reverse@p1(c,...,member) { ... when != break;
     57                                  when forall
     58                                  when strict
     59 }
     60 |
     61 list_for_each_entry_from@p1(c,...,member) { ... when != break;
     62                                  when forall
     63                                  when strict
     64 }
     65 |
     66 list_for_each_entry_safe@p1(c,...,member) { ... when != break;
     67                                  when forall
     68                                  when strict
     69 }
     70 |
     71 list_for_each_entry_safe_continue@p1(c,...,member) { ... when != break;
     72                                  when forall
     73                                  when strict
     74 }
     75 |
     76 list_for_each_entry_safe_from@p1(c,...,member) { ... when != break;
     77                                  when forall
     78                                  when strict
     79 }
     80 |
     81 list_for_each_entry_safe_reverse@p1(c,...,member) { ... when != break;
     82                                  when forall
     83                                  when strict
     84 }
     85 )
     86 ...
     87 (
     88 list_for_each_entry(c,...) S
     89 |
     90 list_for_each_entry_reverse(c,...) S
     91 |
     92 list_for_each_entry_continue(c,...) S
     93 |
     94 list_for_each_entry_continue_reverse(c,...) S
     95 |
     96 list_for_each_entry_from(c,...) S
     97 |
     98 list_for_each_entry_safe(c,...) S
     99 |
    100 list_for_each_entry_safe(x,c,...) S
    101 |
    102 list_for_each_entry_safe_continue(c,...) S
    103 |
    104 list_for_each_entry_safe_continue(x,c,...) S
    105 |
    106 list_for_each_entry_safe_from(c,...) S
    107 |
    108 list_for_each_entry_safe_from(x,c,...) S
    109 |
    110 list_for_each_entry_safe_reverse(c,...) S
    111 |
    112 list_for_each_entry_safe_reverse(x,c,...) S
    113 |
    114 hlist_for_each_entry(c,...) S
    115 |
    116 hlist_for_each_entry_continue(c,...) S
    117 |
    118 hlist_for_each_entry_from(c,...) S
    119 |
    120 hlist_for_each_entry_safe(c,...) S
    121 |
    122 list_remove_head(x,c,...)
    123 |
    124 sizeof(<+...c...+>)
    125 |
    126  &c->member
    127 |
    128 c = E
    129 |
    130 *c@p2
    131 )
    132 
    133 @script:python depends on org@
    134 p1 << r.p1;
    135 p2 << r.p2;
    136 @@
    137 
    138 cocci.print_main("invalid iterator index reference",p2)
    139 cocci.print_secs("iterator",p1)
    140 
    141 @script:python depends on report@
    142 p1 << r.p1;
    143 p2 << r.p2;
    144 @@
    145 
    146 msg = "ERROR: invalid reference to the index variable of the iterator on line %s" % (p1[0].line)
    147 coccilib.report.print_report(p2[0], msg)
    148