From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757550AbcBJKCv (ORCPT ); Wed, 10 Feb 2016 05:02:51 -0500 Received: from userp1040.oracle.com ([156.151.31.81]:46759 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752668AbcBJKCs (ORCPT ); Wed, 10 Feb 2016 05:02:48 -0500 From: Vaishali Thakkar To: Julia Lawall , cocci@systeme.lip6.fr Cc: Gilles.Muller@lip6.fr, nicolas.palix@imag.fr, mmarek@suse.com, linux-kernel@vger.kernel.org, Vaishali Thakkar Subject: [PATCH] Coccinelle: Add api/setup_timer.cocci Date: Wed, 10 Feb 2016 15:31:33 +0530 Message-Id: <1455098493-11141-1-git-send-email-vaishali.thakkar@oracle.com> X-Mailer: git-send-email 2.1.4 X-Source-IP: aserv0022.oracle.com [141.146.126.234] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Use the timer API function setup_timer instead of structure field assignments to initialize a timer. Signed-off-by: Vaishali Thakkar --- 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