From: Andy Whitcroft <apw@canonical.com>
To: Joe Perches <joe@perches.com>
Cc: Dave Jones <davej@redhat.com>,
Linux Kernel <linux-kernel@vger.kernel.org>
Subject: Re: add memset checks to checkpatch.pl
Date: Thu, 2 Sep 2010 11:52:29 +0100 [thread overview]
Message-ID: <20100902105229.GI2406@shadowen.org> (raw)
In-Reply-To: <1282174721.6724.202.camel@Joe-Laptop>
On Wed, Aug 18, 2010 at 04:38:41PM -0700, Joe Perches wrote:
> On Wed, 2010-08-18 at 18:17 -0400, Dave Jones wrote:
> > On Wed, Aug 18, 2010 at 02:57:59PM -0700, Joe Perches wrote:
> > > > I'm all for improving my shoddy perl where possible, but this doesn't seem to actually
> > > > catch any of the test cases I wrote. (it's also missing a } )
> > > I intend never to be a perl monk.
> > > I notice the missing { before the elsif after I sent it.
> > > Oh well.
> > > I just typed it in the emailer, so it's not tested at all.
> > > Also it's missing a $ after 1 in the second $memset_size test.
> > still didn't catch anything for me.
> > > What are your test cases anyway?
> >
> > memset(foo, 0, 10);
> > memset(foo, 10, 0);
> > memset(foo, 1, 10);
> > memset(foo, 10, 1);
> >
> > > Likely $Lval isn't matching things like
> > > sizeof(*foo) so this isn't checked:
> > >
> > > memset(foo, bar, sizeof(*foo));
> >
> > I chose to just ignore any non integer arguments to keep things simple.
>
> This seems to work.
>
> I think $FuncArg is not great though.
>
> Because $FuncArg uses $match_balanced_parens, the
> match list args are unexpected.
>
> $2, $4, and $6 are the args of any memset argument
> that uses style func(args)
>
> ie: memset(addr(foo), val(bar), sizeof(*foo))
>
> Andy, what do you think?
Generally we deal with these by simplifying the contained bracketed
sections. This allows simpler textual comparisons on the result.
Something like the patch below. Perhaps you could test the version at
the URL below and see if that does what you expected:
http://www.kernel.org/pub/linux/kernel/people/apw/checkpatch/checkpatch.pl-testing
-apw
commit 46e399ce79f2e76578a3208e901eb50727c1e95e
Author: Andy Whitcroft <apw@canonical.com>
Date: Thu Sep 2 11:47:41 2010 +0100
checkpatch: check for common memset parameter issues
Add checks for 0 and 1 used as lengths. Generally these indicate badly
ordered parameters.
Based on patches by Dave Jones <davej@redhat.com> and
Joe Perches <joe@perches.com>.
Signed-off-by: Andy Whitcroft <apw@canonical.com>
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 5c60e16..6da84cc 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -2719,6 +2719,26 @@ sub process {
WARN("sizeof(& should be avoided\n" . $herecurr);
}
+# Check for misused memsets
+ if (defined $stat && $stat =~ /\bmemset\s*\((.*)\)/s) {
+ my $args = $1;
+
+ # 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 uses second argument as constant byte value, not third.\n" . $herecurr);
+ } elsif ($ms_size =~ /^(0x|)1$/i) {
+ WARN("single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . $herecurr);
+ }
+ }
+
# check for new externs in .c files.
if ($realfile =~ /\.c$/ && defined $stat &&
$stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
next prev parent reply other threads:[~2010-09-02 10:52 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-18 20:40 add memset checks to checkpatch.pl Dave Jones
2010-08-18 21:32 ` Joe Perches
2010-08-18 21:48 ` Dave Jones
2010-08-18 21:57 ` Joe Perches
2010-08-18 22:17 ` Dave Jones
2010-08-18 23:38 ` Joe Perches
2010-09-02 10:52 ` Andy Whitcroft [this message]
2010-09-02 13:17 ` Ævar Arnfjörð Bjarmason
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=20100902105229.GI2406@shadowen.org \
--to=apw@canonical.com \
--cc=davej@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox