7976 lines · 239.6 KB · Perl
RawDownload
				} 				# Ignore:				#  1) blank lines, they should be at 0,				#  2) preprocessor lines, and				#  3) labels.				if ($continuation ||				    $s =~ /^\s*?\n/ ||				    $s =~ /^\s*#\s*?/ ||				    $s =~ /^\s*$Ident\s*:/) {					$continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;					if ($s =~ s/^.*?\n//) {						$cond_lines++;					}				}			} 			my (undef, $sindent) = line_stats("+" . $s);			my $stat_real = raw_line($linenr, $cond_lines); 			# Check if either of these lines are modified, else			# this is not this patch's fault.			if (!defined($stat_real) ||			    $stat !~ /^\+/ && $stat_real !~ /^\+/) {				$check = 0;			}			if (defined($stat_real) && $cond_lines > 1) {				$stat_real = "[...]\n$stat_real";			} 			#print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s> cond_lines<$cond_lines> stat_real<$stat_real> stat<$stat>\n"; 			if ($check && $s ne '' &&			    (($sindent % $tabsize) != 0 ||			     ($sindent < $indent) ||			     ($sindent == $indent &&			      ($s !~ /^\s*(?:\}|\{|else\b)/)) ||			     ($sindent > $indent + $tabsize))) {				WARN("SUSPECT_CODE_INDENT",				     "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");			}		} 		# Track the 'values' across context and added lines.		my $opline = $line; $opline =~ s/^./ /;		my ($curr_values, $curr_vars) =				annotate_values($opline . "\n", $prev_values);		$curr_values = $prev_values . $curr_values;		if ($dbg_values) {			my $outline = $opline; $outline =~ s/\t/ /g;			print "$linenr > .$outline\n";			print "$linenr > $curr_values\n";			print "$linenr >  $curr_vars\n";		}		$prev_values = substr($curr_values, -1); #ignore lines not being added		next if ($line =~ /^[^\+]/); # check for self assignments used to avoid compiler warnings# e.g.:	int foo = foo, *bar = NULL;#	struct foo bar = *(&(bar));		if ($line =~ /^\+\s*(?:$Declare)?([A-Za-z_][A-Za-z\d_]*)\s*=/) {			my $var = $1;			if ($line =~ /^\+\s*(?:$Declare)?$var\s*=\s*(?:$var|\*\s*\(?\s*&\s*\(?\s*$var\s*\)?\s*\)?)\s*[;,]/) {				WARN("SELF_ASSIGNMENT",				     "Do not use self-assignments to avoid compiler warnings\n" . $herecurr);			}		} # check for dereferences that span multiple lines		if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ &&		    $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) {			$prevline =~ /($Lval\s*(?:\.|->))\s*$/;			my $ref = $1;			$line =~ /^.\s*($Lval)/;			$ref .= $1;			$ref =~ s/\s//g;			WARN("MULTILINE_DEREFERENCE",			     "Avoid multiple line dereference - prefer '$ref'\n" . $hereprev);		} # check for declarations of signed or unsigned without int		while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {			my $type = $1;			my $var = $2;			$var = "" if (!defined $var);			if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) {				my $sign = $1;				my $pointer = $2; 				$pointer = "" if (!defined $pointer); 				if (WARN("UNSPECIFIED_INT",					 "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'\n" . $herecurr) &&				    $fix) {					my $decl = trim($sign) . " int ";					my $comp_pointer = $pointer;					$comp_pointer =~ s/\s//g;					$decl .= $comp_pointer;					$decl = rtrim($decl) if ($var eq "");					$fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@;				}			}		} # TEST: allow direct testing of the type matcher.		if ($dbg_type) {			if ($line =~ /^.\s*$Declare\s*$/) {				ERROR("TEST_TYPE",				      "TEST: is type\n" . $herecurr);			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {				ERROR("TEST_NOT_TYPE",				      "TEST: is not type ($1 is)\n". $herecurr);			}			next;		}# TEST: allow direct testing of the attribute matcher.		if ($dbg_attr) {			if ($line =~ /^.\s*$Modifier\s*$/) {				ERROR("TEST_ATTR",				      "TEST: is attr\n" . $herecurr);			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {				ERROR("TEST_NOT_ATTR",				      "TEST: is not attr ($1 is)\n". $herecurr);			}			next;		} # check for initialisation to aggregates open brace on the next line		if ($line =~ /^.\s*{/ &&		    $prevline =~ /(?:^|[^=])=\s*$/) {			if (ERROR("OPEN_BRACE",				  "that open brace { should be on the previous line\n" . $hereprev) &&			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {				fix_delete_line($fixlinenr - 1, $prevrawline);				fix_delete_line($fixlinenr, $rawline);				my $fixedline = $prevrawline;				$fixedline =~ s/\s*=\s*$/ = {/;				fix_insert_line($fixlinenr, $fixedline);				$fixedline = $line;				$fixedline =~ s/^(.\s*)\{\s*/$1/;				fix_insert_line($fixlinenr, $fixedline);			}		} ## Checks which are anchored on the added line.# # check for malformed paths in #include statements (uses RAW line)		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {			my $path = $1;			if ($path =~ m{//}) {				ERROR("MALFORMED_INCLUDE",				      "malformed #include filename\n" . $herecurr);			}			if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {				ERROR("UAPI_INCLUDE",				      "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);			}		} # no C99 // comments		if ($line =~ m{//}) {			if (ERROR("C99_COMMENTS",				  "do not use C99 // comments\n" . $herecurr) &&			    $fix) {				my $line = $fixed[$fixlinenr];				if ($line =~ /\/\/(.*)$/) {					my $comment = trim($1);					$fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;				}			}		}		# Remove C99 comments.		$line =~ s@//.*@@;		$opline =~ s@//.*@@; # EXPORT_SYMBOL should immediately follow the thing it is exporting, consider# the whole statement.#print "APW <$lines[$realline_next - 1]>\n";		if (defined $realline_next &&		    exists $lines[$realline_next - 1] &&		    !defined $suppress_export{$realline_next} &&		    ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/)) {			# Handle definitions which produce identifiers with			# a prefix:			#   XXX(foo);			#   EXPORT_SYMBOL(something_foo);			my $name = $1;			$name =~ s/^\s*($Ident).*/$1/;			if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&			    $name =~ /^${Ident}_$2/) {#print "FOO C name<$name>\n";				$suppress_export{$realline_next} = 1; 			} elsif ($stat !~ /(?:				\n.}\s*$|				^.DEFINE_$Ident\(\Q$name\E\)|				^.DECLARE_$Ident\(\Q$name\E\)|				^.LIST_HEAD\(\Q$name\E\)|				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()			    )/x) {#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";				$suppress_export{$realline_next} = 2;			} else {				$suppress_export{$realline_next} = 1;			}		}		if (!defined $suppress_export{$linenr} &&		    $prevline =~ /^.\s*$/ &&		    ($line =~ /EXPORT_SYMBOL.*\((.*)\)/)) {#print "FOO B <$lines[$linenr - 1]>\n";			$suppress_export{$linenr} = 2;		}		if (defined $suppress_export{$linenr} &&		    $suppress_export{$linenr} == 2) {			WARN("EXPORT_SYMBOL",			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);		} # check for global initialisers.		if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/ &&		    !exclude_global_initialisers($realfile)) {			if (ERROR("GLOBAL_INITIALISERS",				  "do not initialise globals to $1\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/;			}		}# check for static initialisers.		if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) {			if (ERROR("INITIALISED_STATIC",				  "do not initialise statics to $1\n" .				      $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/;			}		} # check for misordered declarations of char/short/int/long with signed/unsigned		while ($sline =~ m{(\b$TypeMisordered\b)}g) {			my $tmp = trim($1);			WARN("MISORDERED_TYPE",			     "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order\n" . $herecurr);		} # check for unnecessary <signed> int declarations of short/long/long long		while ($sline =~ m{\b($TypeMisordered(\s*\*)*|$C90_int_types)\b}g) {			my $type = trim($1);			next if ($type !~ /\bint\b/);			next if ($type !~ /\b(?:short|long\s+long|long)\b/);			my $new_type = $type;			$new_type =~ s/\b\s*int\s*\b/ /;			$new_type =~ s/\b\s*(?:un)?signed\b\s*/ /;			$new_type =~ s/^const\s+//;			$new_type = "unsigned $new_type" if ($type =~ /\bunsigned\b/);			$new_type = "const $new_type" if ($type =~ /^const\b/);			$new_type =~ s/\s+/ /g;			$new_type = trim($new_type);			if (WARN("UNNECESSARY_INT",				 "Prefer '$new_type' over '$type' as the int is unnecessary\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~ s/\b\Q$type\E\b/$new_type/;			}		} # check for static const char * arrays.		if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {			WARN("STATIC_CONST_CHAR_ARRAY",			     "static const char * array should probably be static const char * const\n" .				$herecurr);		} # check for initialized const char arrays that should be static const		if ($line =~ /^\+\s*const\s+(char|unsigned\s+char|_*u8|(?:[us]_)?int8_t)\s+\w+\s*\[\s*(?:\w+\s*)?\]\s*=\s*"/) {			if (WARN("STATIC_CONST_CHAR_ARRAY",				 "const array should probably be static const\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~ s/(^.\s*)const\b/${1}static const/;			}		} # check for static char foo[] = "bar" declarations.		if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {			WARN("STATIC_CONST_CHAR_ARRAY",			     "static char array declaration should probably be static const char\n" .				$herecurr);		} # check for const <foo> const where <foo> is not a pointer or array type		if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) {			my $found = $1;			if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) {				WARN("CONST_CONST",				     "'const $found const *' should probably be 'const $found * const'\n" . $herecurr);			} elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) {				WARN("CONST_CONST",				     "'const $found const' should probably be 'const $found'\n" . $herecurr);			}		} # check for const static or static <non ptr type> const declarations# prefer 'static const <foo>' over 'const static <foo>' and 'static <foo> const'		if ($sline =~ /^\+\s*const\s+static\s+($Type)\b/ ||		    $sline =~ /^\+\s*static\s+($BasicType)\s+const\b/) {			if (WARN("STATIC_CONST",				 "Move const after static - use 'static const $1'\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~ s/\bconst\s+static\b/static const/;				$fixed[$fixlinenr] =~ s/\bstatic\s+($BasicType)\s+const\b/static const $1/;			}		} # check for non-global char *foo[] = {"bar", ...} declarations.		if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {			WARN("STATIC_CONST_CHAR_ARRAY",			     "char * array declaration might be better as static const\n" .				$herecurr);		} # check for sizeof(foo)/sizeof(foo[0]) that could be ARRAY_SIZE(foo)		if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) {			my $array = $1;			if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) {				my $array_div = $1;				if (WARN("ARRAY_SIZE",					 "Prefer ARRAY_SIZE($array)\n" . $herecurr) &&				    $fix) {					$fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/;				}			}		} # check for function declarations without arguments like "int foo()"		if ($line =~ /(\b$Type\s*$Ident)\s*\(\s*\)/) {			if (ERROR("FUNCTION_WITHOUT_ARGS",				  "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;			}		} # check for new typedefs, only function parameters and sparse annotations# make sense.		if ($line =~ /\btypedef\s/ &&		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&		    $line !~ /\b$typeTypedefs\b/ &&		    $line !~ /\b__bitwise\b/) {			WARN("NEW_TYPEDEFS",			     "do not add new typedefs\n" . $herecurr);		} # * goes on variable not on type		# (char*[ const])		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {			#print "AA<$1>\n";			my ($ident, $from, $to) = ($1, $2, $2); 			# Should start with a space.			$to =~ s/^(\S)/ $1/;			# Should not end with a space.			$to =~ s/\s+$//;			# '*'s should not have spaces between.			while ($to =~ s/\*\s+\*/\*\*/) {			} ##			print "1: from<$from> to<$to> ident<$ident>\n";			if ($from ne $to) {				if (ERROR("POINTER_LOCATION",					  "\"(foo$from)\" should be \"(foo$to)\"\n" .  $herecurr) &&				    $fix) {					my $sub_from = $ident;					my $sub_to = $ident;					$sub_to =~ s/\Q$from\E/$to/;					$fixed[$fixlinenr] =~					    s@\Q$sub_from\E@$sub_to@;				}			}		}		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {			#print "BB<$1>\n";			my ($match, $from, $to, $ident) = ($1, $2, $2, $3); 			# Should start with a space.			$to =~ s/^(\S)/ $1/;			# Should not end with a space.			$to =~ s/\s+$//;			# '*'s should not have spaces between.			while ($to =~ s/\*\s+\*/\*\*/) {			}			# Modifiers should have spaces.			$to =~ s/(\b$Modifier$)/$1 /; ##			print "2: from<$from> to<$to> ident<$ident>\n";			if ($from ne $to && $ident !~ /^$Modifier$/) {				if (ERROR("POINTER_LOCATION",					  "\"foo${from}bar\" should be \"foo${to}bar\"\n" .  $herecurr) &&				    $fix) { 					my $sub_from = $match;					my $sub_to = $match;					$sub_to =~ s/\Q$from\E/$to/;					$fixed[$fixlinenr] =~					    s@\Q$sub_from\E@$sub_to@;				}			}		} # do not use BUG() or variants		if ($line =~ /\b(?!AA_|BUILD_|IDA_|KVM_|RWLOCK_|snd_|SPIN_)(?:[a-zA-Z_]*_)?BUG(?:_ON)?(?:_[A-Z_]+)?\s*\(/) {			my $msg_level = \&WARN;			$msg_level = \&CHK if ($file);			&{$msg_level}("AVOID_BUG",				      "Do not crash the kernel unless it is absolutely unavoidable--use WARN_ON_ONCE() plus recovery code (if feasible) instead of BUG() or variants\n" . $herecurr);		} # avoid LINUX_VERSION_CODE		if ($line =~ /\bLINUX_VERSION_CODE\b/) {			WARN("LINUX_VERSION_CODE",			     "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);		} # check for uses of printk_ratelimit		if ($line =~ /\bprintk_ratelimit\s*\(/) {			WARN("PRINTK_RATELIMITED",			     "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);		} # printk should use KERN_* levels		if ($line =~ /\bprintk\s*\(\s*(?!KERN_[A-Z]+\b)/) {			WARN("PRINTK_WITHOUT_KERN_LEVEL",			     "printk() should include KERN_<LEVEL> facility level\n" . $herecurr);		} # prefer variants of (subsystem|netdev|dev|pr)_<level> to printk(KERN_<LEVEL>		if ($line =~ /\b(printk(_once|_ratelimited)?)\s*\(\s*KERN_([A-Z]+)/) {			my $printk = $1;			my $modifier = $2;			my $orig = $3;			$modifier = "" if (!defined($modifier));			my $level = lc($orig);			$level = "warn" if ($level eq "warning");			my $level2 = $level;			$level2 = "dbg" if ($level eq "debug");			$level .= $modifier;			$level2 .= $modifier;			WARN("PREFER_PR_LEVEL",			     "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(...  to $printk(KERN_$orig ...\n" . $herecurr);		} # prefer dev_<level> to dev_printk(KERN_<LEVEL>		if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {			my $orig = $1;			my $level = lc($orig);			$level = "warn" if ($level eq "warning");			$level = "dbg" if ($level eq "debug");			WARN("PREFER_DEV_LEVEL",			     "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);		} # trace_printk should not be used in production code.		if ($line =~ /\b(trace_printk|trace_puts|ftrace_vprintk)\s*\(/) {			WARN("TRACE_PRINTK",			     "Do not use $1() in production code (this can be ignored if built only with a debug config option)\n" . $herecurr);		} # ENOSYS means "bad syscall nr" and nothing else.  This will have a small# number of false positives, but assembly files are not checked, so at# least the arch entry code will not trigger this warning.		if ($line =~ /\bENOSYS\b/) {			WARN("ENOSYS",			     "ENOSYS means 'invalid syscall nr' and nothing else\n" . $herecurr);		} # ENOTSUPP is not a standard error code and should be avoided in new patches.# Folks usually mean EOPNOTSUPP (also called ENOTSUP), when they type ENOTSUPP.# Similarly to ENOSYS warning a small number of false positives is expected.		if (!$file && $line =~ /\bENOTSUPP\b/) {			if (WARN("ENOTSUPP",				 "ENOTSUPP is not a SUSV4 error code, prefer EOPNOTSUPP\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~ s/\bENOTSUPP\b/EOPNOTSUPP/;			}		} # function brace can't be on same line, except for #defines of do while,# or if closed on same line		if ($perl_version_ok &&		    $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ &&		    $sline !~ /\#\s*define\b.*do\s*\{/ &&		    $sline !~ /}/) {			if (ERROR("OPEN_BRACE",				  "open brace '{' following function definitions go on the next line\n" . $herecurr) &&			    $fix) {				fix_delete_line($fixlinenr, $rawline);				my $fixed_line = $rawline;

Lines 4501–5000 of 7976. Previous lines