2015-08-12 13:51:58

by Kris Borer

[permalink] [raw]
Subject: [RFC] coccinelle: add style check for assignment in if

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 <[email protected]>
---
scripts/coccinelle/style/assignment_in_if.cocci | 82 +++++++++++++++++++++++++
1 file changed, 82 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..d9895e7
--- /dev/null
+++ b/scripts/coccinelle/style/assignment_in_if.cocci
@@ -0,0 +1,82 @@
+// find checkpatch.pl errors of the type:
+// ERROR: do not use assignment in if condition
+//
+// Confidence: Moderate
+
+
+// if ( ret = call() )
+@if1@
+identifier i;
+expression E;
+statement S1, S2;
+@@
+
++ i = E;
+ if (
+- (i = E)
++ i
+ ) S1 else S2
+
+
+// if ( (ret = call()) < 0 )
+@if2@
+identifier i;
+expression E;
+statement S1, S2;
+binary operator b;
+@@
+
++ i = E;
+ if (
+- (i = E)
++ i
+ b ... ) S1 else S2
+
+// if ( ptr->fun && (ret = ptr->fun()) < 0 )
+@if3@
+identifier i, i2;
+expression E1, E2;
+constant c;
+binary operator b;
+@@
+
++ if( E1->i ) {
++ i2 = E2;
++ if (i2 < c) {
+- if( E1->i && ((i2 = E2) b c) ) {
+ ...
+- }
++ }
++ }
+
+// if ( (ret = call()) < 0 && ret != 0 )
+@if4@
+identifier i;
+expression E, E2, E3;
+statement S1, S2;
+binary operator b;
+@@
+
++ i = E;
+ if (
+- (i = E)
++ i
+ b
+ ... && E2 && E3 ) S1 else S2
+
+// if ( (ret = call()) < 0 && ret != 0 && ret != 0 )
+@if5@
+identifier i;
+expression E, E2, E3;
+statement S1, S2;
+binary operator b;
+@@
+
++ i = E;
+ if (
+- (i = E)
++ i
+ b
+ ... && E2 && E3 ) S1 else S2
+
+
--
1.9.1


2015-08-12 14:00:21

by Julia Lawall

[permalink] [raw]
Subject: Re: [RFC] coccinelle: add style check for assignment in if

Thanks for the contribution. Have you checked very carefully that it
doesn't eg pull XXX out of if (E && XXX)? (I don't know if it does or it
doesn't, but it is a common pitfall with this issue).

thanks,
julia

On Wed, 12 Aug 2015, 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 <[email protected]>
> ---
> scripts/coccinelle/style/assignment_in_if.cocci | 82 +++++++++++++++++++++++++
> 1 file changed, 82 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..d9895e7
> --- /dev/null
> +++ b/scripts/coccinelle/style/assignment_in_if.cocci
> @@ -0,0 +1,82 @@
> +// find checkpatch.pl errors of the type:
> +// ERROR: do not use assignment in if condition
> +//
> +// Confidence: Moderate
> +
> +
> +// if ( ret = call() )
> +@if1@
> +identifier i;
> +expression E;
> +statement S1, S2;
> +@@
> +
> ++ i = E;
> + if (
> +- (i = E)
> ++ i
> + ) S1 else S2
> +
> +
> +// if ( (ret = call()) < 0 )
> +@if2@
> +identifier i;
> +expression E;
> +statement S1, S2;
> +binary operator b;
> +@@
> +
> ++ i = E;
> + if (
> +- (i = E)
> ++ i
> + b ... ) S1 else S2
> +
> +// if ( ptr->fun && (ret = ptr->fun()) < 0 )
> +@if3@
> +identifier i, i2;
> +expression E1, E2;
> +constant c;
> +binary operator b;
> +@@
> +
> ++ if( E1->i ) {
> ++ i2 = E2;
> ++ if (i2 < c) {
> +- if( E1->i && ((i2 = E2) b c) ) {
> + ...
> +- }
> ++ }
> ++ }
> +
> +// if ( (ret = call()) < 0 && ret != 0 )
> +@if4@
> +identifier i;
> +expression E, E2, E3;
> +statement S1, S2;
> +binary operator b;
> +@@
> +
> ++ i = E;
> + if (
> +- (i = E)
> ++ i
> + b
> + ... && E2 && E3 ) S1 else S2
> +
> +// if ( (ret = call()) < 0 && ret != 0 && ret != 0 )
> +@if5@
> +identifier i;
> +expression E, E2, E3;
> +statement S1, S2;
> +binary operator b;
> +@@
> +
> ++ i = E;
> + if (
> +- (i = E)
> ++ i
> + b
> + ... && E2 && E3 ) S1 else S2
> +
> +
> --
> 1.9.1
>
>

