From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753223AbcBWOAx (ORCPT ); Tue, 23 Feb 2016 09:00:53 -0500 Received: from mail2-relais-roc.national.inria.fr ([192.134.164.83]:63154 "EHLO mail2-relais-roc.national.inria.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753166AbcBWOAv (ORCPT ); Tue, 23 Feb 2016 09:00:51 -0500 X-IronPort-AV: E=Sophos;i="5.22,489,1449529200"; d="scan'208";a="204300329" Date: Tue, 23 Feb 2016 15:00:51 +0100 (CET) From: Julia Lawall X-X-Sender: jll@localhost6.localdomain6 To: Kris Borer cc: mmarek@suse.com, Julia.Lawall@lip6.fr, Gilles.Muller@lip6.fr, nicolas.palix@imag.fr, linux-kernel@vger.kernel.org, cocci@systeme.lip6.fr Subject: Re: [PATCH v3] coccinelle: add style check for assignment in if In-Reply-To: <1456163450-28640-1-git-send-email-kborer@gmail.com> Message-ID: References: <1456163450-28640-1-git-send-email-kborer@gmail.com> User-Agent: Alpine 2.02 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 22 Feb 2016, Kris Borer wrote: > Add a semantic patch for fixing some cases of checkpatch.pl error: > > ERROR: do not use assignment in if condition > > Signed-off-by: Kris Borer Acked-by: Julia Lawall > --- > changes since v2 > - added comment warning that changes may not work well with ifdefs > > scripts/coccinelle/style/assignment_in_if.cocci | 132 ++++++++++++++++++++++++ > 1 file changed, 132 insertions(+) > create mode 100644 scripts/coccinelle/style/assignment_in_if.cocci > > diff --git a/scripts/coccinelle/style/assignment_in_if.cocci b/scripts/coccinelle/style/assignment_in_if.cocci > new file mode 100644 > index 0000000..c99cd7e > --- /dev/null > +++ b/scripts/coccinelle/style/assignment_in_if.cocci > @@ -0,0 +1,132 @@ > +/// move assignments out of if conditions > +/// > +//# This script is designed to correct code where assignments exist in if > +//# conditions. It is only capable of handling a subset of such problems. > +//# Ideally it would handle all checkpatch errors of the following type: > +//# ERROR: do not use assignment in if condition > +//# > +//# For example: > +//# if(result = myfun()) > +//# > +//# would become: > +//# result = myfun(); > +//# if(result) > +//# > +//# note: > +//# added braces due to the replacement of an if by multiple statements > +//# may not interact well with ifdefs > +// > +// Confidence: Moderate > +// Copyright: (C) 2015 Kris Borer. GPLv2. > +// URL: http://coccinelle.lip6.fr/ > +// Comments: > +// Options: --no-includes --include-headers > + > +virtual patch > + > + > +// if ( (ret = call()) ) > +// if ( (ret = call()) < 0 ) > +@if1@ > +expression i; > +expression E, E2; > +statement S1, S2; > +binary operator b; > +@@ > + > ++ i = E; > + if ( > +( > +- (i = E) > ++ i > +| > +- (i = E) > ++ i > + b ... > +| > +- (i = E), > + E2 > +) > + ) S1 else S2 > + > + > +// if ( ptr->fun && (ret = ptr->fun()) ) > +@if2@ > +expression i2; > +expression E1, E2; > +@@ > + > ++ if( E1 ) { > ++ i2 = E2; > ++ if (i2) { > +- if( E1 && (i2 = E2) ) { > + ... > +- } > ++ } > ++ } > + > + > +// if ( ptr->fun && (ret = ptr->fun()) < 0 ) > +@if3@ > +expression i2; > +expression E1, E2; > +constant c; > +binary operator b; > +@@ > + > ++ if( E1 ) { > ++ i2 = E2; > ++ if (i2 b c) { > +- if( E1 && ((i2 = E2) b c) ) { > + ... > +- } > ++ } > ++ } > + > + > +// if ( (ret = call()) && ret != -1 ) > +// if ( (ret = call()) < 0 && ret != -1 ) > +@if4@ > +expression i; > +expression E, E2; > +statement S1, S2; > +binary operator b; > +@@ > + > ++ i = E; > + if ( > +( > +- (i = E) > ++ i > +| > + ( > +- (i = E) > ++ i > + b > + ...) > +) > + && E2 ) S1 else S2 > + > + > +// if ( (ret = call()) && ret != -1 && ret != -2 ) > +// if ( (ret = call()) < 0 && ret != -1 && ret != -2 ) > +@if5@ > +expression i; > +expression E, E2, E3; > +statement S1, S2; > +binary operator b; > +@@ > + > ++ i = E; > + if ( > +( > +- (i = E) > ++ i > +| > + ( > +- (i = E) > ++ i > + b > + ...) > +) > + && E2 && E3 ) S1 else S2 > -- > 1.9.1 > >