3566 lines · 95.2 KB · Perl
RawDownload
				$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 !~ /^;/) {						ERROR("SPACING",						      "space required after that '$op' $at\n" . $hereptr);					} 				# // is a comment				} elsif ($op eq '//') { 				# No spaces for:				#   ->				#   :   when part of a bitfield				} elsif ($op eq '->' || $opv eq ':B') {					if ($ctx =~ /Wx.|.xW/) {						ERROR("SPACING",						      "spaces prohibited around that '$op' $at\n" . $hereptr);					} 				# , must have a space on the right.				} elsif ($op eq ',') {					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {						ERROR("SPACING",						      "space required after that '$op' $at\n" . $hereptr);					} 				# '*' 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 !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {						ERROR("SPACING",						      "space required before that '$op' $at\n" . $hereptr);					}					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {						# A unary '*' may be const 					} elsif ($ctx =~ /.xW/) {						ERROR("SPACING",						      "space prohibited after that '$op' $at\n" . $hereptr);					} 				# 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]/) {						ERROR("SPACING",						      "space required one side of that '$op' $at\n" . $hereptr);					}					if ($ctx =~ /Wx[BE]/ ||					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {						ERROR("SPACING",						      "space prohibited before that '$op' $at\n" . $hereptr);					}					if ($ctx =~ /ExW/) {						ERROR("SPACING",						      "space prohibited after that '$op' $at\n" . $hereptr);					}  				# << 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 ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {						ERROR("SPACING",						      "need consistent spacing around '$op' $at\n" .							$hereptr);					} 				# 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./) {						ERROR("SPACING",						      "space prohibited before that '$op' $at\n" . $hereptr);					} 				# 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;					} 					# Ignore ?:					if (($opv eq ':O' && $ca =~ /\?$/) ||					    ($op eq '?' && $cc =~ /^:/)) {					    	$ok = 1;					} 					if ($ok == 0) {						ERROR("SPACING",						      "spaces required around that '$op' $at\n" . $hereptr);					}				}				$off += length($elements[$n + 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 =~ /do{/) {			ERROR("SPACING",			      "space required before the open brace '{'\n" . $herecurr);		} # closing brace should have a space following it when it has anything# on the line		if ($line =~ /}(?!(?:,|;|\)))\S/) {			ERROR("SPACING",			      "space required after that close brace '}'\n" . $herecurr);		} # check spacing on square brackets		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {			ERROR("SPACING",			      "space prohibited after that open square bracket '['\n" . $herecurr);		}		if ($line =~ /\s\]/) {			ERROR("SPACING",			      "space prohibited before that close square bracket ']'\n" . $herecurr);		} # check spacing on parentheses		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&		    $line !~ /for\s*\(\s+;/) {			ERROR("SPACING",			      "space prohibited after that open parenthesis '('\n" . $herecurr);		}		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&		    $line !~ /for\s*\(.*;\s+\)/ &&		    $line !~ /:\s+\)/) {			ERROR("SPACING",			      "space prohibited before that close parenthesis ')'\n" . $herecurr);		} #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:/)) {			WARN("INDENTED_LABEL",			     "labels should not be indented\n" . $herecurr);		} # Return is not a function.		if (defined($stat) && $stat =~ /^.\s*return(\s*)(\(.*);/s) {			my $spacing = $1;			my $value = $2; 			# Flatten any parentheses			$value =~ s/\(/ \(/g;			$value =~ s/\)/\) /g;			while ($value =~ s/\[[^\[\]]*\]/1/ ||			       $value !~ /(?:$Ident|-?$Constant)\s*					     $Compare\s*					     (?:$Ident|-?$Constant)/x &&			       $value =~ s/\([^\(\)]*\)/1/) {			}#print "value<$value>\n";			if ($value =~ /^\s*(?:$Ident|-?$Constant)\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);			}		}# Return of what appears to be an errno should normally be -'ve		if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {			my $name = $1;			if ($name ne 'EOF' && $name ne 'ERROR') {				WARN("USE_NEGATIVE_ERRNO",				     "return of an errno should typically be -ve (return -$1)\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);		} # Check for illegal assignment in if conditional -- and check for trailing# statements after the conditional.		if ($line =~ /do\s*(?!{)/) {			($stat, $cond, $line_nr_next, $remain_next, $off_next) =				ctx_statement_block($linenr, $realcnt, 0)					if (!defined $stat);			my ($stat_next) = ctx_statement_block($line_nr_next,						$remain_next, $off_next);			$stat_next =~ s/\n./\n /g;			##print "stat<$stat> stat_next<$stat_next>\n"; 			if ($stat_next =~ /^\s*while\b/) {				# If the statement carries leading newlines,				# then count those as offsets.				my ($whitespace) =					($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);				my $offset =					statement_rawlines($whitespace) - 1; 				$suppress_whiletrailers{$line_nr_next +								$offset} = 1;			}		}		if (!defined $suppress_whiletrailers{$linenr} &&		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {			my ($s, $c) = ($stat, $cond); 			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {				ERROR("ASSIGN_IN_IF",				      "do not use assignment in if condition\n" . $herecurr);			} 			# Find out what is on the end of the line after the			# conditional.			substr($s, 0, length($c), '');			$s =~ s/\n.*//g;			$s =~ s/$;//g; 	# Remove any comments			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&			    $c !~ /}\s*while\s*/)			{				# Find out how long the conditional actually is.				my @newlines = ($c =~ /\n/gs);				my $cond_lines = 1 + $#newlines;				my $stat_real = ''; 				$stat_real = raw_line($linenr, $cond_lines)							. "\n" if ($cond_lines);				if (defined($stat_real) && $cond_lines > 1) {					$stat_real = "[...]\n$stat_real";				} 				ERROR("TRAILING_STATEMENTS",				      "trailing statements should be on next line\n" . $herecurr . $stat_real);			}		} # Check for bitwise tests written as boolean		if ($line =~ /			(?:				(?:\[|\(|\&\&|\|\|)				\s*0[xX][0-9]+\s*				(?:\&\&|\|\|)			|				(?:\&\&|\|\|)				\s*0[xX][0-9]+\s*				(?:\&\&|\|\||\)|\])			)/x)		{			WARN("HEXADECIMAL_BOOLEAN_TEST",			     "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);		} # if and else should not have general statements after it		if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {			my $s = $1;			$s =~ s/$;//g; 	# Remove any comments			if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {				ERROR("TRAILING_STATEMENTS",				      "trailing statements should be on next line\n" . $herecurr);			}		}# if should not continue a brace		if ($line =~ /}\s*if\b/) {			ERROR("TRAILING_STATEMENTS",			      "trailing statements should be on next line\n" .				$herecurr);		}# case and default should not have general statements after them		if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&		    $line !~ /\G(?:			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|			\s*return\s+		    )/xg)		{			ERROR("TRAILING_STATEMENTS",			      "trailing statements should be on next line\n" . $herecurr);		} 		# Check for }<nl>else {, these must be at the same		# indent level to be relevant to each other.		if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and						$previndent == $indent) {			ERROR("ELSE_AFTER_BRACE",			      "else should follow close brace '}'\n" . $hereprev);		} 		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and						$previndent == $indent) {			my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); 			# Find out what is on the end of the line after the			# conditional.			substr($s, 0, length($c), '');			$s =~ s/\n.*//g; 			if ($s =~ /^\s*;/) {				ERROR("WHILE_AFTER_BRACE",				      "while should follow close brace '}'\n" . $hereprev);			}		} #studly caps, commented out until figure out how to distinguish between use of existing and adding new#		if (($line=~/[\w_][a-z\d]+[A-Z]/) and !($line=~/print/)) {#		    print "No studly caps, use _\n";#		    print "$herecurr";#		    $clean = 0;#		} #no spaces allowed after \ in define		if ($line=~/\#\s*define.*\\\s$/) {			WARN("WHITESPACE_AFTER_LINE_CONTINUATION",			     "Whitepspace after \\ makes next lines useless\n" . $herecurr);		} #warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {			my $file = "$1.h";			my $checkfile = "include/linux/$file";			if (-f "$root/$checkfile" &&			    $realfile ne $checkfile &&			    $1 !~ /$allowed_asm_includes/)			{				if ($realfile =~ m{^arch/}) {					CHK("ARCH_INCLUDE_LINUX",					    "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);				} else {					WARN("INCLUDE_LINUX",					     "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);				}			}		} # multi-statement macros should be enclosed in a do while loop, grab the# first statement and ensure its the whole macro if its not enclosed# in a known good container		if ($realfile !~ m@/vmlinux.lds.h$@ &&		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {			my $ln = $linenr;			my $cnt = $realcnt;			my ($off, $dstat, $dcond, $rest);			my $ctx = '';			($dstat, $dcond, $ln, $cnt, $off) =				ctx_statement_block($linenr, $realcnt, 0);			$ctx = $dstat;			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n"; 			$dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;			$dstat =~ s/$;//g;			$dstat =~ s/\\\n.//g;			$dstat =~ s/^\s*//s;			$dstat =~ s/\s*$//s; 			# Flatten any parentheses and braces			while ($dstat =~ s/\([^\(\)]*\)/1/ ||			       $dstat =~ s/\{[^\{\}]*\}/1/ ||			       $dstat =~ s/\[[^\[\]]*\]/1/)			{			} 			# Flatten any obvious string concatentation.			while ($dstat =~ s/("X*")\s*$Ident/$1/ ||			       $dstat =~ s/$Ident\s*("X*")/$1/)			{			} 			my $exceptions = qr{				$Declare|				module_param_named|				MODULE_PARAM_DESC|				DECLARE_PER_CPU|				DEFINE_PER_CPU|				__typeof__\(|				union|				struct|				\.$Ident\s*=\s*|				^\"|\"$			}x;			#print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";			if ($dstat ne '' &&			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();			    $dstat !~ /^[!~-]?(?:$Ident|$Constant)$/ &&		# 10 // foo() // !foo // ~foo // -foo			    $dstat !~ /^'X'$/ &&					# character constants			    $dstat !~ /$exceptions/ &&			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()			    $dstat !~ /^do\s*{/ &&					# do {...			    $dstat !~ /^\({/)						# ({...			{				$ctx =~ s/\n*$//;				my $herectx = $here . "\n";				my $cnt = statement_rawlines($ctx); 				for (my $n = 0; $n < $cnt; $n++) {					$herectx .= raw_line($linenr, $n) . "\n";				} 				if ($dstat =~ /;/) {					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",					      "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");				} else {					ERROR("COMPLEX_MACRO",					      "Macros with complex values should be enclosed in parenthesis\n" . "$herectx");				}			}		} # make sure symbols are always wrapped with VMLINUX_SYMBOL() ...# all assignments may have only one of the following with an assignment:#	.#	ALIGN(...)#	VMLINUX_SYMBOL(...)		if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {			WARN("MISSING_VMLINUX_SYMBOL",			     "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);		} # check for redundant bracing round if etc		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {			my ($level, $endln, @chunks) =				ctx_statement_full($linenr, $realcnt, 1);

Lines 2501–3000 of 3566. Previous lines