6972 lines · 205.6 KB · Perl
RawDownload
##				print("n: <$n> good: <$good>\n"); 				$off += length($elements[$n]); 				# Pick up the preceding and succeeding characters.				my $ca = substr($opline, 0, $off);				my $cc = '';				if (length($opline) >= ($off + length($elements[$n + 1]))) {					$cc = substr($opline, $off + length($elements[$n + 1]));				}				my $cb = "$ca$;$cc"; 				my $a = '';				$a = 'V' if ($elements[$n] ne '');				$a = 'W' if ($elements[$n] =~ /\s$/);				$a = 'C' if ($elements[$n] =~ /$;$/);				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);				$a = 'O' if ($elements[$n] eq '');				$a = 'E' if ($ca =~ /^\s*$/); 				my $op = $elements[$n + 1]; 				my $c = '';				if (defined $elements[$n + 2]) {					$c = 'V' if ($elements[$n + 2] ne '');					$c = 'W' if ($elements[$n + 2] =~ /^\s/);					$c = 'C' if ($elements[$n + 2] =~ /^$;/);					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);					$c = 'O' if ($elements[$n + 2] eq '');					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);				} else {					$c = 'E';				} 				my $ctx = "${a}x${c}"; 				my $at = "(ctx:$ctx)"; 				my $ptr = substr($blank, 0, $off) . "^";				my $hereptr = "$hereline$ptr\n"; 				# Pull out the value of this operator.				my $op_type = substr($curr_values, $off + 1, 1); 				# Get the full operator variant.				my $opv = $op . substr($curr_vars, $off, 1); 				# Ignore operators passed as parameters.				if ($op_type ne 'V' &&				    $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) { #				# Ignore comments#				} elsif ($op =~ /^$;+$/) { 				# ; should have either the end of line or a space or \ after it				} elsif ($op eq ';') {					if ($ctx !~ /.x[WEBC]/ &&					    $cc !~ /^\\/ && $cc !~ /^;/) {						if (ERROR("SPACING",							  "space required after that '$op' $at\n" . $hereptr)) {							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";							$line_fixed = 1;						}					} 				# // is a comment				} elsif ($op eq '//') { 				#   :   when part of a bitfield				} elsif ($opv eq ':B') {					# skip the bitfield test for now 				# No spaces for:				#   ->				} elsif ($op eq '->') {					if ($ctx =~ /Wx.|.xW/) {						if (ERROR("SPACING",							  "spaces prohibited around that '$op' $at\n" . $hereptr)) {							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);							if (defined $fix_elements[$n + 2]) {								$fix_elements[$n + 2] =~ s/^\s+//;							}							$line_fixed = 1;						}					} 				# , must not have a space before and must have a space on the right.				} elsif ($op eq ',') {					my $rtrim_before = 0;					my $space_after = 0;					if ($ctx =~ /Wx./) {						if (ERROR("SPACING",							  "space prohibited before that '$op' $at\n" . $hereptr)) {							$line_fixed = 1;							$rtrim_before = 1;						}					}					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {						if (ERROR("SPACING",							  "space required after that '$op' $at\n" . $hereptr)) {							$line_fixed = 1;							$last_after = $n;							$space_after = 1;						}					}					if ($rtrim_before || $space_after) {						if ($rtrim_before) {							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);						} else {							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);						}						if ($space_after) {							$good .= " ";						}					} 				# '*' as part of a type definition -- reported already.				} elsif ($opv eq '*_') {					#warn "'*' is part of type\n"; 				# unary operators should have a space before and				# none after.  May be left adjacent to another				# unary operator, or a cast				} elsif ($op eq '!' || $op eq '~' ||					 $opv eq '*U' || $opv eq '-U' ||					 $opv eq '&U' || $opv eq '&&U') {					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {						if (ERROR("SPACING",							  "space required before that '$op' $at\n" . $hereptr)) {							if ($n != $last_after + 2) {								$good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);								$line_fixed = 1;							}						}					}					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {						# A unary '*' may be const 					} elsif ($ctx =~ /.xW/) {						if (ERROR("SPACING",							  "space prohibited after that '$op' $at\n" . $hereptr)) {							$good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);							if (defined $fix_elements[$n + 2]) {								$fix_elements[$n + 2] =~ s/^\s+//;							}							$line_fixed = 1;						}					} 				# unary ++ and unary -- are allowed no space on one side.				} elsif ($op eq '++' or $op eq '--') {					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {						if (ERROR("SPACING",							  "space required one side of that '$op' $at\n" . $hereptr)) {							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";							$line_fixed = 1;						}					}					if ($ctx =~ /Wx[BE]/ ||					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {						if (ERROR("SPACING",							  "space prohibited before that '$op' $at\n" . $hereptr)) {							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);							$line_fixed = 1;						}					}					if ($ctx =~ /ExW/) {						if (ERROR("SPACING",							  "space prohibited after that '$op' $at\n" . $hereptr)) {							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);							if (defined $fix_elements[$n + 2]) {								$fix_elements[$n + 2] =~ s/^\s+//;							}							$line_fixed = 1;						}					} 				# << and >> may either have or not have spaces both sides				} elsif ($op eq '<<' or $op eq '>>' or					 $op eq '&' or $op eq '^' or $op eq '|' or					 $op eq '+' or $op eq '-' or					 $op eq '*' or $op eq '/' or					 $op eq '%')				{					if ($check) {						if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) {							if (CHK("SPACING",								"spaces preferred around that '$op' $at\n" . $hereptr)) {								$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";								$fix_elements[$n + 2] =~ s/^\s+//;								$line_fixed = 1;							}						} elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) {							if (CHK("SPACING",								"space preferred before that '$op' $at\n" . $hereptr)) {								$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]);								$line_fixed = 1;							}						}					} elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {						if (ERROR("SPACING",							  "need consistent spacing around '$op' $at\n" . $hereptr)) {							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";							if (defined $fix_elements[$n + 2]) {								$fix_elements[$n + 2] =~ s/^\s+//;							}							$line_fixed = 1;						}					} 				# A colon needs no spaces before when it is				# terminating a case value or a label.				} elsif ($opv eq ':C' || $opv eq ':L') {					if ($ctx =~ /Wx./) {						if (ERROR("SPACING",							  "space prohibited before that '$op' $at\n" . $hereptr)) {							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);							$line_fixed = 1;						}					} 				# All the others need spaces both sides.				} elsif ($ctx !~ /[EWC]x[CWE]/) {					my $ok = 0; 					# Ignore email addresses <foo@bar>					if (($op eq '<' &&					     $cc =~ /^\S+\@\S+>/) ||					    ($op eq '>' &&					     $ca =~ /<\S+\@\S+$/))					{						$ok = 1;					} 					# for asm volatile statements					# ignore a colon with another					# colon immediately before or after					if (($op eq ':') &&					    ($ca =~ /:$/ || $cc =~ /^:/)) {						$ok = 1;					} 					# messages are ERROR, but ?: are CHK					if ($ok == 0) {						my $msg_level = \&ERROR;						$msg_level = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/); 						if (&{$msg_level}("SPACING",								  "spaces required around that '$op' $at\n" . $hereptr)) {							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";							if (defined $fix_elements[$n + 2]) {								$fix_elements[$n + 2] =~ s/^\s+//;							}							$line_fixed = 1;						}					}				}				$off += length($elements[$n + 1]); ##				print("n: <$n> GOOD: <$good>\n"); 				$fixed_line = $fixed_line . $good;			} 			if (($#elements % 2) == 0) {				$fixed_line = $fixed_line . $fix_elements[$#elements];			} 			if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {				$fixed[$fixlinenr] = $fixed_line;			}  		} # check for whitespace before a non-naked semicolon		if ($line =~ /^\+.*\S\s+;\s*$/) {			if (WARN("SPACING",				 "space prohibited before semicolon\n" . $herecurr) &&			    $fix) {				1 while $fixed[$fixlinenr] =~				    s/^(\+.*\S)\s+;/$1;/;			}		} # check for multiple assignments		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {			CHK("MULTIPLE_ASSIGNMENTS",			    "multiple assignments should be avoided\n" . $herecurr);		} ## # check for multiple declarations, allowing for a function declaration## # continuation.## 		if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&## 		    $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {#### 			# Remove any bracketed sections to ensure we do not## 			# falsly report the parameters of functions.## 			my $ln = $line;## 			while ($ln =~ s/\([^\(\)]*\)//g) {## 			}## 			if ($ln =~ /,/) {## 				WARN("MULTIPLE_DECLARATION",##				     "declaring multiple variables together should be avoided\n" . $herecurr);## 			}## 		} #need space before brace following if, while, etc		if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||		    $line =~ /\b(?:else|do)\{/) {			if (ERROR("SPACING",				  "space required before the open brace '{'\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~ s/^(\+.*(?:do|else|\)))\{/$1 {/;			}		} ## # check for blank lines before declarations##		if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&##		    $prevrawline =~ /^.\s*$/) {##			WARN("SPACING",##			     "No blank lines before declarations\n" . $hereprev);##		}## # closing brace should have a space following it when it has anything# on the line		if ($line =~ /}(?!(?:,|;|\)|\}))\S/) {			if (ERROR("SPACING",				  "space required after that close brace '}'\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~				    s/}((?!(?:,|;|\)))\S)/} $1/;			}		} # check spacing on square brackets		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {			if (ERROR("SPACING",				  "space prohibited after that open square bracket '['\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~				    s/\[\s+/\[/;			}		}		if ($line =~ /\s\]/) {			if (ERROR("SPACING",				  "space prohibited before that close square bracket ']'\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~				    s/\s+\]/\]/;			}		} # check spacing on parentheses		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&		    $line !~ /for\s*\(\s+;/) {			if (ERROR("SPACING",				  "space prohibited after that open parenthesis '('\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~				    s/\(\s+/\(/;			}		}		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&		    $line !~ /for\s*\(.*;\s+\)/ &&		    $line !~ /:\s+\)/) {			if (ERROR("SPACING",				  "space prohibited before that close parenthesis ')'\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~				    s/\s+\)/\)/;			}		} # check unnecessary parentheses around addressof/dereference single $Lvals# ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar 		while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) {			my $var = $1;			if (CHK("UNNECESSARY_PARENTHESES",				"Unnecessary parentheses around $var\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/;			}		} # check for unnecessary parentheses around function pointer uses# ie: (foo->bar)(); should be foo->bar();# but not "if (foo->bar) (" to avoid some false positives		if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) {			my $var = $2;			if (CHK("UNNECESSARY_PARENTHESES",				"Unnecessary parentheses around function pointer $var\n" . $herecurr) &&			    $fix) {				my $var2 = deparenthesize($var);				$var2 =~ s/\s//g;				$fixed[$fixlinenr] =~ s/\Q$var\E/$var2/;			}		} # check for unnecessary parentheses around comparisons in if uses# when !drivers/staging or command-line uses --strict		if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) &&		    $perl_version_ok && defined($stat) &&		    $stat =~ /(^.\s*if\s*($balanced_parens))/) {			my $if_stat = $1;			my $test = substr($2, 1, -1);			my $herectx;			while ($test =~ /(?:^|[^\w\&\!\~])+\s*\(\s*([\&\!\~]?\s*$Lval\s*(?:$Compare\s*$FuncArg)?)\s*\)/g) {				my $match = $1;				# avoid parentheses around potential macro args				next if ($match =~ /^\s*\w+\s*$/);				if (!defined($herectx)) {					$herectx = $here . "\n";					my $cnt = statement_rawlines($if_stat);					for (my $n = 0; $n < $cnt; $n++) {						my $rl = raw_line($linenr, $n);						$herectx .=  $rl . "\n";						last if $rl =~ /^[ \+].*\{/;					}				}				CHK("UNNECESSARY_PARENTHESES",				    "Unnecessary parentheses around '$match'\n" . $herectx);			}		} #goto labels aren't indented, allow a single space however		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {			if (WARN("INDENTED_LABEL",				 "labels should not be indented\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~				    s/^(.)\s+/$1/;			}		} # return is not a function		if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {			my $spacing = $1;			if ($perl_version_ok &&			    $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {				my $value = $1;				$value = deparenthesize($value);				if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {					ERROR("RETURN_PARENTHESES",					      "return is not a function, parentheses are not required\n" . $herecurr);				}			} elsif ($spacing !~ /\s+/) {				ERROR("SPACING",				      "space required before the open parenthesis '('\n" . $herecurr);			}		} # unnecessary return in a void function# at end-of-function, with the previous line a single leading tab, then return;# and the line before that not a goto label target like "out:"		if ($sline =~ /^[ \+]}\s*$/ &&		    $prevline =~ /^\+\treturn\s*;\s*$/ &&		    $linenr >= 3 &&		    $lines[$linenr - 3] =~ /^[ +]/ &&		    $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {			WARN("RETURN_VOID",			     "void function return statements are not generally useful\n" . $hereprev);               } # if statements using unnecessary parentheses - ie: if ((foo == bar))		if ($perl_version_ok &&		    $line =~ /\bif\s*((?:\(\s*){2,})/) {			my $openparens = $1;			my $count = $openparens =~ tr@\(@\(@;			my $msg = "";			if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {				my $comp = $4;	#Not $1 because of $LvalOrFunc				$msg = " - maybe == should be = ?" if ($comp eq "==");				WARN("UNNECESSARY_PARENTHESES",				     "Unnecessary parentheses$msg\n" . $herecurr);			}		} # comparisons with a constant or upper case identifier on the left#	avoid cases like "foo + BAR < baz"#	only fix matches surrounded by parentheses to avoid incorrect#	conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5"		if ($perl_version_ok &&		    $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) {			my $lead = $1;			my $const = $2;			my $comp = $3;			my $to = $4;			my $newcomp = $comp;			if ($lead !~ /(?:$Operators|\.)\s*$/ &&			    $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ &&			    WARN("CONSTANT_COMPARISON",				 "Comparisons should place the constant on the right side of the test\n" . $herecurr) &&			    $fix) {				if ($comp eq "<") {					$newcomp = ">";				} elsif ($comp eq "<=") {

Lines 4501–5000 of 6972. Previous lines