checkpatch: check for common memset parameter issues against statments
authorAndy Whitcroft <apw@canonical.com>
Tue, 10 Jan 2012 23:09:57 +0000 (15:09 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 11 Jan 2012 00:30:50 +0000 (16:30 -0800)
Move the memset checks over to work against the statement.  Also add
checks for 0 and 1 used as lengths.  Generally these indicate badly
ordered parameters.

Signed-off-by: Andy Whitcroft <apw@canonical.com>
Cc: Joe Perches <joe@perches.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

scripts/checkpatch.pl

index 06e22ca..8199d59 100755 (executable)
@@ -3120,6 +3120,28 @@ sub process {
                             "Avoid line continuations in quoted strings\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",
+                                     "memset size is 3rd argument, not the second.\n" . $herecurr);
+                       } elsif ($ms_size =~ /^(0x|)1$/i) {
+                               WARN("MEMSET",
+                                    "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)
@@ -3291,12 +3313,6 @@ sub process {
                        WARN("EXPORTED_WORLD_WRITABLE",
                             "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
                }
-
-               # Check for memset with swapped arguments
-               if ($line =~ /memset.*\,(\ |)(0x|)0(\ |0|)\);/) {
-                       ERROR("MEMSET",
-                             "memset size is 3rd argument, not the second.\n" . $herecurr);
-               }
        }
 
        # If we have no input at all, then there is nothing to report on