1/// Use setup_timer function instead of initializing timer with the function 2/// and data fields 3// Confidence: High 4// Copyright: (C) 2016 Vaishali Thakkar, Oracle. GPLv2 5// Options: --no-includes --include-headers 6// Keywords: init_timer, setup_timer 7 8virtual patch 9virtual context 10virtual org 11virtual report 12 13@match_immediate_function_data_after_init_timer 14depends on patch && !context && !org && !report@ 15expression e, func, da; 16@@ 17 18-init_timer (&e); 19+setup_timer (&e, func, da); 20 21( 22-e.function = func; 23-e.data = da; 24| 25-e.data = da; 26-e.function = func; 27) 28 29@match_function_and_data_after_init_timer 30depends on patch && !context && !org && !report@ 31expression e1, e2, e3, e4, e5, a, b; 32@@ 33 34-init_timer (&e1); 35+setup_timer (&e1, a, b); 36 37... when != a = e2 38 when != b = e3 39( 40-e1.function = a; 41... when != b = e4 42-e1.data = b; 43| 44-e1.data = b; 45... when != a = e5 46-e1.function = a; 47) 48 49@r1 exists@ 50identifier f; 51position p; 52@@ 53 54f(...) { ... when any 55 init_timer@p(...) 56 ... when any 57} 58 59@r2 exists@ 60identifier g != r1.f; 61struct timer_list t; 62expression e8; 63@@ 64 65g(...) { ... when any 66 t.data = e8 67 ... when any 68} 69 70// It is dangerous to use setup_timer if data field is initialized 71// in another function. 72 73@script:python depends on r2@ 74p << r1.p; 75@@ 76 77cocci.include_match(False) 78 79@r3 depends on patch && !context && !org && !report@ 80expression e6, e7, c; 81position r1.p; 82@@ 83 84-init_timer@p (&e6); 85+setup_timer (&e6, c, 0UL); 86... when != c = e7 87-e6.function = c; 88 89// ---------------------------------------------------------------------------- 90 91@match_immediate_function_data_after_init_timer_context 92depends on !patch && (context || org || report)@ 93expression da, e, func; 94position j0, j1, j2; 95@@ 96 97* init_timer@j0 (&e); 98( 99* e@j1.function = func; 100* e@j2.data = da; 101| 102* e@j1.data = da; 103* e@j2.function = func; 104) 105 106@match_function_and_data_after_init_timer_context 107depends on !patch && 108!match_immediate_function_data_after_init_timer_context && 109 (context || org || report)@ 110expression a, b, e1, e2, e3, e4, e5; 111position j0, j1, j2; 112@@ 113 114* init_timer@j0 (&e1); 115... when != a = e2 116 when != b = e3 117( 118* e1@j1.function = a; 119... when != b = e4 120* e1@j2.data = b; 121| 122* e1@j1.data = b; 123... when != a = e5 124* e1@j2.function = a; 125) 126 127@r3_context depends on !patch && 128!match_immediate_function_data_after_init_timer_context && 129!match_function_and_data_after_init_timer_context && 130 (context || org || report)@ 131expression c, e6, e7; 132position r1.p; 133position j0, j1; 134@@ 135 136* init_timer@j0@p (&e6); 137... when != c = e7 138* e6@j1.function = c; 139 140// ---------------------------------------------------------------------------- 141 142@script:python match_immediate_function_data_after_init_timer_org 143depends on org@ 144j0 << match_immediate_function_data_after_init_timer_context.j0; 145j1 << match_immediate_function_data_after_init_timer_context.j1; 146j2 << match_immediate_function_data_after_init_timer_context.j2; 147@@ 148 149msg = "Use setup_timer function." 150coccilib.org.print_todo(j0[0], msg) 151coccilib.org.print_link(j1[0], "") 152coccilib.org.print_link(j2[0], "") 153 154@script:python match_function_and_data_after_init_timer_org depends on org@ 155j0 << match_function_and_data_after_init_timer_context.j0; 156j1 << match_function_and_data_after_init_timer_context.j1; 157j2 << match_function_and_data_after_init_timer_context.j2; 158@@ 159 160msg = "Use setup_timer function." 161coccilib.org.print_todo(j0[0], msg) 162coccilib.org.print_link(j1[0], "") 163coccilib.org.print_link(j2[0], "") 164 165@script:python r3_org depends on org@ 166j0 << r3_context.j0; 167j1 << r3_context.j1; 168@@ 169 170msg = "Use setup_timer function." 171coccilib.org.print_todo(j0[0], msg) 172coccilib.org.print_link(j1[0], "") 173 174// ---------------------------------------------------------------------------- 175 176@script:python match_immediate_function_data_after_init_timer_report 177depends on report@ 178j0 << match_immediate_function_data_after_init_timer_context.j0; 179j1 << match_immediate_function_data_after_init_timer_context.j1; 180@@ 181 182msg = "Use setup_timer function for function on line %s." % (j1[0].line) 183coccilib.report.print_report(j0[0], msg) 184 185@script:python match_function_and_data_after_init_timer_report depends on report@ 186j0 << match_function_and_data_after_init_timer_context.j0; 187j1 << match_function_and_data_after_init_timer_context.j1; 188@@ 189 190msg = "Use setup_timer function for function on line %s." % (j1[0].line) 191coccilib.report.print_report(j0[0], msg) 192 193@script:python r3_report depends on report@ 194j0 << r3_context.j0; 195j1 << r3_context.j1; 196@@ 197 198msg = "Use setup_timer function for function on line %s." % (j1[0].line) 199coccilib.report.print_report(j0[0], msg) 200