All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeremy Sowden <jeremy@azazel.net>
To: Joe Perches <joe@perches.com>
Cc: linux-kernel@vger.kernel.org, apw@canonical.com
Subject: Re: [PATCH] checkpatch: fix for stripping brackets from macros.
Date: Mon, 18 Dec 2017 16:23:52 +0000	[thread overview]
Message-ID: <20171218162352.GA838@azazel.net> (raw)
In-Reply-To: <1513609970.31581.62.camel@perches.com>

[-- Attachment #1: Type: text/plain, Size: 2121 bytes --]

On 2017-12-18, at 07:12:50 -0800, Joe Perches wrote:
> On Mon, 2017-12-18 at 14:17 +0000, Jeremy Sowden wrote:
> > When checking macros, checkpatch.pl strips parentheses, square
> > brackets and braces.  However, the search-and-replace expression was
> > not correct, and instead of replacing the brackets and their
> > contents with just the contents, it was replacing them with literal
> > 1's.
>
> Jeremy:
>
> What is the effect on the rest of the block that uses this substituted
> $dstat?  Why should this be done?

I had some macros which defined compound literals, e.g.:

  #define TEST (struct test) { .member = 1 }

and checkpatch.pl complained that macros with complex values should be
enclosed in parentheses.  When I had a look at the checkpatch.pl source
I noticed that there were a number of exceptions against which $dstat
was matched and that they included the struct and union keywords.  These
matches failed, however, 'cause the compound-literal had been turned
into:

 1 1

which didn't seem to make much sense.  Given that the while-loop was
immediately followed by another that did the more obvious thing:

  # Flatten any parentheses and braces
  while ($dstat =~ s/\([^\(\)]*\)/1/ ||
         $dstat =~ s/\{[^\{\}]*\}/1/ ||
         $dstat =~ s/.\[[^\[\]]*\]/1/)
  {
  }

  # Flatten any obvious string concatentation.
  while ($dstat =~ s/($String)\s*$Ident/$1/ ||
         $dstat =~ s/$Ident\s*($String)/$1/)
  {
  }

it occurred to me that this might be a bug.

> Andy:
>
> I believe this is intentional as it simplifies
> the macro analysis and has no other effect on the
> rest of the block.  Correct?
>
> > diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
> []
> > @@ -4874,9 +4874,9 @@ sub process {
> >  			$dstat =~ s/\s*$//s;
> >
> >  			# Flatten any parentheses and braces
> > -			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
> > -			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
> > -			       $dstat =~ s/.\[[^\[\]]*\]/1/)
> > +			while ($dstat =~ s/\(([^\(\)]*)\)/$1/ ||
> > +			       $dstat =~ s/\{([^\{\}]*)\}/$1/ ||
> > +			       $dstat =~ s/.\[([^\[\]]*)\]/$1/)
> >  			{
> >  			}

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

      reply	other threads:[~2017-12-18 16:23 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-18 14:17 [PATCH] checkpatch: fix for stripping brackets from macros Jeremy Sowden
2017-12-18 15:12 ` Joe Perches
2017-12-18 16:23   ` Jeremy Sowden [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171218162352.GA838@azazel.net \
    --to=jeremy@azazel.net \
    --cc=apw@canonical.com \
    --cc=joe@perches.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.