6972 lines · 205.6 KB · Perl
RawDownload
		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {			my $herevet = "$here\n" . cat_vet($rawline) . "\n";			if (ERROR("TRAILING_WHITESPACE",				  "trailing whitespace\n" . $herevet) &&			    $fix) {				$fixed[$fixlinenr] =~ s/\s+$//;			} 			$rpt_cleaners = 1;		} # Check for FSF mailing addresses.		if ($rawline =~ /\bwrite to the Free/i ||		    $rawline =~ /\b675\s+Mass\s+Ave/i ||		    $rawline =~ /\b59\s+Temple\s+Pl/i ||		    $rawline =~ /\b51\s+Franklin\s+St/i) {			my $herevet = "$here\n" . cat_vet($rawline) . "\n";			my $msg_level = \&ERROR;			$msg_level = \&CHK if ($file);			&{$msg_level}("FSF_MAILING_ADDRESS",				      "Do not include the paragraph about writing to the Free Software Foundation's mailing address from the sample GPL notice. The FSF has changed addresses in the past, and may do so again. Linux already includes a copy of the GPL.\n" . $herevet)		} # check for Kconfig help text having a real description# Only applies when adding the entry originally, after that we do not have# sufficient context to determine whether it is indeed long enough.		if ($realfile =~ /Kconfig/ &&		    # 'choice' is usually the last thing on the line (though		    # Kconfig supports named choices), so use a word boundary		    # (\b) rather than a whitespace character (\s)		    $line =~ /^\+\s*(?:config|menuconfig|choice)\b/) {			my $length = 0;			my $cnt = $realcnt;			my $ln = $linenr + 1;			my $f;			my $is_start = 0;			my $is_end = 0;			for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {				$f = $lines[$ln - 1];				$cnt-- if ($lines[$ln - 1] !~ /^-/);				$is_end = $lines[$ln - 1] =~ /^\+/; 				next if ($f =~ /^-/);				last if (!$file && $f =~ /^\@\@/); 				if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate|prompt)\s*["']/) {					$is_start = 1;				} elsif ($lines[$ln - 1] =~ /^\+\s*(?:---)?help(?:---)?$/) {					$length = -1;				} 				$f =~ s/^.//;				$f =~ s/#.*//;				$f =~ s/^\s+//;				next if ($f =~ /^$/); 				# This only checks context lines in the patch				# and so hopefully shouldn't trigger false				# positives, even though some of these are				# common words in help texts				if ($f =~ /^\s*(?:config|menuconfig|choice|endchoice|						  if|endif|menu|endmenu|source)\b/x) {					$is_end = 1;					last;				}				$length++;			}			if ($is_start && $is_end && $length < $min_conf_desc_length) {				WARN("CONFIG_DESCRIPTION",				     "please write a paragraph that describes the config symbol fully\n" . $herecurr);			}			#print "is_start<$is_start> is_end<$is_end> length<$length>\n";		} # check MAINTAINERS entries		if ($realfile =~ /^MAINTAINERS$/) {# check MAINTAINERS entries for the right form			if ($rawline =~ /^\+[A-Z]:/ &&			    $rawline !~ /^\+[A-Z]:\t\S/) {				if (WARN("MAINTAINERS_STYLE",					 "MAINTAINERS entries use one tab after TYPE:\n" . $herecurr) &&				    $fix) {					$fixed[$fixlinenr] =~ s/^(\+[A-Z]):\s*/$1:\t/;				}			}# check MAINTAINERS entries for the right ordering too			my $preferred_order = 'MRLSWQBCPTFXNK';			if ($rawline =~ /^\+[A-Z]:/ &&			    $prevrawline =~ /^[\+ ][A-Z]:/) {				$rawline =~ /^\+([A-Z]):\s*(.*)/;				my $cur = $1;				my $curval = $2;				$prevrawline =~ /^[\+ ]([A-Z]):\s*(.*)/;				my $prev = $1;				my $prevval = $2;				my $curindex = index($preferred_order, $cur);				my $previndex = index($preferred_order, $prev);				if ($curindex < 0) {					WARN("MAINTAINERS_STYLE",					     "Unknown MAINTAINERS entry type: '$cur'\n" . $herecurr);				} else {					if ($previndex >= 0 && $curindex < $previndex) {						WARN("MAINTAINERS_STYLE",						     "Misordered MAINTAINERS entry - list '$cur:' before '$prev:'\n" . $hereprev);					} elsif ((($prev eq 'F' && $cur eq 'F') ||						  ($prev eq 'X' && $cur eq 'X')) &&						 ($prevval cmp $curval) > 0) {						WARN("MAINTAINERS_STYLE",						     "Misordered MAINTAINERS entry - list file patterns in alphabetic order\n" . $hereprev);					}				}			}		} # discourage the use of boolean for type definition attributes of Kconfig options		if ($realfile =~ /Kconfig/ &&		    $line =~ /^\+\s*\bboolean\b/) {			WARN("CONFIG_TYPE_BOOLEAN",			     "Use of boolean is deprecated, please use bool instead.\n" . $herecurr);		} 		if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&		    ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {			my $flag = $1;			my $replacement = {				'EXTRA_AFLAGS' =>   'asflags-y',				'EXTRA_CFLAGS' =>   'ccflags-y',				'EXTRA_CPPFLAGS' => 'cppflags-y',				'EXTRA_LDFLAGS' =>  'ldflags-y',			}; 			WARN("DEPRECATED_VARIABLE",			     "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});		} # check for DT compatible documentation		if (defined $root &&			(($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||			 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) { 			my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g; 			my $dt_path = $root . "/Documentation/devicetree/bindings/";			my $vp_file = $dt_path . "vendor-prefixes.yaml"; 			foreach my $compat (@compats) {				my $compat2 = $compat;				$compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;				my $compat3 = $compat;				$compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;				`grep -Erq "$compat|$compat2|$compat3" $dt_path`;				if ( $? >> 8 ) {					WARN("UNDOCUMENTED_DT_STRING",					     "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);				} 				next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;				my $vendor = $1;				`grep -Eq "\\"\\^\Q$vendor\E,\\.\\*\\":" $vp_file`;				if ( $? >> 8 ) {					WARN("UNDOCUMENTED_DT_STRING",					     "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);				}			}		} # check for using SPDX license tag at beginning of files		if ($realline == $checklicenseline) {			if ($rawline =~ /^[ \+]\s*\#\!\s*\//) {				$checklicenseline = 2;			} elsif ($rawline =~ /^\+/) {				my $comment = "";				if ($realfile =~ /\.(h|s|S)$/) {					$comment = '/*';				} elsif ($realfile =~ /\.(c|dts|dtsi)$/) {					$comment = '//';				} elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc|yaml)$/) {					$comment = '#';				} elsif ($realfile =~ /\.rst$/) {					$comment = '..';				} # check SPDX comment style for .[chsS] files				if ($realfile =~ /\.[chsS]$/ &&				    $rawline =~ /SPDX-License-Identifier:/ &&				    $rawline !~ m@^\+\s*\Q$comment\E\s*@) {					WARN("SPDX_LICENSE_TAG",					     "Improper SPDX comment style for '$realfile', please use '$comment' instead\n" . $herecurr);				} 				if ($comment !~ /^$/ &&				    $rawline !~ m@^\+\Q$comment\E SPDX-License-Identifier: @) {					WARN("SPDX_LICENSE_TAG",					     "Missing or malformed SPDX-License-Identifier tag in line $checklicenseline\n" . $herecurr);				} elsif ($rawline =~ /(SPDX-License-Identifier: .*)/) {					my $spdx_license = $1;					if (!is_SPDX_License_valid($spdx_license)) {						WARN("SPDX_LICENSE_TAG",						     "'$spdx_license' is not supported in LICENSES/...\n" . $herecurr);					}					if ($realfile =~ m@^Documentation/devicetree/bindings/@ &&					    not $spdx_license =~ /GPL-2\.0.*BSD-2-Clause/) {						my $msg_level = \&WARN;						$msg_level = \&CHK if ($file);						if (&{$msg_level}("SPDX_LICENSE_TAG", 								  "DT binding documents should be licensed (GPL-2.0-only OR BSD-2-Clause)\n" . $herecurr) &&						    $fix) {							$fixed[$fixlinenr] =~ s/SPDX-License-Identifier: .*/SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)/;						}					}				}			}		} # check we are in a valid source file if not then ignore this hunk		next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/); # check for using SPDX-License-Identifier on the wrong line number		if ($realline != $checklicenseline &&		    $rawline =~ /\bSPDX-License-Identifier:/ &&		    substr($line, @-, @+ - @-) eq "$;" x (@+ - @-)) {			WARN("SPDX_LICENSE_TAG",			     "Misplaced SPDX-License-Identifier tag - use line $checklicenseline instead\n" . $herecurr);		} # line length limit (with some exclusions)## There are a few types of lines that may extend beyond $max_line_length:#	logging functions like pr_info that end in a string#	lines with a single string#	#defines that are a single string#	lines with an RFC3986 like URL## There are 3 different line length message types:# LONG_LINE_COMMENT	a comment starts before but extends beyond $max_line_length# LONG_LINE_STRING	a string starts before but extends beyond $max_line_length# LONG_LINE		all other lines longer than $max_line_length## if LONG_LINE is ignored, the other 2 types are also ignored# 		if ($line =~ /^\+/ && $length > $max_line_length) {			my $msg_type = "LONG_LINE"; 			# Check the allowed long line types first 			# logging functions that end in a string that starts			# before $max_line_length			if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ &&			    length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {				$msg_type = ""; 			# lines with only strings (w/ possible termination)			# #defines with only strings			} elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ ||				 $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) {				$msg_type = ""; 			# More special cases			} elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/ ||				 $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) {				$msg_type = ""; 			# URL ($rawline is used in case the URL is in a comment)			} elsif ($rawline =~ /^\+.*\b[a-z][\w\.\+\-]*:\/\/\S+/i) {				$msg_type = ""; 			# Otherwise set the alternate message types 			# a comment starts before $max_line_length			} elsif ($line =~ /($;[\s$;]*)$/ &&				 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {				$msg_type = "LONG_LINE_COMMENT" 			# a quoted string starts before $max_line_length			} elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ &&				 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {				$msg_type = "LONG_LINE_STRING"			} 			if ($msg_type ne "" &&			    (show_type("LONG_LINE") || show_type($msg_type))) {				my $msg_level = \&WARN;				$msg_level = \&CHK if ($file);				&{$msg_level}($msg_type,					      "line length of $length exceeds $max_line_length columns\n" . $herecurr);			}		} # check for adding lines without a newline.		if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {			WARN("MISSING_EOF_NEWLINE",			     "adding a line without newline at end of file\n" . $herecurr);		} # check we are in a valid source file C or perl if not then ignore this hunk		next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/); # at the beginning of a line any tabs must come first and anything# more than $tabsize must use tabs.		if ($rawline =~ /^\+\s* \t\s*\S/ ||		    $rawline =~ /^\+\s*        \s*/) {			my $herevet = "$here\n" . cat_vet($rawline) . "\n";			$rpt_cleaners = 1;			if (ERROR("CODE_INDENT",				  "code indent should use tabs where possible\n" . $herevet) &&			    $fix) {				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;			}		} # check for repeated words separated by a single space		if ($rawline =~ /^\+/) {			while ($rawline =~ /\b($word_pattern) (?=($word_pattern))/g) { 				my $first = $1;				my $second = $2; 				if ($first =~ /(?:struct|union|enum)/) {					pos($rawline) += length($first) + length($second) + 1;					next;				} 				next if ($first ne $second);				next if ($first eq 'long'); 				if (WARN("REPEATED_WORD",					 "Possible repeated word: '$first'\n" . $herecurr) &&				    $fix) {					$fixed[$fixlinenr] =~ s/\b$first $second\b/$first/;				}			} 			# if it's a repeated word on consecutive lines in a comment block			if ($prevline =~ /$;+\s*$/ &&			    $prevrawline =~ /($word_pattern)\s*$/) {				my $last_word = $1;				if ($rawline =~ /^\+\s*\*\s*$last_word /) {					if (WARN("REPEATED_WORD",						 "Possible repeated word: '$last_word'\n" . $hereprev) &&					    $fix) {						$fixed[$fixlinenr] =~ s/(\+\s*\*\s*)$last_word /$1/;					}				}			}		} # check for space before tabs.		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {			my $herevet = "$here\n" . cat_vet($rawline) . "\n";			if (WARN("SPACE_BEFORE_TAB",				"please, no space before tabs\n" . $herevet) &&			    $fix) {				while ($fixed[$fixlinenr] =~					   s/(^\+.*) {$tabsize,$tabsize}\t/$1\t\t/) {}				while ($fixed[$fixlinenr] =~					   s/(^\+.*) +\t/$1\t/) {}			}		} # check for assignments on the start of a line		if ($sline =~ /^\+\s+($Assignment)[^=]/) {			CHK("ASSIGNMENT_CONTINUATIONS",			    "Assignment operator '$1' should be on the previous line\n" . $hereprev);		} # check for && or || at the start of a line		if ($rawline =~ /^\+\s*(&&|\|\|)/) {			CHK("LOGICAL_CONTINUATIONS",			    "Logical continuations should be on the previous line\n" . $hereprev);		} # check indentation starts on a tab stop		if ($perl_version_ok &&		    $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {			my $indent = length($1);			if ($indent % $tabsize) {				if (WARN("TABSTOP",					 "Statements should start on a tabstop\n" . $herecurr) &&				    $fix) {					$fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/$tabsize)@e;				}			}		} # check multi-line statement indentation matches previous line		if ($perl_version_ok &&		    $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|(?:\*\s*)*$Lval\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {			$prevline =~ /^\+(\t*)(.*)$/;			my $oldindent = $1;			my $rest = $2; 			my $pos = pos_last_openparen($rest);			if ($pos >= 0) {				$line =~ /^(\+| )([ \t]*)/;				my $newindent = $2; 				my $goodtabindent = $oldindent .					"\t" x ($pos / $tabsize) .					" "  x ($pos % $tabsize);				my $goodspaceindent = $oldindent . " "  x $pos; 				if ($newindent ne $goodtabindent &&				    $newindent ne $goodspaceindent) { 					if (CHK("PARENTHESIS_ALIGNMENT",						"Alignment should match open parenthesis\n" . $hereprev) &&					    $fix && $line =~ /^\+/) {						$fixed[$fixlinenr] =~						    s/^\+[ \t]*/\+$goodtabindent/;					}				}			}		} # check for space after cast like "(int) foo" or "(struct foo) bar"# avoid checking a few false positives:#   "sizeof(<type>)" or "__alignof__(<type>)"#   function pointer declarations like "(*foo)(int) = bar;"#   structure definitions like "(struct foo) { 0 };"#   multiline macros that define functions#   known attributes or the __attribute__ keyword		if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ &&		    (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) {			if (CHK("SPACING",				"No space is necessary after a cast\n" . $herecurr) &&			    $fix) {				$fixed[$fixlinenr] =~				    s/(\(\s*$Type\s*\))[ \t]+/$1/;			}		} # Block comment styles# Networking with an initial /*		if ($realfile =~ m@^(drivers/net/|net/)@ &&		    $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&		    $rawline =~ /^\+[ \t]*\*/ &&		    $realline > 2) {			WARN("NETWORKING_BLOCK_COMMENT_STYLE",			     "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);		} # Block comments use * on subsequent lines		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment		    $prevrawline =~ /^\+.*?\/\*/ &&		#starting /*		    $prevrawline !~ /\*\/[ \t]*$/ &&		#no trailing */		    $rawline =~ /^\+/ &&			#line is new		    $rawline !~ /^\+[ \t]*\*/) {		#no leading *			WARN("BLOCK_COMMENT_STYLE",			     "Block comments use * on subsequent lines\n" . $hereprev);		} # Block comments use */ on trailing lines		if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&	#trailing */		    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/		    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&	#trailing **/		    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {	#non blank */			WARN("BLOCK_COMMENT_STYLE",			     "Block comments use a trailing */ on a separate line\n" . $herecurr);		} # Block comment * alignment		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment		    $line =~ /^\+[ \t]*$;/ &&			#leading comment		    $rawline =~ /^\+[ \t]*\*/ &&		#leading *		    (($prevrawline =~ /^\+.*?\/\*/ &&		#leading /*		      $prevrawline !~ /\*\/[ \t]*$/) ||		#no trailing */		     $prevrawline =~ /^\+[ \t]*\*/)) {		#leading *			my $oldindent;			$prevrawline =~ m@^\+([ \t]*/?)\*@;			if (defined($1)) {				$oldindent = expand_tabs($1);			} else {				$prevrawline =~ m@^\+(.*/?)\*@;				$oldindent = expand_tabs($1);			}			$rawline =~ m@^\+([ \t]*)\*@;			my $newindent = $1;			$newindent = expand_tabs($newindent);			if (length($oldindent) ne length($newindent)) {				WARN("BLOCK_COMMENT_STYLE",				     "Block comments should align the * on each line\n" . $hereprev);			}		} # check for missing blank lines after struct/union declarations# with exceptions for various attributes and macros		if ($prevline =~ /^[\+ ]};?\s*$/ &&		    $line =~ /^\+/ &&		    !($line =~ /^\+\s*$/ ||		      $line =~ /^\+\s*EXPORT_SYMBOL/ ||		      $line =~ /^\+\s*MODULE_/i ||		      $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||		      $line =~ /^\+[a-z_]*init/ ||		      $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||		      $line =~ /^\+\s*DECLARE/ ||		      $line =~ /^\+\s*builtin_[\w_]*driver/ ||		      $line =~ /^\+\s*__setup/)) {			if (CHK("LINE_SPACING",

Lines 3001–3500 of 6972. Previous lines