| /// 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) |