Messages in this thread | | | Date | Wed, 10 Feb 2016 11:05:11 +0100 (CET) | From | Julia Lawall <> | Subject | Re: [PATCH] Coccinelle: Add api/setup_timer.cocci |
| |
Acked-by: Julia Lawall <julia.lawall@lip6.fr>
On Wed, 10 Feb 2016, Vaishali Thakkar wrote:
> Use the timer API function setup_timer instead of structure field > assignments to initialize a timer. > > Signed-off-by: Vaishali Thakkar <vaishali.thakkar@oracle.com> > --- > scripts/coccinelle/api/setup_timer.cocci | 199 +++++++++++++++++++++++++++++++ > 1 file changed, 199 insertions(+) > create mode 100644 scripts/coccinelle/api/setup_timer.cocci > > diff --git a/scripts/coccinelle/api/setup_timer.cocci b/scripts/coccinelle/api/setup_timer.cocci > new file mode 100644 > index 0000000..8ee0ac3 > --- /dev/null > +++ b/scripts/coccinelle/api/setup_timer.cocci > @@ -0,0 +1,199 @@ > +/// Use setup_timer function instead of initializing timer with the function > +/// and data fields > +// Confidence: High > +// Copyright: (C) 2016 Vaishali Thakkar, Oracle. GPLv2 > +// Options: --no-includes --include-headers > +// Keywords: init_timer, setup_timer > + > +virtual patch > +virtual context > +virtual org > +virtual report > + > +@match_immediate_function_data_after_init_timer > +depends on patch && !context && !org && !report@ > +expression e, func, da; > +@@ > + > +-init_timer (&e); > ++setup_timer (&e, func, da); > + > +( > +-e.function = func; > +-e.data = da; > +| > +-e.data = da; > +-e.function = func; > +) > + > +@match_function_and_data_after_init_timer > +depends on patch && !context && !org && !report@ > +expression e1, e2, e3, e4, e5, a, b; > +@@ > + > +-init_timer (&e1); > ++setup_timer (&e1, a, b); > + > +... when != a = e2 > + when != b = e3 > +( > +-e1.function = a; > +... when != b = e4 > +-e1.data = b; > +| > +-e1.data = b; > +... when != a = e5 > +-e1.function = a; > +) > + > +@r1 exists@ > +identifier f; > +position p; > +@@ > + > +f(...) { ... when any > + init_timer@p(...) > + ... when any > +} > + > +@r2 exists@ > +identifier g != r1.f; > +struct timer_list t; > +expression e8; > +@@ > + > +g(...) { ... when any > + t.data = e8 > + ... when any > +} > + > +// It is dangerous to use setup_timer if data field is initialized > +// in another function. > + > +@script:python depends on r2@ > +p << r1.p; > +@@ > + > +cocci.include_match(False) > + > +@r3 depends on patch && !context && !org && !report@ > +expression e6, e7, c; > +position r1.p; > +@@ > + > +-init_timer@p (&e6); > ++setup_timer (&e6, c, 0UL); > +... when != c = e7 > +-e6.function = c; > + > +// ---------------------------------------------------------------------------- > + > +@match_immediate_function_data_after_init_timer_context > +depends on !patch && (context || org || report)@ > +expression da, e, func; > +position j0, j1, j2; > +@@ > + > +* init_timer@j0 (&e); > +( > +* e@j1.function = func; > +* e@j2.data = da; > +| > +* e@j1.data = da; > +* e@j2.function = func; > +) > + > +@match_function_and_data_after_init_timer_context > +depends on !patch && > +!match_immediate_function_data_after_init_timer_context && > +(context || org || report)@ > +expression a, b, e1, e2, e3, e4, e5; > +position j0, j1, j2; > +@@ > + > +* init_timer@j0 (&e1); > +... when != a = e2 > + when != b = e3 > +( > +* e1@j1.function = a; > +... when != b = e4 > +* e1@j2.data = b; > +| > +* e1@j1.data = b; > +... when != a = e5 > +* e1@j2.function = a; > +) > + > +@r3_context depends on !patch && > +!match_immediate_function_data_after_init_timer_context && > +!match_function_and_data_after_init_timer_context && > +(context || org || report)@ > +expression c, e6, e7; > +position r1.p; > +position j0, j1; > +@@ > + > +* init_timer@j0@p (&e6); > +... when != c = e7 > +* e6@j1.function = c; > + > +// ---------------------------------------------------------------------------- > + > +@script:python match_immediate_function_data_after_init_timer_org > +depends on org@ > +j0 << match_immediate_function_data_after_init_timer_context.j0; > +j1 << match_immediate_function_data_after_init_timer_context.j1; > +j2 << match_immediate_function_data_after_init_timer_context.j2; > +@@ > + > +msg = "Use setup_timer function." > +coccilib.org.print_todo(j0[0], msg) > +coccilib.org.print_link(j1[0], "") > +coccilib.org.print_link(j2[0], "") > + > +@script:python match_function_and_data_after_init_timer_org depends on org@ > +j0 << match_function_and_data_after_init_timer_context.j0; > +j1 << match_function_and_data_after_init_timer_context.j1; > +j2 << match_function_and_data_after_init_timer_context.j2; > +@@ > + > +msg = "Use setup_timer function." > +coccilib.org.print_todo(j0[0], msg) > +coccilib.org.print_link(j1[0], "") > +coccilib.org.print_link(j2[0], "") > + > +@script:python r3_org depends on org@ > +j0 << r3_context.j0; > +j1 << r3_context.j1; > +@@ > + > +msg = "Use setup_timer function." > +coccilib.org.print_todo(j0[0], msg) > +coccilib.org.print_link(j1[0], "") > + > +// ---------------------------------------------------------------------------- > + > +@script:python match_immediate_function_data_after_init_timer_report > +depends on report@ > +j0 << match_immediate_function_data_after_init_timer_context.j0; > +j1 << match_immediate_function_data_after_init_timer_context.j1; > +@@ > + > +msg = "Use setup_timer function for function on line %s." % (j1[0].line) > +coccilib.report.print_report(j0[0], msg) > + > +@script:python match_function_and_data_after_init_timer_report depends on report@ > +j0 << match_function_and_data_after_init_timer_context.j0; > +j1 << match_function_and_data_after_init_timer_context.j1; > +@@ > + > +msg = "Use setup_timer function for function on line %s." % (j1[0].line) > +coccilib.report.print_report(j0[0], msg) > + > +@script:python r3_report depends on report@ > +j0 << r3_context.j0; > +j1 << r3_context.j1; > +@@ > + > +msg = "Use setup_timer function for function on line %s." % (j1[0].line) > +coccilib.report.print_report(j0[0], msg) > -- > 2.1.4 > >
| |