From: Andy Whitcroft <apw@canonical.com>
To: Joe Perches <joe@perches.com>
Cc: Andrew Morton <akpm@linux-foundation.org>, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] checkpatch: Improve memset and min/max with cast checking
Date: Tue, 29 Nov 2011 21:28:51 +0000 [thread overview]
Message-ID: <20111129212851.GA6165@shadowen.org> (raw)
In-Reply-To: <1322537070.2075.27.camel@Joe-Laptop>
On Mon, Nov 28, 2011 at 07:24:30PM -0800, Joe Perches wrote:
> Improve the checking of arguments to memset and min/max tests.
>
> Move the checking of min/max to statement blocks instead of single line.
> Change $Constant to allow any case type 0x initiator and trailing ul specifier.
> Add $FuncArg type as any function argument with or without a cast.
> Print the whole statement when showing memset or min/max messages.
> Improve the memset with 0 as 3rd argument error message.
>
> There are still weaknesses in the $FuncArg and $Constant code as
> arbitrary parentheses and negative signs are not generically supported.
>
> Signed-off-by: Joe Perches <joe@perches.com>
> ---
>
> On top of Andy's 0/11 series.
>
> scripts/checkpatch.pl | 69 +++++++++++++++++++++++-------------------------
> 1 files changed, 33 insertions(+), 36 deletions(-)
>
> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
> index 59435a9..d72a71e 100755
> --- a/scripts/checkpatch.pl
> +++ b/scripts/checkpatch.pl
> @@ -227,7 +227,7 @@ our $Inline = qr{inline|__always_inline|noinline};
> our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]};
> our $Lval = qr{$Ident(?:$Member)*};
>
> -our $Constant = qr{(?:[0-9]+|0x[0-9a-fA-F]+)[UL]*};
> +our $Constant = qr{(?i:[0-9]+|0x[0-9a-f]+)[ul]*};
This should actually be as below so that the UL is included in the case
insensitive match:
our $Constant = qr{(?i:(?:[0-9]+|0x[0-9a-f]+)[ul]*)};
Other than that it looks good passing my testing.
Acked-by: Andy Whitcroft <apw@canonical.com>
Applied to my next branch.
> our $Assignment = qr{(?:\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=)};
> our $Compare = qr{<=|>=|==|!=|<|>};
> our $Operators = qr{
> @@ -334,6 +334,7 @@ our $match_balanced_parentheses = qr/(\((?:[^\(\)]+|(-1))*\))/;
>
> our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
> our $LvalOrFunc = qr{($Lval)\s*($match_balanced_parentheses{0,1})\s*};
> +our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};
>
> sub deparenthesize {
> my ($string) = @_;
> @@ -2633,28 +2634,6 @@ sub process {
> }
> }
>
> -# typecasts on min/max could be min_t/max_t
> - if ($line =~ /^\+(?:.*?)\b(min|max)\s*\($Typecast{0,1}($LvalOrFunc)\s*,\s*$Typecast{0,1}($LvalOrFunc)\s*\)/) {
> - if (defined $2 || defined $8) {
> - my $call = $1;
> - my $cast1 = deparenthesize($2);
> - my $arg1 = $3;
> - my $cast2 = deparenthesize($8);
> - my $arg2 = $9;
> - my $cast;
> -
> - if ($cast1 ne "" && $cast2 ne "") {
> - $cast = "$cast1 or $cast2";
> - } elsif ($cast1 ne "") {
> - $cast = $cast1;
> - } else {
> - $cast = $cast2;
> - }
> - WARN("MINMAX",
> - "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . $herecurr);
> - }
> - }
> -
> # Need a space before open parenthesis after if, while etc
> if ($line=~/\b(if|while|for|switch)\(/) {
> ERROR("SPACING", "space required before the open parenthesis '('\n" . $herecurr);
> @@ -3148,24 +3127,42 @@ sub process {
> }
>
> # Check for misused memsets
> - if (defined $stat && $stat =~ /\bmemset\s*\((.*)\)/s) {
> - my $args = $1;
> + if (defined $stat &&
> + $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {
> +
> + my $ms_addr = $2;
> + my $ms_val = $8;
> + my $ms_size = $14;
>
> - # Flatten any parentheses and braces
> - while ($args =~ s/\([^\(\)]*\)/10/s ||
> - $args =~ s/\{[^\{\}]*\}/10/s ||
> - $args =~ s/\[[^\[\]]*\]/10/s)
> - {
> - }
> - # Extract the simplified arguments.
> - my ($ms_addr, $ms_val, $ms_size) =
> - split(/\s*,\s*/, $args);
> if ($ms_size =~ /^(0x|)0$/i) {
> ERROR("MEMSET",
> - "memset size is 3rd argument, not the second.\n" . $herecurr);
> + "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
> } elsif ($ms_size =~ /^(0x|)1$/i) {
> WARN("MEMSET",
> - "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . $herecurr);
> + "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
> + }
> + }
> +
> +# typecasts on min/max could be min_t/max_t
> + if (defined $stat &&
> + $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
> + if (defined $2 || defined $8) {
> + my $call = $1;
> + my $cast1 = deparenthesize($2);
> + my $arg1 = $3;
> + my $cast2 = deparenthesize($8);
> + my $arg2 = $9;
> + my $cast;
> +
> + if ($cast1 ne "" && $cast2 ne "") {
> + $cast = "$cast1 or $cast2";
> + } elsif ($cast1 ne "") {
> + $cast = $cast1;
> + } else {
> + $cast = $cast2;
> + }
> + WARN("MINMAX",
> + "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
> }
> }
-apw
next prev parent reply other threads:[~2011-11-29 21:28 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-28 15:42 [PATCH 00/11] checkpatch fixes Andy Whitcroft
2011-11-28 15:42 ` [PATCH 01/11] checkpatch: correctly track the end of preprocessor commands in context Andy Whitcroft
2011-11-28 15:42 ` [PATCH 02/11] checkpatch: check for common memset parameter issues against statments Andy Whitcroft
2011-11-29 0:32 ` Joe Perches
2011-11-29 3:24 ` [PATCH] checkpatch: Improve memset and min/max with cast checking Joe Perches
2011-11-29 21:28 ` Andy Whitcroft [this message]
2011-11-29 21:34 ` Andy Whitcroft
2011-11-28 15:42 ` [PATCH 03/11] checkpatch: ## is not a valid modifier Andy Whitcroft
2011-11-28 15:42 ` [PATCH 04/11] checkpatch: optimise statement scanner when mid-statement Andy Whitcroft
2011-11-28 15:42 ` [PATCH 05/11] checkpatch: only apply kconfig help checks for options which prompt Andy Whitcroft
2011-11-28 15:42 ` [PATCH 06/11] checkpatch: fix EXPORT_SYMBOL handling following a function Andy Whitcroft
2011-11-28 15:42 ` [PATCH 07/11] checkpatch: complex macro should allow the empty do while loop Andy Whitcroft
2011-11-28 15:42 ` [PATCH 08/11] checkpatch: fix 'return is not a function' square bracket handling Andy Whitcroft
2011-11-28 15:42 ` [PATCH 09/11] checkpatch: fix complex macros handling of square brackets Andy Whitcroft
2011-11-28 15:42 ` [PATCH 10/11] checkpatch: ensure cast type is unique in the context parser Andy Whitcroft
2011-11-28 15:42 ` [PATCH 11/11] checkpatch: typeof may have more complex arguments Andy Whitcroft
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=20111129212851.GA6165@shadowen.org \
--to=apw@canonical.com \
--cc=akpm@linux-foundation.org \
--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.