2015-08-12 14:12:14

by Michal Marek

[permalink] [raw]
Subject: Re: [RFC] coccinelle: add style check for assignment in if

On 2015-08-12 15:51, Kris Borer wrote:
> Add a semantic patch for fixing some cases of checkpatch.pl error:
>
> ERROR: do not use assignment in if condition

There is a gcc warning for this already.

Michal

2015-08-12 15:05:20

by Michal Marek

[permalink] [raw]
Subject: Re: [RFC] coccinelle: add style check for assignment in if

On 2015-08-12 16:53, Kris Borer wrote:
> On Wed, Aug 12, 2015 at 10:12 AM, Michal Marek <[email protected]
> <mailto:[email protected]>> wrote:
>
> On 2015-08-12 15:51, Kris Borer wrote:
> > Add a semantic patch for fixing some cases of checkpatch.pl <http://checkpatch.pl> error:
> >
> > ERROR: do not use assignment in if condition
>
> There is a gcc warning for this already.
>
> Michal
>
>
> ​My intention was not to create another way to uncover problems but
> rather to ​provide a tool for people to use to fix them. Let me know if
> I am misunderstanding the purpose of this subsystem.

OK, so this is fixing a style issue, and not cases of accidental
assignment instead of '==' (for which there is a gcc warning and we
hopefully do not have such errors in the kernel). While I'm probably
ignorant and no not see how one style is better than the other, I see
that some maintainers already applied your patches based on this check.
So I'll merge it once Julia acks it.

P.S.: Please switch of HTML email, otherwise vger.kernel.org won't
accept your messages.

Michal

2015-08-12 15:16:58

by Julia Lawall

[permalink] [raw]
Subject: Re: [RFC] coccinelle: add style check for assignment in if



On Wed, 12 Aug 2015, Michal Marek wrote:

> On 2015-08-12 16:53, Kris Borer wrote:
> > On Wed, Aug 12, 2015 at 10:12 AM, Michal Marek <[email protected]
> > <mailto:[email protected]>> wrote:
> >
> > On 2015-08-12 15:51, Kris Borer wrote:
> > > Add a semantic patch for fixing some cases of checkpatch.pl <http://checkpatch.pl> error:
> > >
> > > ERROR: do not use assignment in if condition
> >
> > There is a gcc warning for this already.
> >
> > Michal
> >
> >
> > ​My intention was not to create another way to uncover problems but
> > rather to ​provide a tool for people to use to fix them. Let me know if
> > I am misunderstanding the purpose of this subsystem.
>
> OK, so this is fixing a style issue, and not cases of accidental
> assignment instead of '==' (for which there is a gcc warning and we
> hopefully do not have such errors in the kernel). While I'm probably
> ignorant and no not see how one style is better than the other, I see
> that some maintainers already applied your patches based on this check.
> So I'll merge it once Julia acks it.

Actually, assignments inside if tests are really annoying for Coccinelle,
because there become two different control flows from the assignment to
the test on the result. So I would be happy to see these go away.

I'll check the semantic patch as soon as possible.

julia