xref: /openbmc/linux/scripts/checkpatch.pl (revision e825b29a)
1#!/usr/bin/env perl
2# SPDX-License-Identifier: GPL-2.0
3#
4# (c) 2001, Dave Jones. (the file handling bit)
5# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
6# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
7# (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
8# (c) 2010-2018 Joe Perches <joe@perches.com>
9
10use strict;
11use warnings;
12use POSIX;
13use File::Basename;
14use Cwd 'abs_path';
15use Term::ANSIColor qw(:constants);
16use Encode qw(decode encode);
17
18my $P = $0;
19my $D = dirname(abs_path($P));
20
21my $V = '0.32';
22
23use Getopt::Long qw(:config no_auto_abbrev);
24
25my $quiet = 0;
26my $verbose = 0;
27my %verbose_messages = ();
28my %verbose_emitted = ();
29my $tree = 1;
30my $chk_signoff = 1;
31my $chk_patch = 1;
32my $tst_only;
33my $emacs = 0;
34my $terse = 0;
35my $showfile = 0;
36my $file = 0;
37my $git = 0;
38my %git_commits = ();
39my $check = 0;
40my $check_orig = 0;
41my $summary = 1;
42my $mailback = 0;
43my $summary_file = 0;
44my $show_types = 0;
45my $list_types = 0;
46my $fix = 0;
47my $fix_inplace = 0;
48my $root;
49my $gitroot = $ENV{'GIT_DIR'};
50$gitroot = ".git" if !defined($gitroot);
51my %debug;
52my %camelcase = ();
53my %use_type = ();
54my @use = ();
55my %ignore_type = ();
56my @ignore = ();
57my $help = 0;
58my $configuration_file = ".checkpatch.conf";
59my $max_line_length = 100;
60my $ignore_perl_version = 0;
61my $minimum_perl_version = 5.10.0;
62my $min_conf_desc_length = 4;
63my $spelling_file = "$D/spelling.txt";
64my $codespell = 0;
65my $codespellfile = "/usr/share/codespell/dictionary.txt";
66my $conststructsfile = "$D/const_structs.checkpatch";
67my $docsfile = "$D/../Documentation/dev-tools/checkpatch.rst";
68my $typedefsfile;
69my $color = "auto";
70my $allow_c99_comments = 1; # Can be overridden by --ignore C99_COMMENT_TOLERANCE
71# git output parsing needs US English output, so first set backtick child process LANGUAGE
72my $git_command ='export LANGUAGE=en_US.UTF-8; git';
73my $tabsize = 8;
74my ${CONFIG_} = "CONFIG_";
75
76sub help {
77	my ($exitcode) = @_;
78
79	print << "EOM";
80Usage: $P [OPTION]... [FILE]...
81Version: $V
82
83Options:
84  -q, --quiet                quiet
85  -v, --verbose              verbose mode
86  --no-tree                  run without a kernel tree
87  --no-signoff               do not check for 'Signed-off-by' line
88  --patch                    treat FILE as patchfile (default)
89  --emacs                    emacs compile window format
90  --terse                    one line per report
91  --showfile                 emit diffed file position, not input file position
92  -g, --git                  treat FILE as a single commit or git revision range
93                             single git commit with:
94                               <rev>
95                               <rev>^
96                               <rev>~n
97                             multiple git commits with:
98                               <rev1>..<rev2>
99                               <rev1>...<rev2>
100                               <rev>-<count>
101                             git merges are ignored
102  -f, --file                 treat FILE as regular source file
103  --subjective, --strict     enable more subjective tests
104  --list-types               list the possible message types
105  --types TYPE(,TYPE2...)    show only these comma separated message types
106  --ignore TYPE(,TYPE2...)   ignore various comma separated message types
107  --show-types               show the specific message type in the output
108  --max-line-length=n        set the maximum line length, (default $max_line_length)
109                             if exceeded, warn on patches
110                             requires --strict for use with --file
111  --min-conf-desc-length=n   set the min description length, if shorter, warn
112  --tab-size=n               set the number of spaces for tab (default $tabsize)
113  --root=PATH                PATH to the kernel tree root
114  --no-summary               suppress the per-file summary
115  --mailback                 only produce a report in case of warnings/errors
116  --summary-file             include the filename in summary
117  --debug KEY=[0|1]          turn on/off debugging of KEY, where KEY is one of
118                             'values', 'possible', 'type', and 'attr' (default
119                             is all off)
120  --test-only=WORD           report only warnings/errors containing WORD
121                             literally
122  --fix                      EXPERIMENTAL - may create horrible results
123                             If correctable single-line errors exist, create
124                             "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
125                             with potential errors corrected to the preferred
126                             checkpatch style
127  --fix-inplace              EXPERIMENTAL - may create horrible results
128                             Is the same as --fix, but overwrites the input
129                             file.  It's your fault if there's no backup or git
130  --ignore-perl-version      override checking of perl version.  expect
131                             runtime errors.
132  --codespell                Use the codespell dictionary for spelling/typos
133                             (default:/usr/share/codespell/dictionary.txt)
134  --codespellfile            Use this codespell dictionary
135  --typedefsfile             Read additional types from this file
136  --color[=WHEN]             Use colors 'always', 'never', or only when output
137                             is a terminal ('auto'). Default is 'auto'.
138  --kconfig-prefix=WORD      use WORD as a prefix for Kconfig symbols (default
139                             ${CONFIG_})
140  -h, --help, --version      display this help and exit
141
142When FILE is - read standard input.
143EOM
144
145	exit($exitcode);
146}
147
148sub uniq {
149	my %seen;
150	return grep { !$seen{$_}++ } @_;
151}
152
153sub list_types {
154	my ($exitcode) = @_;
155
156	my $count = 0;
157
158	local $/ = undef;
159
160	open(my $script, '<', abs_path($P)) or
161	    die "$P: Can't read '$P' $!\n";
162
163	my $text = <$script>;
164	close($script);
165
166	my %types = ();
167	# Also catch when type or level is passed through a variable
168	while ($text =~ /(?:(\bCHK|\bWARN|\bERROR|&\{\$msg_level})\s*\(|\$msg_type\s*=)\s*"([^"]+)"/g) {
169		if (defined($1)) {
170			if (exists($types{$2})) {
171				$types{$2} .= ",$1" if ($types{$2} ne $1);
172			} else {
173				$types{$2} = $1;
174			}
175		} else {
176			$types{$2} = "UNDETERMINED";
177		}
178	}
179
180	print("#\tMessage type\n\n");
181	if ($color) {
182		print(" ( Color coding: ");
183		print(RED . "ERROR" . RESET);
184		print(" | ");
185		print(YELLOW . "WARNING" . RESET);
186		print(" | ");
187		print(GREEN . "CHECK" . RESET);
188		print(" | ");
189		print("Multiple levels / Undetermined");
190		print(" )\n\n");
191	}
192
193	foreach my $type (sort keys %types) {
194		my $orig_type = $type;
195		if ($color) {
196			my $level = $types{$type};
197			if ($level eq "ERROR") {
198				$type = RED . $type . RESET;
199			} elsif ($level eq "WARN") {
200				$type = YELLOW . $type . RESET;
201			} elsif ($level eq "CHK") {
202				$type = GREEN . $type . RESET;
203			}
204		}
205		print(++$count . "\t" . $type . "\n");
206		if ($verbose && exists($verbose_messages{$orig_type})) {
207			my $message = $verbose_messages{$orig_type};
208			$message =~ s/\n/\n\t/g;
209			print("\t" . $message . "\n\n");
210		}
211	}
212
213	exit($exitcode);
214}
215
216my $conf = which_conf($configuration_file);
217if (-f $conf) {
218	my @conf_args;
219	open(my $conffile, '<', "$conf")
220	    or warn "$P: Can't find a readable $configuration_file file $!\n";
221
222	while (<$conffile>) {
223		my $line = $_;
224
225		$line =~ s/\s*\n?$//g;
226		$line =~ s/^\s*//g;
227		$line =~ s/\s+/ /g;
228
229		next if ($line =~ m/^\s*#/);
230		next if ($line =~ m/^\s*$/);
231
232		my @words = split(" ", $line);
233		foreach my $word (@words) {
234			last if ($word =~ m/^#/);
235			push (@conf_args, $word);
236		}
237	}
238	close($conffile);
239	unshift(@ARGV, @conf_args) if @conf_args;
240}
241
242sub load_docs {
243	open(my $docs, '<', "$docsfile")
244	    or warn "$P: Can't read the documentation file $docsfile $!\n";
245
246	my $type = '';
247	my $desc = '';
248	my $in_desc = 0;
249
250	while (<$docs>) {
251		chomp;
252		my $line = $_;
253		$line =~ s/\s+$//;
254
255		if ($line =~ /^\s*\*\*(.+)\*\*$/) {
256			if ($desc ne '') {
257				$verbose_messages{$type} = trim($desc);
258			}
259			$type = $1;
260			$desc = '';
261			$in_desc = 1;
262		} elsif ($in_desc) {
263			if ($line =~ /^(?:\s{4,}|$)/) {
264				$line =~ s/^\s{4}//;
265				$desc .= $line;
266				$desc .= "\n";
267			} else {
268				$verbose_messages{$type} = trim($desc);
269				$type = '';
270				$desc = '';
271				$in_desc = 0;
272			}
273		}
274	}
275
276	if ($desc ne '') {
277		$verbose_messages{$type} = trim($desc);
278	}
279	close($docs);
280}
281
282# Perl's Getopt::Long allows options to take optional arguments after a space.
283# Prevent --color by itself from consuming other arguments
284foreach (@ARGV) {
285	if ($_ eq "--color" || $_ eq "-color") {
286		$_ = "--color=$color";
287	}
288}
289
290GetOptions(
291	'q|quiet+'	=> \$quiet,
292	'v|verbose!'	=> \$verbose,
293	'tree!'		=> \$tree,
294	'signoff!'	=> \$chk_signoff,
295	'patch!'	=> \$chk_patch,
296	'emacs!'	=> \$emacs,
297	'terse!'	=> \$terse,
298	'showfile!'	=> \$showfile,
299	'f|file!'	=> \$file,
300	'g|git!'	=> \$git,
301	'subjective!'	=> \$check,
302	'strict!'	=> \$check,
303	'ignore=s'	=> \@ignore,
304	'types=s'	=> \@use,
305	'show-types!'	=> \$show_types,
306	'list-types!'	=> \$list_types,
307	'max-line-length=i' => \$max_line_length,
308	'min-conf-desc-length=i' => \$min_conf_desc_length,
309	'tab-size=i'	=> \$tabsize,
310	'root=s'	=> \$root,
311	'summary!'	=> \$summary,
312	'mailback!'	=> \$mailback,
313	'summary-file!'	=> \$summary_file,
314	'fix!'		=> \$fix,
315	'fix-inplace!'	=> \$fix_inplace,
316	'ignore-perl-version!' => \$ignore_perl_version,
317	'debug=s'	=> \%debug,
318	'test-only=s'	=> \$tst_only,
319	'codespell!'	=> \$codespell,
320	'codespellfile=s'	=> \$codespellfile,
321	'typedefsfile=s'	=> \$typedefsfile,
322	'color=s'	=> \$color,
323	'no-color'	=> \$color,	#keep old behaviors of -nocolor
324	'nocolor'	=> \$color,	#keep old behaviors of -nocolor
325	'kconfig-prefix=s'	=> \${CONFIG_},
326	'h|help'	=> \$help,
327	'version'	=> \$help
328) or help(1);
329
330help(0) if ($help);
331
332die "$P: --git cannot be used with --file or --fix\n" if ($git && ($file || $fix));
333die "$P: --verbose cannot be used with --terse\n" if ($verbose && $terse);
334
335if ($color =~ /^[01]$/) {
336	$color = !$color;
337} elsif ($color =~ /^always$/i) {
338	$color = 1;
339} elsif ($color =~ /^never$/i) {
340	$color = 0;
341} elsif ($color =~ /^auto$/i) {
342	$color = (-t STDOUT);
343} else {
344	die "$P: Invalid color mode: $color\n";
345}
346
347load_docs() if ($verbose);
348list_types(0) if ($list_types);
349
350$fix = 1 if ($fix_inplace);
351$check_orig = $check;
352
353my $exit = 0;
354
355my $perl_version_ok = 1;
356if ($^V && $^V lt $minimum_perl_version) {
357	$perl_version_ok = 0;
358	printf "$P: requires at least perl version %vd\n", $minimum_perl_version;
359	exit(1) if (!$ignore_perl_version);
360}
361
362#if no filenames are given, push '-' to read patch from stdin
363if ($#ARGV < 0) {
364	push(@ARGV, '-');
365}
366
367# skip TAB size 1 to avoid additional checks on $tabsize - 1
368die "$P: Invalid TAB size: $tabsize\n" if ($tabsize < 2);
369
370sub hash_save_array_words {
371	my ($hashRef, $arrayRef) = @_;
372
373	my @array = split(/,/, join(',', @$arrayRef));
374	foreach my $word (@array) {
375		$word =~ s/\s*\n?$//g;
376		$word =~ s/^\s*//g;
377		$word =~ s/\s+/ /g;
378		$word =~ tr/[a-z]/[A-Z]/;
379
380		next if ($word =~ m/^\s*#/);
381		next if ($word =~ m/^\s*$/);
382
383		$hashRef->{$word}++;
384	}
385}
386
387sub hash_show_words {
388	my ($hashRef, $prefix) = @_;
389
390	if (keys %$hashRef) {
391		print "\nNOTE: $prefix message types:";
392		foreach my $word (sort keys %$hashRef) {
393			print " $word";
394		}
395		print "\n";
396	}
397}
398
399hash_save_array_words(\%ignore_type, \@ignore);
400hash_save_array_words(\%use_type, \@use);
401
402my $dbg_values = 0;
403my $dbg_possible = 0;
404my $dbg_type = 0;
405my $dbg_attr = 0;
406for my $key (keys %debug) {
407	## no critic
408	eval "\${dbg_$key} = '$debug{$key}';";
409	die "$@" if ($@);
410}
411
412my $rpt_cleaners = 0;
413
414if ($terse) {
415	$emacs = 1;
416	$quiet++;
417}
418
419if ($tree) {
420	if (defined $root) {
421		if (!top_of_kernel_tree($root)) {
422			die "$P: $root: --root does not point at a valid tree\n";
423		}
424	} else {
425		if (top_of_kernel_tree('.')) {
426			$root = '.';
427		} elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
428						top_of_kernel_tree($1)) {
429			$root = $1;
430		}
431	}
432
433	if (!defined $root) {
434		print "Must be run from the top-level dir. of a kernel tree\n";
435		exit(2);
436	}
437}
438
439my $emitted_corrupt = 0;
440
441our $Ident	= qr{
442			[A-Za-z_][A-Za-z\d_]*
443			(?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
444		}x;
445our $Storage	= qr{extern|static|asmlinkage};
446our $Sparse	= qr{
447			__user|
448			__kernel|
449			__force|
450			__iomem|
451			__must_check|
452			__kprobes|
453			__ref|
454			__refconst|
455			__refdata|
456			__rcu|
457			__private
458		}x;
459our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
460our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
461our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
462our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
463our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
464
465# Notes to $Attribute:
466# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
467our $Attribute	= qr{
468			const|
469			volatile|
470			__percpu|
471			__nocast|
472			__safe|
473			__bitwise|
474			__packed__|
475			__packed2__|
476			__naked|
477			__maybe_unused|
478			__always_unused|
479			__noreturn|
480			__used|
481			__cold|
482			__pure|
483			__noclone|
484			__deprecated|
485			__read_mostly|
486			__ro_after_init|
487			__kprobes|
488			$InitAttribute|
489			____cacheline_aligned|
490			____cacheline_aligned_in_smp|
491			____cacheline_internodealigned_in_smp|
492			__weak
493		  }x;
494our $Modifier;
495our $Inline	= qr{inline|__always_inline|noinline|__inline|__inline__};
496our $Member	= qr{->$Ident|\.$Ident|\[[^]]*\]};
497our $Lval	= qr{$Ident(?:$Member)*};
498
499our $Int_type	= qr{(?i)llu|ull|ll|lu|ul|l|u};
500our $Binary	= qr{(?i)0b[01]+$Int_type?};
501our $Hex	= qr{(?i)0x[0-9a-f]+$Int_type?};
502our $Int	= qr{[0-9]+$Int_type?};
503our $Octal	= qr{0[0-7]+$Int_type?};
504our $String	= qr{(?:\b[Lu])?"[X\t]*"};
505our $Float_hex	= qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
506our $Float_dec	= qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
507our $Float_int	= qr{(?i)[0-9]+e-?[0-9]+[fl]?};
508our $Float	= qr{$Float_hex|$Float_dec|$Float_int};
509our $Constant	= qr{$Float|$Binary|$Octal|$Hex|$Int};
510our $Assignment	= qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
511our $Compare    = qr{<=|>=|==|!=|<|(?<!-)>};
512our $Arithmetic = qr{\+|-|\*|\/|%};
513our $Operators	= qr{
514			<=|>=|==|!=|
515			=>|->|<<|>>|<|>|!|~|
516			&&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
517		  }x;
518
519our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x;
520
521our $BasicType;
522our $NonptrType;
523our $NonptrTypeMisordered;
524our $NonptrTypeWithAttr;
525our $Type;
526our $TypeMisordered;
527our $Declare;
528our $DeclareMisordered;
529
530our $NON_ASCII_UTF8	= qr{
531	[\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte
532	|  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
533	| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
534	|  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
535	|  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
536	| [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
537	|  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
538}x;
539
540our $UTF8	= qr{
541	[\x09\x0A\x0D\x20-\x7E]              # ASCII
542	| $NON_ASCII_UTF8
543}x;
544
545our $typeC99Typedefs = qr{(?:__)?(?:[us]_?)?int_?(?:8|16|32|64)_t};
546our $typeOtherOSTypedefs = qr{(?x:
547	u_(?:char|short|int|long) |          # bsd
548	u(?:nchar|short|int|long)            # sysv
549)};
550our $typeKernelTypedefs = qr{(?x:
551	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
552	atomic_t
553)};
554our $typeTypedefs = qr{(?x:
555	$typeC99Typedefs\b|
556	$typeOtherOSTypedefs\b|
557	$typeKernelTypedefs\b
558)};
559
560our $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b};
561
562our $logFunctions = qr{(?x:
563	printk(?:_ratelimited|_once|_deferred_once|_deferred|)|
564	(?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
565	TP_printk|
566	WARN(?:_RATELIMIT|_ONCE|)|
567	panic|
568	MODULE_[A-Z_]+|
569	seq_vprintf|seq_printf|seq_puts
570)};
571
572our $allocFunctions = qr{(?x:
573	(?:(?:devm_)?
574		(?:kv|k|v)[czm]alloc(?:_array)?(?:_node)? |
575		kstrdup(?:_const)? |
576		kmemdup(?:_nul)?) |
577	(?:\w+)?alloc_skb(?:_ip_align)? |
578				# dev_alloc_skb/netdev_alloc_skb, et al
579	dma_alloc_coherent
580)};
581
582our $signature_tags = qr{(?xi:
583	Signed-off-by:|
584	Co-developed-by:|
585	Acked-by:|
586	Tested-by:|
587	Reviewed-by:|
588	Reported-by:|
589	Suggested-by:|
590	To:|
591	Cc:
592)};
593
594our $tracing_logging_tags = qr{(?xi:
595	[=-]*> |
596	<[=-]* |
597	\[ |
598	\] |
599	start |
600	called |
601	entered |
602	entry |
603	enter |
604	in |
605	inside |
606	here |
607	begin |
608	exit |
609	end |
610	done |
611	leave |
612	completed |
613	out |
614	return |
615	[\.\!:\s]*
616)};
617
618sub edit_distance_min {
619	my (@arr) = @_;
620	my $len = scalar @arr;
621	if ((scalar @arr) < 1) {
622		# if underflow, return
623		return;
624	}
625	my $min = $arr[0];
626	for my $i (0 .. ($len-1)) {
627		if ($arr[$i] < $min) {
628			$min = $arr[$i];
629		}
630	}
631	return $min;
632}
633
634sub get_edit_distance {
635	my ($str1, $str2) = @_;
636	$str1 = lc($str1);
637	$str2 = lc($str2);
638	$str1 =~ s/-//g;
639	$str2 =~ s/-//g;
640	my $len1 = length($str1);
641	my $len2 = length($str2);
642	# two dimensional array storing minimum edit distance
643	my @distance;
644	for my $i (0 .. $len1) {
645		for my $j (0 .. $len2) {
646			if ($i == 0) {
647				$distance[$i][$j] = $j;
648			} elsif ($j == 0) {
649				$distance[$i][$j] = $i;
650			} elsif (substr($str1, $i-1, 1) eq substr($str2, $j-1, 1)) {
651				$distance[$i][$j] = $distance[$i - 1][$j - 1];
652			} else {
653				my $dist1 = $distance[$i][$j - 1]; #insert distance
654				my $dist2 = $distance[$i - 1][$j]; # remove
655				my $dist3 = $distance[$i - 1][$j - 1]; #replace
656				$distance[$i][$j] = 1 + edit_distance_min($dist1, $dist2, $dist3);
657			}
658		}
659	}
660	return $distance[$len1][$len2];
661}
662
663sub find_standard_signature {
664	my ($sign_off) = @_;
665	my @standard_signature_tags = (
666		'Signed-off-by:', 'Co-developed-by:', 'Acked-by:', 'Tested-by:',
667		'Reviewed-by:', 'Reported-by:', 'Suggested-by:'
668	);
669	foreach my $signature (@standard_signature_tags) {
670		return $signature if (get_edit_distance($sign_off, $signature) <= 2);
671	}
672
673	return "";
674}
675
676our @typeListMisordered = (
677	qr{char\s+(?:un)?signed},
678	qr{int\s+(?:(?:un)?signed\s+)?short\s},
679	qr{int\s+short(?:\s+(?:un)?signed)},
680	qr{short\s+int(?:\s+(?:un)?signed)},
681	qr{(?:un)?signed\s+int\s+short},
682	qr{short\s+(?:un)?signed},
683	qr{long\s+int\s+(?:un)?signed},
684	qr{int\s+long\s+(?:un)?signed},
685	qr{long\s+(?:un)?signed\s+int},
686	qr{int\s+(?:un)?signed\s+long},
687	qr{int\s+(?:un)?signed},
688	qr{int\s+long\s+long\s+(?:un)?signed},
689	qr{long\s+long\s+int\s+(?:un)?signed},
690	qr{long\s+long\s+(?:un)?signed\s+int},
691	qr{long\s+long\s+(?:un)?signed},
692	qr{long\s+(?:un)?signed},
693);
694
695our @typeList = (
696	qr{void},
697	qr{(?:(?:un)?signed\s+)?char},
698	qr{(?:(?:un)?signed\s+)?short\s+int},
699	qr{(?:(?:un)?signed\s+)?short},
700	qr{(?:(?:un)?signed\s+)?int},
701	qr{(?:(?:un)?signed\s+)?long\s+int},
702	qr{(?:(?:un)?signed\s+)?long\s+long\s+int},
703	qr{(?:(?:un)?signed\s+)?long\s+long},
704	qr{(?:(?:un)?signed\s+)?long},
705	qr{(?:un)?signed},
706	qr{float},
707	qr{double},
708	qr{bool},
709	qr{struct\s+$Ident},
710	qr{union\s+$Ident},
711	qr{enum\s+$Ident},
712	qr{${Ident}_t},
713	qr{${Ident}_handler},
714	qr{${Ident}_handler_fn},
715	@typeListMisordered,
716);
717
718our $C90_int_types = qr{(?x:
719	long\s+long\s+int\s+(?:un)?signed|
720	long\s+long\s+(?:un)?signed\s+int|
721	long\s+long\s+(?:un)?signed|
722	(?:(?:un)?signed\s+)?long\s+long\s+int|
723	(?:(?:un)?signed\s+)?long\s+long|
724	int\s+long\s+long\s+(?:un)?signed|
725	int\s+(?:(?:un)?signed\s+)?long\s+long|
726
727	long\s+int\s+(?:un)?signed|
728	long\s+(?:un)?signed\s+int|
729	long\s+(?:un)?signed|
730	(?:(?:un)?signed\s+)?long\s+int|
731	(?:(?:un)?signed\s+)?long|
732	int\s+long\s+(?:un)?signed|
733	int\s+(?:(?:un)?signed\s+)?long|
734
735	int\s+(?:un)?signed|
736	(?:(?:un)?signed\s+)?int
737)};
738
739our @typeListFile = ();
740our @typeListWithAttr = (
741	@typeList,
742	qr{struct\s+$InitAttribute\s+$Ident},
743	qr{union\s+$InitAttribute\s+$Ident},
744);
745
746our @modifierList = (
747	qr{fastcall},
748);
749our @modifierListFile = ();
750
751our @mode_permission_funcs = (
752	["module_param", 3],
753	["module_param_(?:array|named|string)", 4],
754	["module_param_array_named", 5],
755	["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],
756	["proc_create(?:_data|)", 2],
757	["(?:CLASS|DEVICE|SENSOR|SENSOR_DEVICE|IIO_DEVICE)_ATTR", 2],
758	["IIO_DEV_ATTR_[A-Z_]+", 1],
759	["SENSOR_(?:DEVICE_|)ATTR_2", 2],
760	["SENSOR_TEMPLATE(?:_2|)", 3],
761	["__ATTR", 2],
762);
763
764my $word_pattern = '\b[A-Z]?[a-z]{2,}\b';
765
766#Create a search pattern for all these functions to speed up a loop below
767our $mode_perms_search = "";
768foreach my $entry (@mode_permission_funcs) {
769	$mode_perms_search .= '|' if ($mode_perms_search ne "");
770	$mode_perms_search .= $entry->[0];
771}
772$mode_perms_search = "(?:${mode_perms_search})";
773
774our %deprecated_apis = (
775	"synchronize_rcu_bh"			=> "synchronize_rcu",
776	"synchronize_rcu_bh_expedited"		=> "synchronize_rcu_expedited",
777	"call_rcu_bh"				=> "call_rcu",
778	"rcu_barrier_bh"			=> "rcu_barrier",
779	"synchronize_sched"			=> "synchronize_rcu",
780	"synchronize_sched_expedited"		=> "synchronize_rcu_expedited",
781	"call_rcu_sched"			=> "call_rcu",
782	"rcu_barrier_sched"			=> "rcu_barrier",
783	"get_state_synchronize_sched"		=> "get_state_synchronize_rcu",
784	"cond_synchronize_sched"		=> "cond_synchronize_rcu",
785);
786
787#Create a search pattern for all these strings to speed up a loop below
788our $deprecated_apis_search = "";
789foreach my $entry (keys %deprecated_apis) {
790	$deprecated_apis_search .= '|' if ($deprecated_apis_search ne "");
791	$deprecated_apis_search .= $entry;
792}
793$deprecated_apis_search = "(?:${deprecated_apis_search})";
794
795our $mode_perms_world_writable = qr{
796	S_IWUGO		|
797	S_IWOTH		|
798	S_IRWXUGO	|
799	S_IALLUGO	|
800	0[0-7][0-7][2367]
801}x;
802
803our %mode_permission_string_types = (
804	"S_IRWXU" => 0700,
805	"S_IRUSR" => 0400,
806	"S_IWUSR" => 0200,
807	"S_IXUSR" => 0100,
808	"S_IRWXG" => 0070,
809	"S_IRGRP" => 0040,
810	"S_IWGRP" => 0020,
811	"S_IXGRP" => 0010,
812	"S_IRWXO" => 0007,
813	"S_IROTH" => 0004,
814	"S_IWOTH" => 0002,
815	"S_IXOTH" => 0001,
816	"S_IRWXUGO" => 0777,
817	"S_IRUGO" => 0444,
818	"S_IWUGO" => 0222,
819	"S_IXUGO" => 0111,
820);
821
822#Create a search pattern for all these strings to speed up a loop below
823our $mode_perms_string_search = "";
824foreach my $entry (keys %mode_permission_string_types) {
825	$mode_perms_string_search .= '|' if ($mode_perms_string_search ne "");
826	$mode_perms_string_search .= $entry;
827}
828our $single_mode_perms_string_search = "(?:${mode_perms_string_search})";
829our $multi_mode_perms_string_search = qr{
830	${single_mode_perms_string_search}
831	(?:\s*\|\s*${single_mode_perms_string_search})*
832}x;
833
834sub perms_to_octal {
835	my ($string) = @_;
836
837	return trim($string) if ($string =~ /^\s*0[0-7]{3,3}\s*$/);
838
839	my $val = "";
840	my $oval = "";
841	my $to = 0;
842	my $curpos = 0;
843	my $lastpos = 0;
844	while ($string =~ /\b(($single_mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) {
845		$curpos = pos($string);
846		my $match = $2;
847		my $omatch = $1;
848		last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos));
849		$lastpos = $curpos;
850		$to |= $mode_permission_string_types{$match};
851		$val .= '\s*\|\s*' if ($val ne "");
852		$val .= $match;
853		$oval .= $omatch;
854	}
855	$oval =~ s/^\s*\|\s*//;
856	$oval =~ s/\s*\|\s*$//;
857	return sprintf("%04o", $to);
858}
859
860our $allowed_asm_includes = qr{(?x:
861	irq|
862	memory|
863	time|
864	reboot
865)};
866# memory.h: ARM has a custom one
867
868# Load common spelling mistakes and build regular expression list.
869my $misspellings;
870my %spelling_fix;
871
872if (open(my $spelling, '<', $spelling_file)) {
873	while (<$spelling>) {
874		my $line = $_;
875
876		$line =~ s/\s*\n?$//g;
877		$line =~ s/^\s*//g;
878
879		next if ($line =~ m/^\s*#/);
880		next if ($line =~ m/^\s*$/);
881
882		my ($suspect, $fix) = split(/\|\|/, $line);
883
884		$spelling_fix{$suspect} = $fix;
885	}
886	close($spelling);
887} else {
888	warn "No typos will be found - file '$spelling_file': $!\n";
889}
890
891if ($codespell) {
892	if (open(my $spelling, '<', $codespellfile)) {
893		while (<$spelling>) {
894			my $line = $_;
895
896			$line =~ s/\s*\n?$//g;
897			$line =~ s/^\s*//g;
898
899			next if ($line =~ m/^\s*#/);
900			next if ($line =~ m/^\s*$/);
901			next if ($line =~ m/, disabled/i);
902
903			$line =~ s/,.*$//;
904
905			my ($suspect, $fix) = split(/->/, $line);
906
907			$spelling_fix{$suspect} = $fix;
908		}
909		close($spelling);
910	} else {
911		warn "No codespell typos will be found - file '$codespellfile': $!\n";
912	}
913}
914
915$misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix;
916
917sub read_words {
918	my ($wordsRef, $file) = @_;
919
920	if (open(my $words, '<', $file)) {
921		while (<$words>) {
922			my $line = $_;
923
924			$line =~ s/\s*\n?$//g;
925			$line =~ s/^\s*//g;
926
927			next if ($line =~ m/^\s*#/);
928			next if ($line =~ m/^\s*$/);
929			if ($line =~ /\s/) {
930				print("$file: '$line' invalid - ignored\n");
931				next;
932			}
933
934			$$wordsRef .= '|' if (defined $$wordsRef);
935			$$wordsRef .= $line;
936		}
937		close($file);
938		return 1;
939	}
940
941	return 0;
942}
943
944my $const_structs;
945if (show_type("CONST_STRUCT")) {
946	read_words(\$const_structs, $conststructsfile)
947	    or warn "No structs that should be const will be found - file '$conststructsfile': $!\n";
948}
949
950if (defined($typedefsfile)) {
951	my $typeOtherTypedefs;
952	read_words(\$typeOtherTypedefs, $typedefsfile)
953	    or warn "No additional types will be considered - file '$typedefsfile': $!\n";
954	$typeTypedefs .= '|' . $typeOtherTypedefs if (defined $typeOtherTypedefs);
955}
956
957sub build_types {
958	my $mods = "(?x:  \n" . join("|\n  ", (@modifierList, @modifierListFile)) . "\n)";
959	my $all = "(?x:  \n" . join("|\n  ", (@typeList, @typeListFile)) . "\n)";
960	my $Misordered = "(?x:  \n" . join("|\n  ", @typeListMisordered) . "\n)";
961	my $allWithAttr = "(?x:  \n" . join("|\n  ", @typeListWithAttr) . "\n)";
962	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
963	$BasicType	= qr{
964				(?:$typeTypedefs\b)|
965				(?:${all}\b)
966		}x;
967	$NonptrType	= qr{
968			(?:$Modifier\s+|const\s+)*
969			(?:
970				(?:typeof|__typeof__)\s*\([^\)]*\)|
971				(?:$typeTypedefs\b)|
972				(?:${all}\b)
973			)
974			(?:\s+$Modifier|\s+const)*
975		  }x;
976	$NonptrTypeMisordered	= qr{
977			(?:$Modifier\s+|const\s+)*
978			(?:
979				(?:${Misordered}\b)
980			)
981			(?:\s+$Modifier|\s+const)*
982		  }x;
983	$NonptrTypeWithAttr	= qr{
984			(?:$Modifier\s+|const\s+)*
985			(?:
986				(?:typeof|__typeof__)\s*\([^\)]*\)|
987				(?:$typeTypedefs\b)|
988				(?:${allWithAttr}\b)
989			)
990			(?:\s+$Modifier|\s+const)*
991		  }x;
992	$Type	= qr{
993			$NonptrType
994			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+){0,4}
995			(?:\s+$Inline|\s+$Modifier)*
996		  }x;
997	$TypeMisordered	= qr{
998			$NonptrTypeMisordered
999			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+){0,4}
1000			(?:\s+$Inline|\s+$Modifier)*
1001		  }x;
1002	$Declare	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
1003	$DeclareMisordered	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered};
1004}
1005build_types();
1006
1007our $Typecast	= qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
1008
1009# Using $balanced_parens, $LvalOrFunc, or $FuncArg
1010# requires at least perl version v5.10.0
1011# Any use must be runtime checked with $^V
1012
1013our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
1014our $LvalOrFunc	= qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
1015our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
1016
1017our $declaration_macros = qr{(?x:
1018	(?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
1019	(?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(|
1020	(?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\(
1021)};
1022
1023our %allow_repeated_words = (
1024	add => '',
1025	added => '',
1026	bad => '',
1027	be => '',
1028);
1029
1030sub deparenthesize {
1031	my ($string) = @_;
1032	return "" if (!defined($string));
1033
1034	while ($string =~ /^\s*\(.*\)\s*$/) {
1035		$string =~ s@^\s*\(\s*@@;
1036		$string =~ s@\s*\)\s*$@@;
1037	}
1038
1039	$string =~ s@\s+@ @g;
1040
1041	return $string;
1042}
1043
1044sub seed_camelcase_file {
1045	my ($file) = @_;
1046
1047	return if (!(-f $file));
1048
1049	local $/;
1050
1051	open(my $include_file, '<', "$file")
1052	    or warn "$P: Can't read '$file' $!\n";
1053	my $text = <$include_file>;
1054	close($include_file);
1055
1056	my @lines = split('\n', $text);
1057
1058	foreach my $line (@lines) {
1059		next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
1060		if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
1061			$camelcase{$1} = 1;
1062		} elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
1063			$camelcase{$1} = 1;
1064		} elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
1065			$camelcase{$1} = 1;
1066		}
1067	}
1068}
1069
1070our %maintained_status = ();
1071
1072sub is_maintained_obsolete {
1073	my ($filename) = @_;
1074
1075	return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl"));
1076
1077	if (!exists($maintained_status{$filename})) {
1078		$maintained_status{$filename} = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`;
1079	}
1080
1081	return $maintained_status{$filename} =~ /obsolete/i;
1082}
1083
1084sub is_SPDX_License_valid {
1085	my ($license) = @_;
1086
1087	return 1 if (!$tree || which("python3") eq "" || !(-x "$root/scripts/spdxcheck.py") || !(-e "$gitroot"));
1088
1089	my $root_path = abs_path($root);
1090	my $status = `cd "$root_path"; echo "$license" | scripts/spdxcheck.py -`;
1091	return 0 if ($status ne "");
1092	return 1;
1093}
1094
1095my $camelcase_seeded = 0;
1096sub seed_camelcase_includes {
1097	return if ($camelcase_seeded);
1098
1099	my $files;
1100	my $camelcase_cache = "";
1101	my @include_files = ();
1102
1103	$camelcase_seeded = 1;
1104
1105	if (-e "$gitroot") {
1106		my $git_last_include_commit = `${git_command} log --no-merges --pretty=format:"%h%n" -1 -- include`;
1107		chomp $git_last_include_commit;
1108		$camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
1109	} else {
1110		my $last_mod_date = 0;
1111		$files = `find $root/include -name "*.h"`;
1112		@include_files = split('\n', $files);
1113		foreach my $file (@include_files) {
1114			my $date = POSIX::strftime("%Y%m%d%H%M",
1115						   localtime((stat $file)[9]));
1116			$last_mod_date = $date if ($last_mod_date < $date);
1117		}
1118		$camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
1119	}
1120
1121	if ($camelcase_cache ne "" && -f $camelcase_cache) {
1122		open(my $camelcase_file, '<', "$camelcase_cache")
1123		    or warn "$P: Can't read '$camelcase_cache' $!\n";
1124		while (<$camelcase_file>) {
1125			chomp;
1126			$camelcase{$_} = 1;
1127		}
1128		close($camelcase_file);
1129
1130		return;
1131	}
1132
1133	if (-e "$gitroot") {
1134		$files = `${git_command} ls-files "include/*.h"`;
1135		@include_files = split('\n', $files);
1136	}
1137
1138	foreach my $file (@include_files) {
1139		seed_camelcase_file($file);
1140	}
1141
1142	if ($camelcase_cache ne "") {
1143		unlink glob ".checkpatch-camelcase.*";
1144		open(my $camelcase_file, '>', "$camelcase_cache")
1145		    or warn "$P: Can't write '$camelcase_cache' $!\n";
1146		foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
1147			print $camelcase_file ("$_\n");
1148		}
1149		close($camelcase_file);
1150	}
1151}
1152
1153sub git_is_single_file {
1154	my ($filename) = @_;
1155
1156	return 0 if ((which("git") eq "") || !(-e "$gitroot"));
1157
1158	my $output = `${git_command} ls-files -- $filename 2>/dev/null`;
1159	my $count = $output =~ tr/\n//;
1160	return $count eq 1 && $output =~ m{^${filename}$};
1161}
1162
1163sub git_commit_info {
1164	my ($commit, $id, $desc) = @_;
1165
1166	return ($id, $desc) if ((which("git") eq "") || !(-e "$gitroot"));
1167
1168	my $output = `${git_command} log --no-color --format='%H %s' -1 $commit 2>&1`;
1169	$output =~ s/^\s*//gm;
1170	my @lines = split("\n", $output);
1171
1172	return ($id, $desc) if ($#lines < 0);
1173
1174	if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous/) {
1175# Maybe one day convert this block of bash into something that returns
1176# all matching commit ids, but it's very slow...
1177#
1178#		echo "checking commits $1..."
1179#		git rev-list --remotes | grep -i "^$1" |
1180#		while read line ; do
1181#		    git log --format='%H %s' -1 $line |
1182#		    echo "commit $(cut -c 1-12,41-)"
1183#		done
1184	} elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./ ||
1185		 $lines[0] =~ /^fatal: bad object $commit/) {
1186		$id = undef;
1187	} else {
1188		$id = substr($lines[0], 0, 12);
1189		$desc = substr($lines[0], 41);
1190	}
1191
1192	return ($id, $desc);
1193}
1194
1195$chk_signoff = 0 if ($file);
1196
1197my @rawlines = ();
1198my @lines = ();
1199my @fixed = ();
1200my @fixed_inserted = ();
1201my @fixed_deleted = ();
1202my $fixlinenr = -1;
1203
1204# If input is git commits, extract all commits from the commit expressions.
1205# For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'.
1206die "$P: No git repository found\n" if ($git && !-e "$gitroot");
1207
1208if ($git) {
1209	my @commits = ();
1210	foreach my $commit_expr (@ARGV) {
1211		my $git_range;
1212		if ($commit_expr =~ m/^(.*)-(\d+)$/) {
1213			$git_range = "-$2 $1";
1214		} elsif ($commit_expr =~ m/\.\./) {
1215			$git_range = "$commit_expr";
1216		} else {
1217			$git_range = "-1 $commit_expr";
1218		}
1219		my $lines = `${git_command} log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
1220		foreach my $line (split(/\n/, $lines)) {
1221			$line =~ /^([0-9a-fA-F]{40,40}) (.*)$/;
1222			next if (!defined($1) || !defined($2));
1223			my $sha1 = $1;
1224			my $subject = $2;
1225			unshift(@commits, $sha1);
1226			$git_commits{$sha1} = $subject;
1227		}
1228	}
1229	die "$P: no git commits after extraction!\n" if (@commits == 0);
1230	@ARGV = @commits;
1231}
1232
1233my $vname;
1234$allow_c99_comments = !defined $ignore_type{"C99_COMMENT_TOLERANCE"};
1235for my $filename (@ARGV) {
1236	my $FILE;
1237	my $is_git_file = git_is_single_file($filename);
1238	my $oldfile = $file;
1239	$file = 1 if ($is_git_file);
1240	if ($git) {
1241		open($FILE, '-|', "git format-patch -M --stdout -1 $filename") ||
1242			die "$P: $filename: git format-patch failed - $!\n";
1243	} elsif ($file) {
1244		open($FILE, '-|', "diff -u /dev/null $filename") ||
1245			die "$P: $filename: diff failed - $!\n";
1246	} elsif ($filename eq '-') {
1247		open($FILE, '<&STDIN');
1248	} else {
1249		open($FILE, '<', "$filename") ||
1250			die "$P: $filename: open failed - $!\n";
1251	}
1252	if ($filename eq '-') {
1253		$vname = 'Your patch';
1254	} elsif ($git) {
1255		$vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")';
1256	} else {
1257		$vname = $filename;
1258	}
1259	while (<$FILE>) {
1260		chomp;
1261		push(@rawlines, $_);
1262		$vname = qq("$1") if ($filename eq '-' && $_ =~ m/^Subject:\s+(.+)/i);
1263	}
1264	close($FILE);
1265
1266	if ($#ARGV > 0 && $quiet == 0) {
1267		print '-' x length($vname) . "\n";
1268		print "$vname\n";
1269		print '-' x length($vname) . "\n";
1270	}
1271
1272	if (!process($filename)) {
1273		$exit = 1;
1274	}
1275	@rawlines = ();
1276	@lines = ();
1277	@fixed = ();
1278	@fixed_inserted = ();
1279	@fixed_deleted = ();
1280	$fixlinenr = -1;
1281	@modifierListFile = ();
1282	@typeListFile = ();
1283	build_types();
1284	$file = $oldfile if ($is_git_file);
1285}
1286
1287if (!$quiet) {
1288	hash_show_words(\%use_type, "Used");
1289	hash_show_words(\%ignore_type, "Ignored");
1290
1291	if (!$perl_version_ok) {
1292		print << "EOM"
1293
1294NOTE: perl $^V is not modern enough to detect all possible issues.
1295      An upgrade to at least perl $minimum_perl_version is suggested.
1296EOM
1297	}
1298	if ($exit) {
1299		print << "EOM"
1300
1301NOTE: If any of the errors are false positives, please report
1302      them to the maintainer, see CHECKPATCH in MAINTAINERS.
1303EOM
1304	}
1305}
1306
1307exit($exit);
1308
1309sub top_of_kernel_tree {
1310	my ($root) = @_;
1311
1312	my @tree_check = (
1313		"COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
1314		"README", "Documentation", "arch", "include", "drivers",
1315		"fs", "init", "ipc", "kernel", "lib", "scripts",
1316	);
1317
1318	foreach my $check (@tree_check) {
1319		if (! -e $root . '/' . $check) {
1320			return 0;
1321		}
1322	}
1323	return 1;
1324}
1325
1326sub parse_email {
1327	my ($formatted_email) = @_;
1328
1329	my $name = "";
1330	my $quoted = "";
1331	my $name_comment = "";
1332	my $address = "";
1333	my $comment = "";
1334
1335	if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
1336		$name = $1;
1337		$address = $2;
1338		$comment = $3 if defined $3;
1339	} elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
1340		$address = $1;
1341		$comment = $2 if defined $2;
1342	} elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
1343		$address = $1;
1344		$comment = $2 if defined $2;
1345		$formatted_email =~ s/\Q$address\E.*$//;
1346		$name = $formatted_email;
1347		$name = trim($name);
1348		$name =~ s/^\"|\"$//g;
1349		# If there's a name left after stripping spaces and
1350		# leading quotes, and the address doesn't have both
1351		# leading and trailing angle brackets, the address
1352		# is invalid. ie:
1353		#   "joe smith joe@smith.com" bad
1354		#   "joe smith <joe@smith.com" bad
1355		if ($name ne "" && $address !~ /^<[^>]+>$/) {
1356			$name = "";
1357			$address = "";
1358			$comment = "";
1359		}
1360	}
1361
1362	# Extract comments from names excluding quoted parts
1363	# "John D. (Doe)" - Do not extract
1364	if ($name =~ s/\"(.+)\"//) {
1365		$quoted = $1;
1366	}
1367	while ($name =~ s/\s*($balanced_parens)\s*/ /) {
1368		$name_comment .= trim($1);
1369	}
1370	$name =~ s/^[ \"]+|[ \"]+$//g;
1371	$name = trim("$quoted $name");
1372
1373	$address = trim($address);
1374	$address =~ s/^\<|\>$//g;
1375	$comment = trim($comment);
1376
1377	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
1378		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
1379		$name = "\"$name\"";
1380	}
1381
1382	return ($name, $name_comment, $address, $comment);
1383}
1384
1385sub format_email {
1386	my ($name, $name_comment, $address, $comment) = @_;
1387
1388	my $formatted_email;
1389
1390	$name =~ s/^[ \"]+|[ \"]+$//g;
1391	$address = trim($address);
1392	$address =~ s/(?:\.|\,|\")+$//; ##trailing commas, dots or quotes
1393
1394	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
1395		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
1396		$name = "\"$name\"";
1397	}
1398
1399	$name_comment = trim($name_comment);
1400	$name_comment = " $name_comment" if ($name_comment ne "");
1401	$comment = trim($comment);
1402	$comment = " $comment" if ($comment ne "");
1403
1404	if ("$name" eq "") {
1405		$formatted_email = "$address";
1406	} else {
1407		$formatted_email = "$name$name_comment <$address>";
1408	}
1409	$formatted_email .= "$comment";
1410	return $formatted_email;
1411}
1412
1413sub reformat_email {
1414	my ($email) = @_;
1415
1416	my ($email_name, $name_comment, $email_address, $comment) = parse_email($email);
1417	return format_email($email_name, $name_comment, $email_address, $comment);
1418}
1419
1420sub same_email_addresses {
1421	my ($email1, $email2) = @_;
1422
1423	my ($email1_name, $name1_comment, $email1_address, $comment1) = parse_email($email1);
1424	my ($email2_name, $name2_comment, $email2_address, $comment2) = parse_email($email2);
1425
1426	return $email1_name eq $email2_name &&
1427	       $email1_address eq $email2_address &&
1428	       $name1_comment eq $name2_comment &&
1429	       $comment1 eq $comment2;
1430}
1431
1432sub which {
1433	my ($bin) = @_;
1434
1435	foreach my $path (split(/:/, $ENV{PATH})) {
1436		if (-e "$path/$bin") {
1437			return "$path/$bin";
1438		}
1439	}
1440
1441	return "";
1442}
1443
1444sub which_conf {
1445	my ($conf) = @_;
1446
1447	foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
1448		if (-e "$path/$conf") {
1449			return "$path/$conf";
1450		}
1451	}
1452
1453	return "";
1454}
1455
1456sub expand_tabs {
1457	my ($str) = @_;
1458
1459	my $res = '';
1460	my $n = 0;
1461	for my $c (split(//, $str)) {
1462		if ($c eq "\t") {
1463			$res .= ' ';
1464			$n++;
1465			for (; ($n % $tabsize) != 0; $n++) {
1466				$res .= ' ';
1467			}
1468			next;
1469		}
1470		$res .= $c;
1471		$n++;
1472	}
1473
1474	return $res;
1475}
1476sub copy_spacing {
1477	(my $res = shift) =~ tr/\t/ /c;
1478	return $res;
1479}
1480
1481sub line_stats {
1482	my ($line) = @_;
1483
1484	# Drop the diff line leader and expand tabs
1485	$line =~ s/^.//;
1486	$line = expand_tabs($line);
1487
1488	# Pick the indent from the front of the line.
1489	my ($white) = ($line =~ /^(\s*)/);
1490
1491	return (length($line), length($white));
1492}
1493
1494my $sanitise_quote = '';
1495
1496sub sanitise_line_reset {
1497	my ($in_comment) = @_;
1498
1499	if ($in_comment) {
1500		$sanitise_quote = '*/';
1501	} else {
1502		$sanitise_quote = '';
1503	}
1504}
1505sub sanitise_line {
1506	my ($line) = @_;
1507
1508	my $res = '';
1509	my $l = '';
1510
1511	my $qlen = 0;
1512	my $off = 0;
1513	my $c;
1514
1515	# Always copy over the diff marker.
1516	$res = substr($line, 0, 1);
1517
1518	for ($off = 1; $off < length($line); $off++) {
1519		$c = substr($line, $off, 1);
1520
1521		# Comments we are whacking completely including the begin
1522		# and end, all to $;.
1523		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
1524			$sanitise_quote = '*/';
1525
1526			substr($res, $off, 2, "$;$;");
1527			$off++;
1528			next;
1529		}
1530		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
1531			$sanitise_quote = '';
1532			substr($res, $off, 2, "$;$;");
1533			$off++;
1534			next;
1535		}
1536		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
1537			$sanitise_quote = '//';
1538
1539			substr($res, $off, 2, $sanitise_quote);
1540			$off++;
1541			next;
1542		}
1543
1544		# A \ in a string means ignore the next character.
1545		if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
1546		    $c eq "\\") {
1547			substr($res, $off, 2, 'XX');
1548			$off++;
1549			next;
1550		}
1551		# Regular quotes.
1552		if ($c eq "'" || $c eq '"') {
1553			if ($sanitise_quote eq '') {
1554				$sanitise_quote = $c;
1555
1556				substr($res, $off, 1, $c);
1557				next;
1558			} elsif ($sanitise_quote eq $c) {
1559				$sanitise_quote = '';
1560			}
1561		}
1562
1563		#print "c<$c> SQ<$sanitise_quote>\n";
1564		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
1565			substr($res, $off, 1, $;);
1566		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
1567			substr($res, $off, 1, $;);
1568		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
1569			substr($res, $off, 1, 'X');
1570		} else {
1571			substr($res, $off, 1, $c);
1572		}
1573	}
1574
1575	if ($sanitise_quote eq '//') {
1576		$sanitise_quote = '';
1577	}
1578
1579	# The pathname on a #include may be surrounded by '<' and '>'.
1580	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
1581		my $clean = 'X' x length($1);
1582		$res =~ s@\<.*\>@<$clean>@;
1583
1584	# The whole of a #error is a string.
1585	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
1586		my $clean = 'X' x length($1);
1587		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
1588	}
1589
1590	if ($allow_c99_comments && $res =~ m@(//.*$)@) {
1591		my $match = $1;
1592		$res =~ s/\Q$match\E/"$;" x length($match)/e;
1593	}
1594
1595	return $res;
1596}
1597
1598sub get_quoted_string {
1599	my ($line, $rawline) = @_;
1600
1601	return "" if (!defined($line) || !defined($rawline));
1602	return "" if ($line !~ m/($String)/g);
1603	return substr($rawline, $-[0], $+[0] - $-[0]);
1604}
1605
1606sub ctx_statement_block {
1607	my ($linenr, $remain, $off) = @_;
1608	my $line = $linenr - 1;
1609	my $blk = '';
1610	my $soff = $off;
1611	my $coff = $off - 1;
1612	my $coff_set = 0;
1613
1614	my $loff = 0;
1615
1616	my $type = '';
1617	my $level = 0;
1618	my @stack = ();
1619	my $p;
1620	my $c;
1621	my $len = 0;
1622
1623	my $remainder;
1624	while (1) {
1625		@stack = (['', 0]) if ($#stack == -1);
1626
1627		#warn "CSB: blk<$blk> remain<$remain>\n";
1628		# If we are about to drop off the end, pull in more
1629		# context.
1630		if ($off >= $len) {
1631			for (; $remain > 0; $line++) {
1632				last if (!defined $lines[$line]);
1633				next if ($lines[$line] =~ /^-/);
1634				$remain--;
1635				$loff = $len;
1636				$blk .= $lines[$line] . "\n";
1637				$len = length($blk);
1638				$line++;
1639				last;
1640			}
1641			# Bail if there is no further context.
1642			#warn "CSB: blk<$blk> off<$off> len<$len>\n";
1643			if ($off >= $len) {
1644				last;
1645			}
1646			if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
1647				$level++;
1648				$type = '#';
1649			}
1650		}
1651		$p = $c;
1652		$c = substr($blk, $off, 1);
1653		$remainder = substr($blk, $off);
1654
1655		#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
1656
1657		# Handle nested #if/#else.
1658		if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
1659			push(@stack, [ $type, $level ]);
1660		} elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
1661			($type, $level) = @{$stack[$#stack - 1]};
1662		} elsif ($remainder =~ /^#\s*endif\b/) {
1663			($type, $level) = @{pop(@stack)};
1664		}
1665
1666		# Statement ends at the ';' or a close '}' at the
1667		# outermost level.
1668		if ($level == 0 && $c eq ';') {
1669			last;
1670		}
1671
1672		# An else is really a conditional as long as its not else if
1673		if ($level == 0 && $coff_set == 0 &&
1674				(!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
1675				$remainder =~ /^(else)(?:\s|{)/ &&
1676				$remainder !~ /^else\s+if\b/) {
1677			$coff = $off + length($1) - 1;
1678			$coff_set = 1;
1679			#warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
1680			#warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
1681		}
1682
1683		if (($type eq '' || $type eq '(') && $c eq '(') {
1684			$level++;
1685			$type = '(';
1686		}
1687		if ($type eq '(' && $c eq ')') {
1688			$level--;
1689			$type = ($level != 0)? '(' : '';
1690
1691			if ($level == 0 && $coff < $soff) {
1692				$coff = $off;
1693				$coff_set = 1;
1694				#warn "CSB: mark coff<$coff>\n";
1695			}
1696		}
1697		if (($type eq '' || $type eq '{') && $c eq '{') {
1698			$level++;
1699			$type = '{';
1700		}
1701		if ($type eq '{' && $c eq '}') {
1702			$level--;
1703			$type = ($level != 0)? '{' : '';
1704
1705			if ($level == 0) {
1706				if (substr($blk, $off + 1, 1) eq ';') {
1707					$off++;
1708				}
1709				last;
1710			}
1711		}
1712		# Preprocessor commands end at the newline unless escaped.
1713		if ($type eq '#' && $c eq "\n" && $p ne "\\") {
1714			$level--;
1715			$type = '';
1716			$off++;
1717			last;
1718		}
1719		$off++;
1720	}
1721	# We are truly at the end, so shuffle to the next line.
1722	if ($off == $len) {
1723		$loff = $len + 1;
1724		$line++;
1725		$remain--;
1726	}
1727
1728	my $statement = substr($blk, $soff, $off - $soff + 1);
1729	my $condition = substr($blk, $soff, $coff - $soff + 1);
1730
1731	#warn "STATEMENT<$statement>\n";
1732	#warn "CONDITION<$condition>\n";
1733
1734	#print "coff<$coff> soff<$off> loff<$loff>\n";
1735
1736	return ($statement, $condition,
1737			$line, $remain + 1, $off - $loff + 1, $level);
1738}
1739
1740sub statement_lines {
1741	my ($stmt) = @_;
1742
1743	# Strip the diff line prefixes and rip blank lines at start and end.
1744	$stmt =~ s/(^|\n)./$1/g;
1745	$stmt =~ s/^\s*//;
1746	$stmt =~ s/\s*$//;
1747
1748	my @stmt_lines = ($stmt =~ /\n/g);
1749
1750	return $#stmt_lines + 2;
1751}
1752
1753sub statement_rawlines {
1754	my ($stmt) = @_;
1755
1756	my @stmt_lines = ($stmt =~ /\n/g);
1757
1758	return $#stmt_lines + 2;
1759}
1760
1761sub statement_block_size {
1762	my ($stmt) = @_;
1763
1764	$stmt =~ s/(^|\n)./$1/g;
1765	$stmt =~ s/^\s*{//;
1766	$stmt =~ s/}\s*$//;
1767	$stmt =~ s/^\s*//;
1768	$stmt =~ s/\s*$//;
1769
1770	my @stmt_lines = ($stmt =~ /\n/g);
1771	my @stmt_statements = ($stmt =~ /;/g);
1772
1773	my $stmt_lines = $#stmt_lines + 2;
1774	my $stmt_statements = $#stmt_statements + 1;
1775
1776	if ($stmt_lines > $stmt_statements) {
1777		return $stmt_lines;
1778	} else {
1779		return $stmt_statements;
1780	}
1781}
1782
1783sub ctx_statement_full {
1784	my ($linenr, $remain, $off) = @_;
1785	my ($statement, $condition, $level);
1786
1787	my (@chunks);
1788
1789	# Grab the first conditional/block pair.
1790	($statement, $condition, $linenr, $remain, $off, $level) =
1791				ctx_statement_block($linenr, $remain, $off);
1792	#print "F: c<$condition> s<$statement> remain<$remain>\n";
1793	push(@chunks, [ $condition, $statement ]);
1794	if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
1795		return ($level, $linenr, @chunks);
1796	}
1797
1798	# Pull in the following conditional/block pairs and see if they
1799	# could continue the statement.
1800	for (;;) {
1801		($statement, $condition, $linenr, $remain, $off, $level) =
1802				ctx_statement_block($linenr, $remain, $off);
1803		#print "C: c<$condition> s<$statement> remain<$remain>\n";
1804		last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
1805		#print "C: push\n";
1806		push(@chunks, [ $condition, $statement ]);
1807	}
1808
1809	return ($level, $linenr, @chunks);
1810}
1811
1812sub ctx_block_get {
1813	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
1814	my $line;
1815	my $start = $linenr - 1;
1816	my $blk = '';
1817	my @o;
1818	my @c;
1819	my @res = ();
1820
1821	my $level = 0;
1822	my @stack = ($level);
1823	for ($line = $start; $remain > 0; $line++) {
1824		next if ($rawlines[$line] =~ /^-/);
1825		$remain--;
1826
1827		$blk .= $rawlines[$line];
1828
1829		# Handle nested #if/#else.
1830		if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
1831			push(@stack, $level);
1832		} elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
1833			$level = $stack[$#stack - 1];
1834		} elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
1835			$level = pop(@stack);
1836		}
1837
1838		foreach my $c (split(//, $lines[$line])) {
1839			##print "C<$c>L<$level><$open$close>O<$off>\n";
1840			if ($off > 0) {
1841				$off--;
1842				next;
1843			}
1844
1845			if ($c eq $close && $level > 0) {
1846				$level--;
1847				last if ($level == 0);
1848			} elsif ($c eq $open) {
1849				$level++;
1850			}
1851		}
1852
1853		if (!$outer || $level <= 1) {
1854			push(@res, $rawlines[$line]);
1855		}
1856
1857		last if ($level == 0);
1858	}
1859
1860	return ($level, @res);
1861}
1862sub ctx_block_outer {
1863	my ($linenr, $remain) = @_;
1864
1865	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
1866	return @r;
1867}
1868sub ctx_block {
1869	my ($linenr, $remain) = @_;
1870
1871	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1872	return @r;
1873}
1874sub ctx_statement {
1875	my ($linenr, $remain, $off) = @_;
1876
1877	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1878	return @r;
1879}
1880sub ctx_block_level {
1881	my ($linenr, $remain) = @_;
1882
1883	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1884}
1885sub ctx_statement_level {
1886	my ($linenr, $remain, $off) = @_;
1887
1888	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1889}
1890
1891sub ctx_locate_comment {
1892	my ($first_line, $end_line) = @_;
1893
1894	# If c99 comment on the current line, or the line before or after
1895	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@^\+.*(//.*$)@);
1896	return $current_comment if (defined $current_comment);
1897	($current_comment) = ($rawlines[$end_line - 2] =~ m@^[\+ ].*(//.*$)@);
1898	return $current_comment if (defined $current_comment);
1899	($current_comment) = ($rawlines[$end_line] =~ m@^[\+ ].*(//.*$)@);
1900	return $current_comment if (defined $current_comment);
1901
1902	# Catch a comment on the end of the line itself.
1903	($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
1904	return $current_comment if (defined $current_comment);
1905
1906	# Look through the context and try and figure out if there is a
1907	# comment.
1908	my $in_comment = 0;
1909	$current_comment = '';
1910	for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
1911		my $line = $rawlines[$linenr - 1];
1912		#warn "           $line\n";
1913		if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
1914			$in_comment = 1;
1915		}
1916		if ($line =~ m@/\*@) {
1917			$in_comment = 1;
1918		}
1919		if (!$in_comment && $current_comment ne '') {
1920			$current_comment = '';
1921		}
1922		$current_comment .= $line . "\n" if ($in_comment);
1923		if ($line =~ m@\*/@) {
1924			$in_comment = 0;
1925		}
1926	}
1927
1928	chomp($current_comment);
1929	return($current_comment);
1930}
1931sub ctx_has_comment {
1932	my ($first_line, $end_line) = @_;
1933	my $cmt = ctx_locate_comment($first_line, $end_line);
1934
1935	##print "LINE: $rawlines[$end_line - 1 ]\n";
1936	##print "CMMT: $cmt\n";
1937
1938	return ($cmt ne '');
1939}
1940
1941sub raw_line {
1942	my ($linenr, $cnt) = @_;
1943
1944	my $offset = $linenr - 1;
1945	$cnt++;
1946
1947	my $line;
1948	while ($cnt) {
1949		$line = $rawlines[$offset++];
1950		next if (defined($line) && $line =~ /^-/);
1951		$cnt--;
1952	}
1953
1954	return $line;
1955}
1956
1957sub get_stat_real {
1958	my ($linenr, $lc) = @_;
1959
1960	my $stat_real = raw_line($linenr, 0);
1961	for (my $count = $linenr + 1; $count <= $lc; $count++) {
1962		$stat_real = $stat_real . "\n" . raw_line($count, 0);
1963	}
1964
1965	return $stat_real;
1966}
1967
1968sub get_stat_here {
1969	my ($linenr, $cnt, $here) = @_;
1970
1971	my $herectx = $here . "\n";
1972	for (my $n = 0; $n < $cnt; $n++) {
1973		$herectx .= raw_line($linenr, $n) . "\n";
1974	}
1975
1976	return $herectx;
1977}
1978
1979sub cat_vet {
1980	my ($vet) = @_;
1981	my ($res, $coded);
1982
1983	$res = '';
1984	while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
1985		$res .= $1;
1986		if ($2 ne '') {
1987			$coded = sprintf("^%c", unpack('C', $2) + 64);
1988			$res .= $coded;
1989		}
1990	}
1991	$res =~ s/$/\$/;
1992
1993	return $res;
1994}
1995
1996my $av_preprocessor = 0;
1997my $av_pending;
1998my @av_paren_type;
1999my $av_pend_colon;
2000
2001sub annotate_reset {
2002	$av_preprocessor = 0;
2003	$av_pending = '_';
2004	@av_paren_type = ('E');
2005	$av_pend_colon = 'O';
2006}
2007
2008sub annotate_values {
2009	my ($stream, $type) = @_;
2010
2011	my $res;
2012	my $var = '_' x length($stream);
2013	my $cur = $stream;
2014
2015	print "$stream\n" if ($dbg_values > 1);
2016
2017	while (length($cur)) {
2018		@av_paren_type = ('E') if ($#av_paren_type < 0);
2019		print " <" . join('', @av_paren_type) .
2020				"> <$type> <$av_pending>" if ($dbg_values > 1);
2021		if ($cur =~ /^(\s+)/o) {
2022			print "WS($1)\n" if ($dbg_values > 1);
2023			if ($1 =~ /\n/ && $av_preprocessor) {
2024				$type = pop(@av_paren_type);
2025				$av_preprocessor = 0;
2026			}
2027
2028		} elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
2029			print "CAST($1)\n" if ($dbg_values > 1);
2030			push(@av_paren_type, $type);
2031			$type = 'c';
2032
2033		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
2034			print "DECLARE($1)\n" if ($dbg_values > 1);
2035			$type = 'T';
2036
2037		} elsif ($cur =~ /^($Modifier)\s*/) {
2038			print "MODIFIER($1)\n" if ($dbg_values > 1);
2039			$type = 'T';
2040
2041		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
2042			print "DEFINE($1,$2)\n" if ($dbg_values > 1);
2043			$av_preprocessor = 1;
2044			push(@av_paren_type, $type);
2045			if ($2 ne '') {
2046				$av_pending = 'N';
2047			}
2048			$type = 'E';
2049
2050		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
2051			print "UNDEF($1)\n" if ($dbg_values > 1);
2052			$av_preprocessor = 1;
2053			push(@av_paren_type, $type);
2054
2055		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
2056			print "PRE_START($1)\n" if ($dbg_values > 1);
2057			$av_preprocessor = 1;
2058
2059			push(@av_paren_type, $type);
2060			push(@av_paren_type, $type);
2061			$type = 'E';
2062
2063		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
2064			print "PRE_RESTART($1)\n" if ($dbg_values > 1);
2065			$av_preprocessor = 1;
2066
2067			push(@av_paren_type, $av_paren_type[$#av_paren_type]);
2068
2069			$type = 'E';
2070
2071		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
2072			print "PRE_END($1)\n" if ($dbg_values > 1);
2073
2074			$av_preprocessor = 1;
2075
2076			# Assume all arms of the conditional end as this
2077			# one does, and continue as if the #endif was not here.
2078			pop(@av_paren_type);
2079			push(@av_paren_type, $type);
2080			$type = 'E';
2081
2082		} elsif ($cur =~ /^(\\\n)/o) {
2083			print "PRECONT($1)\n" if ($dbg_values > 1);
2084
2085		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
2086			print "ATTR($1)\n" if ($dbg_values > 1);
2087			$av_pending = $type;
2088			$type = 'N';
2089
2090		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
2091			print "SIZEOF($1)\n" if ($dbg_values > 1);
2092			if (defined $2) {
2093				$av_pending = 'V';
2094			}
2095			$type = 'N';
2096
2097		} elsif ($cur =~ /^(if|while|for)\b/o) {
2098			print "COND($1)\n" if ($dbg_values > 1);
2099			$av_pending = 'E';
2100			$type = 'N';
2101
2102		} elsif ($cur =~/^(case)/o) {
2103			print "CASE($1)\n" if ($dbg_values > 1);
2104			$av_pend_colon = 'C';
2105			$type = 'N';
2106
2107		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
2108			print "KEYWORD($1)\n" if ($dbg_values > 1);
2109			$type = 'N';
2110
2111		} elsif ($cur =~ /^(\()/o) {
2112			print "PAREN('$1')\n" if ($dbg_values > 1);
2113			push(@av_paren_type, $av_pending);
2114			$av_pending = '_';
2115			$type = 'N';
2116
2117		} elsif ($cur =~ /^(\))/o) {
2118			my $new_type = pop(@av_paren_type);
2119			if ($new_type ne '_') {
2120				$type = $new_type;
2121				print "PAREN('$1') -> $type\n"
2122							if ($dbg_values > 1);
2123			} else {
2124				print "PAREN('$1')\n" if ($dbg_values > 1);
2125			}
2126
2127		} elsif ($cur =~ /^($Ident)\s*\(/o) {
2128			print "FUNC($1)\n" if ($dbg_values > 1);
2129			$type = 'V';
2130			$av_pending = 'V';
2131
2132		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
2133			if (defined $2 && $type eq 'C' || $type eq 'T') {
2134				$av_pend_colon = 'B';
2135			} elsif ($type eq 'E') {
2136				$av_pend_colon = 'L';
2137			}
2138			print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
2139			$type = 'V';
2140
2141		} elsif ($cur =~ /^($Ident|$Constant)/o) {
2142			print "IDENT($1)\n" if ($dbg_values > 1);
2143			$type = 'V';
2144
2145		} elsif ($cur =~ /^($Assignment)/o) {
2146			print "ASSIGN($1)\n" if ($dbg_values > 1);
2147			$type = 'N';
2148
2149		} elsif ($cur =~/^(;|{|})/) {
2150			print "END($1)\n" if ($dbg_values > 1);
2151			$type = 'E';
2152			$av_pend_colon = 'O';
2153
2154		} elsif ($cur =~/^(,)/) {
2155			print "COMMA($1)\n" if ($dbg_values > 1);
2156			$type = 'C';
2157
2158		} elsif ($cur =~ /^(\?)/o) {
2159			print "QUESTION($1)\n" if ($dbg_values > 1);
2160			$type = 'N';
2161
2162		} elsif ($cur =~ /^(:)/o) {
2163			print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
2164
2165			substr($var, length($res), 1, $av_pend_colon);
2166			if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
2167				$type = 'E';
2168			} else {
2169				$type = 'N';
2170			}
2171			$av_pend_colon = 'O';
2172
2173		} elsif ($cur =~ /^(\[)/o) {
2174			print "CLOSE($1)\n" if ($dbg_values > 1);
2175			$type = 'N';
2176
2177		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
2178			my $variant;
2179
2180			print "OPV($1)\n" if ($dbg_values > 1);
2181			if ($type eq 'V') {
2182				$variant = 'B';
2183			} else {
2184				$variant = 'U';
2185			}
2186
2187			substr($var, length($res), 1, $variant);
2188			$type = 'N';
2189
2190		} elsif ($cur =~ /^($Operators)/o) {
2191			print "OP($1)\n" if ($dbg_values > 1);
2192			if ($1 ne '++' && $1 ne '--') {
2193				$type = 'N';
2194			}
2195
2196		} elsif ($cur =~ /(^.)/o) {
2197			print "C($1)\n" if ($dbg_values > 1);
2198		}
2199		if (defined $1) {
2200			$cur = substr($cur, length($1));
2201			$res .= $type x length($1);
2202		}
2203	}
2204
2205	return ($res, $var);
2206}
2207
2208sub possible {
2209	my ($possible, $line) = @_;
2210	my $notPermitted = qr{(?:
2211		^(?:
2212			$Modifier|
2213			$Storage|
2214			$Type|
2215			DEFINE_\S+
2216		)$|
2217		^(?:
2218			goto|
2219			return|
2220			case|
2221			else|
2222			asm|__asm__|
2223			do|
2224			\#|
2225			\#\#|
2226		)(?:\s|$)|
2227		^(?:typedef|struct|enum)\b
2228	    )}x;
2229	warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
2230	if ($possible !~ $notPermitted) {
2231		# Check for modifiers.
2232		$possible =~ s/\s*$Storage\s*//g;
2233		$possible =~ s/\s*$Sparse\s*//g;
2234		if ($possible =~ /^\s*$/) {
2235
2236		} elsif ($possible =~ /\s/) {
2237			$possible =~ s/\s*$Type\s*//g;
2238			for my $modifier (split(' ', $possible)) {
2239				if ($modifier !~ $notPermitted) {
2240					warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
2241					push(@modifierListFile, $modifier);
2242				}
2243			}
2244
2245		} else {
2246			warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
2247			push(@typeListFile, $possible);
2248		}
2249		build_types();
2250	} else {
2251		warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
2252	}
2253}
2254
2255my $prefix = '';
2256
2257sub show_type {
2258	my ($type) = @_;
2259
2260	$type =~ tr/[a-z]/[A-Z]/;
2261
2262	return defined $use_type{$type} if (scalar keys %use_type > 0);
2263
2264	return !defined $ignore_type{$type};
2265}
2266
2267sub report {
2268	my ($level, $type, $msg) = @_;
2269
2270	if (!show_type($type) ||
2271	    (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
2272		return 0;
2273	}
2274	my $output = '';
2275	if ($color) {
2276		if ($level eq 'ERROR') {
2277			$output .= RED;
2278		} elsif ($level eq 'WARNING') {
2279			$output .= YELLOW;
2280		} else {
2281			$output .= GREEN;
2282		}
2283	}
2284	$output .= $prefix . $level . ':';
2285	if ($show_types) {
2286		$output .= BLUE if ($color);
2287		$output .= "$type:";
2288	}
2289	$output .= RESET if ($color);
2290	$output .= ' ' . $msg . "\n";
2291
2292	if ($showfile) {
2293		my @lines = split("\n", $output, -1);
2294		splice(@lines, 1, 1);
2295		$output = join("\n", @lines);
2296	}
2297
2298	if ($terse) {
2299		$output = (split('\n', $output))[0] . "\n";
2300	}
2301
2302	if ($verbose && exists($verbose_messages{$type}) &&
2303	    !exists($verbose_emitted{$type})) {
2304		$output .= $verbose_messages{$type} . "\n\n";
2305		$verbose_emitted{$type} = 1;
2306	}
2307
2308	push(our @report, $output);
2309
2310	return 1;
2311}
2312
2313sub report_dump {
2314	our @report;
2315}
2316
2317sub fixup_current_range {
2318	my ($lineRef, $offset, $length) = @_;
2319
2320	if ($$lineRef =~ /^\@\@ -\d+,\d+ \+(\d+),(\d+) \@\@/) {
2321		my $o = $1;
2322		my $l = $2;
2323		my $no = $o + $offset;
2324		my $nl = $l + $length;
2325		$$lineRef =~ s/\+$o,$l \@\@/\+$no,$nl \@\@/;
2326	}
2327}
2328
2329sub fix_inserted_deleted_lines {
2330	my ($linesRef, $insertedRef, $deletedRef) = @_;
2331
2332	my $range_last_linenr = 0;
2333	my $delta_offset = 0;
2334
2335	my $old_linenr = 0;
2336	my $new_linenr = 0;
2337
2338	my $next_insert = 0;
2339	my $next_delete = 0;
2340
2341	my @lines = ();
2342
2343	my $inserted = @{$insertedRef}[$next_insert++];
2344	my $deleted = @{$deletedRef}[$next_delete++];
2345
2346	foreach my $old_line (@{$linesRef}) {
2347		my $save_line = 1;
2348		my $line = $old_line;	#don't modify the array
2349		if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) {	#new filename
2350			$delta_offset = 0;
2351		} elsif ($line =~ /^\@\@ -\d+,\d+ \+\d+,\d+ \@\@/) {	#new hunk
2352			$range_last_linenr = $new_linenr;
2353			fixup_current_range(\$line, $delta_offset, 0);
2354		}
2355
2356		while (defined($deleted) && ${$deleted}{'LINENR'} == $old_linenr) {
2357			$deleted = @{$deletedRef}[$next_delete++];
2358			$save_line = 0;
2359			fixup_current_range(\$lines[$range_last_linenr], $delta_offset--, -1);
2360		}
2361
2362		while (defined($inserted) && ${$inserted}{'LINENR'} == $old_linenr) {
2363			push(@lines, ${$inserted}{'LINE'});
2364			$inserted = @{$insertedRef}[$next_insert++];
2365			$new_linenr++;
2366			fixup_current_range(\$lines[$range_last_linenr], $delta_offset++, 1);
2367		}
2368
2369		if ($save_line) {
2370			push(@lines, $line);
2371			$new_linenr++;
2372		}
2373
2374		$old_linenr++;
2375	}
2376
2377	return @lines;
2378}
2379
2380sub fix_insert_line {
2381	my ($linenr, $line) = @_;
2382
2383	my $inserted = {
2384		LINENR => $linenr,
2385		LINE => $line,
2386	};
2387	push(@fixed_inserted, $inserted);
2388}
2389
2390sub fix_delete_line {
2391	my ($linenr, $line) = @_;
2392
2393	my $deleted = {
2394		LINENR => $linenr,
2395		LINE => $line,
2396	};
2397
2398	push(@fixed_deleted, $deleted);
2399}
2400
2401sub ERROR {
2402	my ($type, $msg) = @_;
2403
2404	if (report("ERROR", $type, $msg)) {
2405		our $clean = 0;
2406		our $cnt_error++;
2407		return 1;
2408	}
2409	return 0;
2410}
2411sub WARN {
2412	my ($type, $msg) = @_;
2413
2414	if (report("WARNING", $type, $msg)) {
2415		our $clean = 0;
2416		our $cnt_warn++;
2417		return 1;
2418	}
2419	return 0;
2420}
2421sub CHK {
2422	my ($type, $msg) = @_;
2423
2424	if ($check && report("CHECK", $type, $msg)) {
2425		our $clean = 0;
2426		our $cnt_chk++;
2427		return 1;
2428	}
2429	return 0;
2430}
2431
2432sub check_absolute_file {
2433	my ($absolute, $herecurr) = @_;
2434	my $file = $absolute;
2435
2436	##print "absolute<$absolute>\n";
2437
2438	# See if any suffix of this path is a path within the tree.
2439	while ($file =~ s@^[^/]*/@@) {
2440		if (-f "$root/$file") {
2441			##print "file<$file>\n";
2442			last;
2443		}
2444	}
2445	if (! -f _)  {
2446		return 0;
2447	}
2448
2449	# It is, so see if the prefix is acceptable.
2450	my $prefix = $absolute;
2451	substr($prefix, -length($file)) = '';
2452
2453	##print "prefix<$prefix>\n";
2454	if ($prefix ne ".../") {
2455		WARN("USE_RELATIVE_PATH",
2456		     "use relative pathname instead of absolute in changelog text\n" . $herecurr);
2457	}
2458}
2459
2460sub trim {
2461	my ($string) = @_;
2462
2463	$string =~ s/^\s+|\s+$//g;
2464
2465	return $string;
2466}
2467
2468sub ltrim {
2469	my ($string) = @_;
2470
2471	$string =~ s/^\s+//;
2472
2473	return $string;
2474}
2475
2476sub rtrim {
2477	my ($string) = @_;
2478
2479	$string =~ s/\s+$//;
2480
2481	return $string;
2482}
2483
2484sub string_find_replace {
2485	my ($string, $find, $replace) = @_;
2486
2487	$string =~ s/$find/$replace/g;
2488
2489	return $string;
2490}
2491
2492sub tabify {
2493	my ($leading) = @_;
2494
2495	my $source_indent = $tabsize;
2496	my $max_spaces_before_tab = $source_indent - 1;
2497	my $spaces_to_tab = " " x $source_indent;
2498
2499	#convert leading spaces to tabs
2500	1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
2501	#Remove spaces before a tab
2502	1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
2503
2504	return "$leading";
2505}
2506
2507sub pos_last_openparen {
2508	my ($line) = @_;
2509
2510	my $pos = 0;
2511
2512	my $opens = $line =~ tr/\(/\(/;
2513	my $closes = $line =~ tr/\)/\)/;
2514
2515	my $last_openparen = 0;
2516
2517	if (($opens == 0) || ($closes >= $opens)) {
2518		return -1;
2519	}
2520
2521	my $len = length($line);
2522
2523	for ($pos = 0; $pos < $len; $pos++) {
2524		my $string = substr($line, $pos);
2525		if ($string =~ /^($FuncArg|$balanced_parens)/) {
2526			$pos += length($1) - 1;
2527		} elsif (substr($line, $pos, 1) eq '(') {
2528			$last_openparen = $pos;
2529		} elsif (index($string, '(') == -1) {
2530			last;
2531		}
2532	}
2533
2534	return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
2535}
2536
2537sub get_raw_comment {
2538	my ($line, $rawline) = @_;
2539	my $comment = '';
2540
2541	for my $i (0 .. (length($line) - 1)) {
2542		if (substr($line, $i, 1) eq "$;") {
2543			$comment .= substr($rawline, $i, 1);
2544		}
2545	}
2546
2547	return $comment;
2548}
2549
2550sub exclude_global_initialisers {
2551	my ($realfile) = @_;
2552
2553	# Do not check for BPF programs (tools/testing/selftests/bpf/progs/*.c, samples/bpf/*_kern.c, *.bpf.c).
2554	return $realfile =~ m@^tools/testing/selftests/bpf/progs/.*\.c$@ ||
2555		$realfile =~ m@^samples/bpf/.*_kern\.c$@ ||
2556		$realfile =~ m@/bpf/.*\.bpf\.c$@;
2557}
2558
2559sub process {
2560	my $filename = shift;
2561
2562	my $linenr=0;
2563	my $prevline="";
2564	my $prevrawline="";
2565	my $stashline="";
2566	my $stashrawline="";
2567
2568	my $length;
2569	my $indent;
2570	my $previndent=0;
2571	my $stashindent=0;
2572
2573	our $clean = 1;
2574	my $signoff = 0;
2575	my $author = '';
2576	my $authorsignoff = 0;
2577	my $author_sob = '';
2578	my $is_patch = 0;
2579	my $is_binding_patch = -1;
2580	my $in_header_lines = $file ? 0 : 1;
2581	my $in_commit_log = 0;		#Scanning lines before patch
2582	my $has_patch_separator = 0;	#Found a --- line
2583	my $has_commit_log = 0;		#Encountered lines before patch
2584	my $commit_log_lines = 0;	#Number of commit log lines
2585	my $commit_log_possible_stack_dump = 0;
2586	my $commit_log_long_line = 0;
2587	my $commit_log_has_diff = 0;
2588	my $reported_maintainer_file = 0;
2589	my $non_utf8_charset = 0;
2590
2591	my $last_git_commit_id_linenr = -1;
2592
2593	my $last_blank_line = 0;
2594	my $last_coalesced_string_linenr = -1;
2595
2596	our @report = ();
2597	our $cnt_lines = 0;
2598	our $cnt_error = 0;
2599	our $cnt_warn = 0;
2600	our $cnt_chk = 0;
2601
2602	# Trace the real file/line as we go.
2603	my $realfile = '';
2604	my $realline = 0;
2605	my $realcnt = 0;
2606	my $here = '';
2607	my $context_function;		#undef'd unless there's a known function
2608	my $in_comment = 0;
2609	my $comment_edge = 0;
2610	my $first_line = 0;
2611	my $p1_prefix = '';
2612
2613	my $prev_values = 'E';
2614
2615	# suppression flags
2616	my %suppress_ifbraces;
2617	my %suppress_whiletrailers;
2618	my %suppress_export;
2619	my $suppress_statement = 0;
2620
2621	my %signatures = ();
2622
2623	# Pre-scan the patch sanitizing the lines.
2624	# Pre-scan the patch looking for any __setup documentation.
2625	#
2626	my @setup_docs = ();
2627	my $setup_docs = 0;
2628
2629	my $camelcase_file_seeded = 0;
2630
2631	my $checklicenseline = 1;
2632
2633	sanitise_line_reset();
2634	my $line;
2635	foreach my $rawline (@rawlines) {
2636		$linenr++;
2637		$line = $rawline;
2638
2639		push(@fixed, $rawline) if ($fix);
2640
2641		if ($rawline=~/^\+\+\+\s+(\S+)/) {
2642			$setup_docs = 0;
2643			if ($1 =~ m@Documentation/admin-guide/kernel-parameters.txt$@) {
2644				$setup_docs = 1;
2645			}
2646			#next;
2647		}
2648		if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
2649			$realline=$1-1;
2650			if (defined $2) {
2651				$realcnt=$3+1;
2652			} else {
2653				$realcnt=1+1;
2654			}
2655			$in_comment = 0;
2656
2657			# Guestimate if this is a continuing comment.  Run
2658			# the context looking for a comment "edge".  If this
2659			# edge is a close comment then we must be in a comment
2660			# at context start.
2661			my $edge;
2662			my $cnt = $realcnt;
2663			for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
2664				next if (defined $rawlines[$ln - 1] &&
2665					 $rawlines[$ln - 1] =~ /^-/);
2666				$cnt--;
2667				#print "RAW<$rawlines[$ln - 1]>\n";
2668				last if (!defined $rawlines[$ln - 1]);
2669				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
2670				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
2671					($edge) = $1;
2672					last;
2673				}
2674			}
2675			if (defined $edge && $edge eq '*/') {
2676				$in_comment = 1;
2677			}
2678
2679			# Guestimate if this is a continuing comment.  If this
2680			# is the start of a diff block and this line starts
2681			# ' *' then it is very likely a comment.
2682			if (!defined $edge &&
2683			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
2684			{
2685				$in_comment = 1;
2686			}
2687
2688			##print "COMMENT:$in_comment edge<$edge> $rawline\n";
2689			sanitise_line_reset($in_comment);
2690
2691		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
2692			# Standardise the strings and chars within the input to
2693			# simplify matching -- only bother with positive lines.
2694			$line = sanitise_line($rawline);
2695		}
2696		push(@lines, $line);
2697
2698		if ($realcnt > 1) {
2699			$realcnt-- if ($line =~ /^(?:\+| |$)/);
2700		} else {
2701			$realcnt = 0;
2702		}
2703
2704		#print "==>$rawline\n";
2705		#print "-->$line\n";
2706
2707		if ($setup_docs && $line =~ /^\+/) {
2708			push(@setup_docs, $line);
2709		}
2710	}
2711
2712	$prefix = '';
2713
2714	$realcnt = 0;
2715	$linenr = 0;
2716	$fixlinenr = -1;
2717	foreach my $line (@lines) {
2718		$linenr++;
2719		$fixlinenr++;
2720		my $sline = $line;	#copy of $line
2721		$sline =~ s/$;/ /g;	#with comments as spaces
2722
2723		my $rawline = $rawlines[$linenr - 1];
2724		my $raw_comment = get_raw_comment($line, $rawline);
2725
2726# check if it's a mode change, rename or start of a patch
2727		if (!$in_commit_log &&
2728		    ($line =~ /^ mode change [0-7]+ => [0-7]+ \S+\s*$/ ||
2729		    ($line =~ /^rename (?:from|to) \S+\s*$/ ||
2730		     $line =~ /^diff --git a\/[\w\/\.\_\-]+ b\/\S+\s*$/))) {
2731			$is_patch = 1;
2732		}
2733
2734#extract the line range in the file after the patch is applied
2735		if (!$in_commit_log &&
2736		    $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) {
2737			my $context = $4;
2738			$is_patch = 1;
2739			$first_line = $linenr + 1;
2740			$realline=$1-1;
2741			if (defined $2) {
2742				$realcnt=$3+1;
2743			} else {
2744				$realcnt=1+1;
2745			}
2746			annotate_reset();
2747			$prev_values = 'E';
2748
2749			%suppress_ifbraces = ();
2750			%suppress_whiletrailers = ();
2751			%suppress_export = ();
2752			$suppress_statement = 0;
2753			if ($context =~ /\b(\w+)\s*\(/) {
2754				$context_function = $1;
2755			} else {
2756				undef $context_function;
2757			}
2758			next;
2759
2760# track the line number as we move through the hunk, note that
2761# new versions of GNU diff omit the leading space on completely
2762# blank context lines so we need to count that too.
2763		} elsif ($line =~ /^( |\+|$)/) {
2764			$realline++;
2765			$realcnt-- if ($realcnt != 0);
2766
2767			# Measure the line length and indent.
2768			($length, $indent) = line_stats($rawline);
2769
2770			# Track the previous line.
2771			($prevline, $stashline) = ($stashline, $line);
2772			($previndent, $stashindent) = ($stashindent, $indent);
2773			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
2774
2775			#warn "line<$line>\n";
2776
2777		} elsif ($realcnt == 1) {
2778			$realcnt--;
2779		}
2780
2781		my $hunk_line = ($realcnt != 0);
2782
2783		$here = "#$linenr: " if (!$file);
2784		$here = "#$realline: " if ($file);
2785
2786		my $found_file = 0;
2787		# extract the filename as it passes
2788		if ($line =~ /^diff --git.*?(\S+)$/) {
2789			$realfile = $1;
2790			$realfile =~ s@^([^/]*)/@@ if (!$file);
2791			$in_commit_log = 0;
2792			$found_file = 1;
2793		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
2794			$realfile = $1;
2795			$realfile =~ s@^([^/]*)/@@ if (!$file);
2796			$in_commit_log = 0;
2797
2798			$p1_prefix = $1;
2799			if (!$file && $tree && $p1_prefix ne '' &&
2800			    -e "$root/$p1_prefix") {
2801				WARN("PATCH_PREFIX",
2802				     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
2803			}
2804
2805			if ($realfile =~ m@^include/asm/@) {
2806				ERROR("MODIFIED_INCLUDE_ASM",
2807				      "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
2808			}
2809			$found_file = 1;
2810		}
2811
2812#make up the handle for any error we report on this line
2813		if ($showfile) {
2814			$prefix = "$realfile:$realline: "
2815		} elsif ($emacs) {
2816			if ($file) {
2817				$prefix = "$filename:$realline: ";
2818			} else {
2819				$prefix = "$filename:$linenr: ";
2820			}
2821		}
2822
2823		if ($found_file) {
2824			if (is_maintained_obsolete($realfile)) {
2825				WARN("OBSOLETE",
2826				     "$realfile is marked as 'obsolete' in the MAINTAINERS hierarchy.  No unnecessary modifications please.\n");
2827			}
2828			if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {
2829				$check = 1;
2830			} else {
2831				$check = $check_orig;
2832			}
2833			$checklicenseline = 1;
2834
2835			if ($realfile !~ /^MAINTAINERS/) {
2836				my $last_binding_patch = $is_binding_patch;
2837
2838				$is_binding_patch = () = $realfile =~ m@^(?:Documentation/devicetree/|include/dt-bindings/)@;
2839
2840				if (($last_binding_patch != -1) &&
2841				    ($last_binding_patch ^ $is_binding_patch)) {
2842					WARN("DT_SPLIT_BINDING_PATCH",
2843					     "DT binding docs and includes should be a separate patch. See: Documentation/devicetree/bindings/submitting-patches.rst\n");
2844				}
2845			}
2846
2847			next;
2848		}
2849
2850		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
2851
2852		my $hereline = "$here\n$rawline\n";
2853		my $herecurr = "$here\n$rawline\n";
2854		my $hereprev = "$here\n$prevrawline\n$rawline\n";
2855
2856		$cnt_lines++ if ($realcnt != 0);
2857
2858# Verify the existence of a commit log if appropriate
2859# 2 is used because a $signature is counted in $commit_log_lines
2860		if ($in_commit_log) {
2861			if ($line !~ /^\s*$/) {
2862				$commit_log_lines++;	#could be a $signature
2863			}
2864		} elsif ($has_commit_log && $commit_log_lines < 2) {
2865			WARN("COMMIT_MESSAGE",
2866			     "Missing commit description - Add an appropriate one\n");
2867			$commit_log_lines = 2;	#warn only once
2868		}
2869
2870# Check if the commit log has what seems like a diff which can confuse patch
2871		if ($in_commit_log && !$commit_log_has_diff &&
2872		    (($line =~ m@^\s+diff\b.*a/([\w/]+)@ &&
2873		      $line =~ m@^\s+diff\b.*a/[\w/]+\s+b/$1\b@) ||
2874		     $line =~ m@^\s*(?:\-\-\-\s+a/|\+\+\+\s+b/)@ ||
2875		     $line =~ m/^\s*\@\@ \-\d+,\d+ \+\d+,\d+ \@\@/)) {
2876			ERROR("DIFF_IN_COMMIT_MSG",
2877			      "Avoid using diff content in the commit message - patch(1) might not work\n" . $herecurr);
2878			$commit_log_has_diff = 1;
2879		}
2880
2881# Check for incorrect file permissions
2882		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
2883			my $permhere = $here . "FILE: $realfile\n";
2884			if ($realfile !~ m@scripts/@ &&
2885			    $realfile !~ /\.(py|pl|awk|sh)$/) {
2886				ERROR("EXECUTE_PERMISSIONS",
2887				      "do not set execute permissions for source files\n" . $permhere);
2888			}
2889		}
2890
2891# Check the patch for a From:
2892		if (decode("MIME-Header", $line) =~ /^From:\s*(.*)/) {
2893			$author = $1;
2894			my $curline = $linenr;
2895			while(defined($rawlines[$curline]) && ($rawlines[$curline++] =~ /^[ \t]\s*(.*)/)) {
2896				$author .= $1;
2897			}
2898			$author = encode("utf8", $author) if ($line =~ /=\?utf-8\?/i);
2899			$author =~ s/"//g;
2900			$author = reformat_email($author);
2901		}
2902
2903# Check the patch for a signoff:
2904		if ($line =~ /^\s*signed-off-by:\s*(.*)/i) {
2905			$signoff++;
2906			$in_commit_log = 0;
2907			if ($author ne ''  && $authorsignoff != 1) {
2908				if (same_email_addresses($1, $author)) {
2909					$authorsignoff = 1;
2910				} else {
2911					my $ctx = $1;
2912					my ($email_name, $email_comment, $email_address, $comment1) = parse_email($ctx);
2913					my ($author_name, $author_comment, $author_address, $comment2) = parse_email($author);
2914
2915					if (lc $email_address eq lc $author_address && $email_name eq $author_name) {
2916						$author_sob = $ctx;
2917						$authorsignoff = 2;
2918					} elsif (lc $email_address eq lc $author_address) {
2919						$author_sob = $ctx;
2920						$authorsignoff = 3;
2921					} elsif ($email_name eq $author_name) {
2922						$author_sob = $ctx;
2923						$authorsignoff = 4;
2924
2925						my $address1 = $email_address;
2926						my $address2 = $author_address;
2927
2928						if ($address1 =~ /(\S+)\+\S+(\@.*)/) {
2929							$address1 = "$1$2";
2930						}
2931						if ($address2 =~ /(\S+)\+\S+(\@.*)/) {
2932							$address2 = "$1$2";
2933						}
2934						if ($address1 eq $address2) {
2935							$authorsignoff = 5;
2936						}
2937					}
2938				}
2939			}
2940		}
2941
2942# Check for patch separator
2943		if ($line =~ /^---$/) {
2944			$has_patch_separator = 1;
2945			$in_commit_log = 0;
2946		}
2947
2948# Check if MAINTAINERS is being updated.  If so, there's probably no need to
2949# emit the "does MAINTAINERS need updating?" message on file add/move/delete
2950		if ($line =~ /^\s*MAINTAINERS\s*\|/) {
2951			$reported_maintainer_file = 1;
2952		}
2953
2954# Check signature styles
2955		if (!$in_header_lines &&
2956		    $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
2957			my $space_before = $1;
2958			my $sign_off = $2;
2959			my $space_after = $3;
2960			my $email = $4;
2961			my $ucfirst_sign_off = ucfirst(lc($sign_off));
2962
2963			if ($sign_off !~ /$signature_tags/) {
2964				my $suggested_signature = find_standard_signature($sign_off);
2965				if ($suggested_signature eq "") {
2966					WARN("BAD_SIGN_OFF",
2967					     "Non-standard signature: $sign_off\n" . $herecurr);
2968				} else {
2969					if (WARN("BAD_SIGN_OFF",
2970						 "Non-standard signature: '$sign_off' - perhaps '$suggested_signature'?\n" . $herecurr) &&
2971					    $fix) {
2972						$fixed[$fixlinenr] =~ s/$sign_off/$suggested_signature/;
2973					}
2974				}
2975			}
2976			if (defined $space_before && $space_before ne "") {
2977				if (WARN("BAD_SIGN_OFF",
2978					 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
2979				    $fix) {
2980					$fixed[$fixlinenr] =
2981					    "$ucfirst_sign_off $email";
2982				}
2983			}
2984			if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
2985				if (WARN("BAD_SIGN_OFF",
2986					 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
2987				    $fix) {
2988					$fixed[$fixlinenr] =
2989					    "$ucfirst_sign_off $email";
2990				}
2991
2992			}
2993			if (!defined $space_after || $space_after ne " ") {
2994				if (WARN("BAD_SIGN_OFF",
2995					 "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
2996				    $fix) {
2997					$fixed[$fixlinenr] =
2998					    "$ucfirst_sign_off $email";
2999				}
3000			}
3001
3002			my ($email_name, $name_comment, $email_address, $comment) = parse_email($email);
3003			my $suggested_email = format_email(($email_name, $name_comment, $email_address, $comment));
3004			if ($suggested_email eq "") {
3005				ERROR("BAD_SIGN_OFF",
3006				      "Unrecognized email address: '$email'\n" . $herecurr);
3007			} else {
3008				my $dequoted = $suggested_email;
3009				$dequoted =~ s/^"//;
3010				$dequoted =~ s/" </ </;
3011				# Don't force email to have quotes
3012				# Allow just an angle bracketed address
3013				if (!same_email_addresses($email, $suggested_email)) {
3014					if (WARN("BAD_SIGN_OFF",
3015						 "email address '$email' might be better as '$suggested_email'\n" . $herecurr) &&
3016					    $fix) {
3017						$fixed[$fixlinenr] =~ s/\Q$email\E/$suggested_email/;
3018					}
3019				}
3020
3021				# Address part shouldn't have comments
3022				my $stripped_address = $email_address;
3023				$stripped_address =~ s/\([^\(\)]*\)//g;
3024				if ($email_address ne $stripped_address) {
3025					if (WARN("BAD_SIGN_OFF",
3026						 "address part of email should not have comments: '$email_address'\n" . $herecurr) &&
3027					    $fix) {
3028						$fixed[$fixlinenr] =~ s/\Q$email_address\E/$stripped_address/;
3029					}
3030				}
3031
3032				# Only one name comment should be allowed
3033				my $comment_count = () = $name_comment =~ /\([^\)]+\)/g;
3034				if ($comment_count > 1) {
3035					WARN("BAD_SIGN_OFF",
3036					     "Use a single name comment in email: '$email'\n" . $herecurr);
3037				}
3038
3039
3040				# stable@vger.kernel.org or stable@kernel.org shouldn't
3041				# have an email name. In addition comments should strictly
3042				# begin with a #
3043				if ($email =~ /^.*stable\@(?:vger\.)?kernel\.org/i) {
3044					if (($comment ne "" && $comment !~ /^#.+/) ||
3045					    ($email_name ne "")) {
3046						my $cur_name = $email_name;
3047						my $new_comment = $comment;
3048						$cur_name =~ s/[a-zA-Z\s\-\"]+//g;
3049
3050						# Remove brackets enclosing comment text
3051						# and # from start of comments to get comment text
3052						$new_comment =~ s/^\((.*)\)$/$1/;
3053						$new_comment =~ s/^\[(.*)\]$/$1/;
3054						$new_comment =~ s/^[\s\#]+|\s+$//g;
3055
3056						$new_comment = trim("$new_comment $cur_name") if ($cur_name ne $new_comment);
3057						$new_comment = " # $new_comment" if ($new_comment ne "");
3058						my $new_email = "$email_address$new_comment";
3059
3060						if (WARN("BAD_STABLE_ADDRESS_STYLE",
3061							 "Invalid email format for stable: '$email', prefer '$new_email'\n" . $herecurr) &&
3062						    $fix) {
3063							$fixed[$fixlinenr] =~ s/\Q$email\E/$new_email/;
3064						}
3065					}
3066				} elsif ($comment ne "" && $comment !~ /^(?:#.+|\(.+\))$/) {
3067					my $new_comment = $comment;
3068
3069					# Extract comment text from within brackets or
3070					# c89 style /*...*/ comments
3071					$new_comment =~ s/^\[(.*)\]$/$1/;
3072					$new_comment =~ s/^\/\*(.*)\*\/$/$1/;
3073
3074					$new_comment = trim($new_comment);
3075					$new_comment =~ s/^[^\w]$//; # Single lettered comment with non word character is usually a typo
3076					$new_comment = "($new_comment)" if ($new_comment ne "");
3077					my $new_email = format_email($email_name, $name_comment, $email_address, $new_comment);
3078
3079					if (WARN("BAD_SIGN_OFF",
3080						 "Unexpected content after email: '$email', should be: '$new_email'\n" . $herecurr) &&
3081					    $fix) {
3082						$fixed[$fixlinenr] =~ s/\Q$email\E/$new_email/;
3083					}
3084				}
3085			}
3086
3087# Check for duplicate signatures
3088			my $sig_nospace = $line;
3089			$sig_nospace =~ s/\s//g;
3090			$sig_nospace = lc($sig_nospace);
3091			if (defined $signatures{$sig_nospace}) {
3092				WARN("BAD_SIGN_OFF",
3093				     "Duplicate signature\n" . $herecurr);
3094			} else {
3095				$signatures{$sig_nospace} = 1;
3096			}
3097
3098# Check Co-developed-by: immediately followed by Signed-off-by: with same name and email
3099			if ($sign_off =~ /^co-developed-by:$/i) {
3100				if ($email eq $author) {
3101					WARN("BAD_SIGN_OFF",
3102					      "Co-developed-by: should not be used to attribute nominal patch author '$author'\n" . "$here\n" . $rawline);
3103				}
3104				if (!defined $lines[$linenr]) {
3105					WARN("BAD_SIGN_OFF",
3106					     "Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline);
3107				} elsif ($rawlines[$linenr] !~ /^\s*signed-off-by:\s*(.*)/i) {
3108					WARN("BAD_SIGN_OFF",
3109					     "Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]);
3110				} elsif ($1 ne $email) {
3111					WARN("BAD_SIGN_OFF",
3112					     "Co-developed-by and Signed-off-by: name/email do not match \n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]);
3113				}
3114			}
3115		}
3116
3117# Check email subject for common tools that don't need to be mentioned
3118		if ($in_header_lines &&
3119		    $line =~ /^Subject:.*\b(?:checkpatch|sparse|smatch)\b[^:]/i) {
3120			WARN("EMAIL_SUBJECT",
3121			     "A patch subject line should describe the change not the tool that found it\n" . $herecurr);
3122		}
3123
3124# Check for Gerrit Change-Ids not in any patch context
3125		if ($realfile eq '' && !$has_patch_separator && $line =~ /^\s*change-id:/i) {
3126			if (ERROR("GERRIT_CHANGE_ID",
3127			          "Remove Gerrit Change-Id's before submitting upstream\n" . $herecurr) &&
3128			    $fix) {
3129				fix_delete_line($fixlinenr, $rawline);
3130			}
3131		}
3132
3133# Check if the commit log is in a possible stack dump
3134		if ($in_commit_log && !$commit_log_possible_stack_dump &&
3135		    ($line =~ /^\s*(?:WARNING:|BUG:)/ ||
3136		     $line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ ||
3137					# timestamp
3138		     $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/) ||
3139		     $line =~ /^(?:\s+\w+:\s+[0-9a-fA-F]+){3,3}/ ||
3140		     $line =~ /^\s*\#\d+\s*\[[0-9a-fA-F]+\]\s*\w+ at [0-9a-fA-F]+/) {
3141					# stack dump address styles
3142			$commit_log_possible_stack_dump = 1;
3143		}
3144
3145# Check for line lengths > 75 in commit log, warn once
3146		if ($in_commit_log && !$commit_log_long_line &&
3147		    length($line) > 75 &&
3148		    !($line =~ /^\s*[a-zA-Z0-9_\/\.]+\s+\|\s+\d+/ ||
3149					# file delta changes
3150		      $line =~ /^\s*(?:[\w\.\-]+\/)++[\w\.\-]+:/ ||
3151					# filename then :
3152		      $line =~ /^\s*(?:Fixes:|Link:|$signature_tags)/i ||
3153					# A Fixes: or Link: line or signature tag line
3154		      $commit_log_possible_stack_dump)) {
3155			WARN("COMMIT_LOG_LONG_LINE",
3156			     "Possible unwrapped commit description (prefer a maximum 75 chars per line)\n" . $herecurr);
3157			$commit_log_long_line = 1;
3158		}
3159
3160# Reset possible stack dump if a blank line is found
3161		if ($in_commit_log && $commit_log_possible_stack_dump &&
3162		    $line =~ /^\s*$/) {
3163			$commit_log_possible_stack_dump = 0;
3164		}
3165
3166# Check for lines starting with a #
3167		if ($in_commit_log && $line =~ /^#/) {
3168			if (WARN("COMMIT_COMMENT_SYMBOL",
3169				 "Commit log lines starting with '#' are dropped by git as comments\n" . $herecurr) &&
3170			    $fix) {
3171				$fixed[$fixlinenr] =~ s/^/ /;
3172			}
3173		}
3174
3175# Check for git id commit length and improperly formed commit descriptions
3176# A correctly formed commit description is:
3177#    commit <SHA-1 hash length 12+ chars> ("Complete commit subject")
3178# with the commit subject '("' prefix and '")' suffix
3179# This is a fairly compilicated block as it tests for what appears to be
3180# bare SHA-1 hash with  minimum length of 5.  It also avoids several types of
3181# possible SHA-1 matches.
3182# A commit match can span multiple lines so this block attempts to find a
3183# complete typical commit on a maximum of 3 lines
3184		if ($perl_version_ok &&
3185		    $in_commit_log && !$commit_log_possible_stack_dump &&
3186		    $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink|base-commit):/i &&
3187		    $line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
3188		    (($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
3189		      ($line =~ /\bcommit\s*$/i && defined($rawlines[$linenr]) && $rawlines[$linenr] =~ /^\s*[0-9a-f]{5,}\b/i)) ||
3190		     ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
3191		      $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
3192		      $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {
3193			my $init_char = "c";
3194			my $orig_commit = "";
3195			my $short = 1;
3196			my $long = 0;
3197			my $case = 1;
3198			my $space = 1;
3199			my $id = '0123456789ab';
3200			my $orig_desc = "commit description";
3201			my $description = "";
3202			my $herectx = $herecurr;
3203			my $has_parens = 0;
3204			my $has_quotes = 0;
3205
3206			my $input = $line;
3207			if ($line =~ /(?:\bcommit\s+[0-9a-f]{5,}|\bcommit\s*$)/i) {
3208				for (my $n = 0; $n < 2; $n++) {
3209					if ($input =~ /\bcommit\s+[0-9a-f]{5,}\s*($balanced_parens)/i) {
3210						$orig_desc = $1;
3211						$has_parens = 1;
3212						# Always strip leading/trailing parens then double quotes if existing
3213						$orig_desc = substr($orig_desc, 1, -1);
3214						if ($orig_desc =~ /^".*"$/) {
3215							$orig_desc = substr($orig_desc, 1, -1);
3216							$has_quotes = 1;
3217						}
3218						last;
3219					}
3220					last if ($#lines < $linenr + $n);
3221					$input .= " " . trim($rawlines[$linenr + $n]);
3222					$herectx .= "$rawlines[$linenr + $n]\n";
3223				}
3224				$herectx = $herecurr if (!$has_parens);
3225			}
3226
3227			if ($input =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) {
3228				$init_char = $1;
3229				$orig_commit = lc($2);
3230				$short = 0 if ($input =~ /\bcommit\s+[0-9a-f]{12,40}/i);
3231				$long = 1 if ($input =~ /\bcommit\s+[0-9a-f]{41,}/i);
3232				$space = 0 if ($input =~ /\bcommit [0-9a-f]/i);
3233				$case = 0 if ($input =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/);
3234			} elsif ($input =~ /\b([0-9a-f]{12,40})\b/i) {
3235				$orig_commit = lc($1);
3236			}
3237
3238			($id, $description) = git_commit_info($orig_commit,
3239							      $id, $orig_desc);
3240
3241			if (defined($id) &&
3242			    ($short || $long || $space || $case || ($orig_desc ne $description) || !$has_quotes) &&
3243			    $last_git_commit_id_linenr != $linenr - 1) {
3244				ERROR("GIT_COMMIT_ID",
3245				      "Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herectx);
3246			}
3247			#don't report the next line if this line ends in commit and the sha1 hash is the next line
3248			$last_git_commit_id_linenr = $linenr if ($line =~ /\bcommit\s*$/i);
3249		}
3250
3251# Check for added, moved or deleted files
3252		if (!$reported_maintainer_file && !$in_commit_log &&
3253		    ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
3254		     $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||
3255		     ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&
3256		      (defined($1) || defined($2))))) {
3257			$is_patch = 1;
3258			$reported_maintainer_file = 1;
3259			WARN("FILE_PATH_CHANGES",
3260			     "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);
3261		}
3262
3263# Check for adding new DT bindings not in schema format
3264		if (!$in_commit_log &&
3265		    ($line =~ /^new file mode\s*\d+\s*$/) &&
3266		    ($realfile =~ m@^Documentation/devicetree/bindings/.*\.txt$@)) {
3267			WARN("DT_SCHEMA_BINDING_PATCH",
3268			     "DT bindings should be in DT schema format. See: Documentation/devicetree/bindings/writing-schema.rst\n");
3269		}
3270
3271# Check for wrappage within a valid hunk of the file
3272		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
3273			ERROR("CORRUPTED_PATCH",
3274			      "patch seems to be corrupt (line wrapped?)\n" .
3275				$herecurr) if (!$emitted_corrupt++);
3276		}
3277
3278# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
3279		if (($realfile =~ /^$/ || $line =~ /^\+/) &&
3280		    $rawline !~ m/^$UTF8*$/) {
3281			my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
3282
3283			my $blank = copy_spacing($rawline);
3284			my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
3285			my $hereptr = "$hereline$ptr\n";
3286
3287			CHK("INVALID_UTF8",
3288			    "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
3289		}
3290
3291# Check if it's the start of a commit log
3292# (not a header line and we haven't seen the patch filename)
3293		if ($in_header_lines && $realfile =~ /^$/ &&
3294		    !($rawline =~ /^\s+(?:\S|$)/ ||
3295		      $rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) {
3296			$in_header_lines = 0;
3297			$in_commit_log = 1;
3298			$has_commit_log = 1;
3299		}
3300
3301# Check if there is UTF-8 in a commit log when a mail header has explicitly
3302# declined it, i.e defined some charset where it is missing.
3303		if ($in_header_lines &&
3304		    $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
3305		    $1 !~ /utf-8/i) {
3306			$non_utf8_charset = 1;
3307		}
3308
3309		if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
3310		    $rawline =~ /$NON_ASCII_UTF8/) {
3311			WARN("UTF8_BEFORE_PATCH",
3312			    "8-bit UTF-8 used in possible commit log\n" . $herecurr);
3313		}
3314
3315# Check for absolute kernel paths in commit message
3316		if ($tree && $in_commit_log) {
3317			while ($line =~ m{(?:^|\s)(/\S*)}g) {
3318				my $file = $1;
3319
3320				if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
3321				    check_absolute_file($1, $herecurr)) {
3322					#
3323				} else {
3324					check_absolute_file($file, $herecurr);
3325				}
3326			}
3327		}
3328
3329# Check for various typo / spelling mistakes
3330		if (defined($misspellings) &&
3331		    ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
3332			while ($rawline =~ /(?:^|[^\w\-'`])($misspellings)(?:[^\w\-'`]|$)/gi) {
3333				my $typo = $1;
3334				my $blank = copy_spacing($rawline);
3335				my $ptr = substr($blank, 0, $-[1]) . "^" x length($typo);
3336				my $hereptr = "$hereline$ptr\n";
3337				my $typo_fix = $spelling_fix{lc($typo)};
3338				$typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/);
3339				$typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/);
3340				my $msg_level = \&WARN;
3341				$msg_level = \&CHK if ($file);
3342				if (&{$msg_level}("TYPO_SPELLING",
3343						  "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $hereptr) &&
3344				    $fix) {
3345					$fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
3346				}
3347			}
3348		}
3349
3350# check for invalid commit id
3351		if ($in_commit_log && $line =~ /(^fixes:|\bcommit)\s+([0-9a-f]{6,40})\b/i) {
3352			my $id;
3353			my $description;
3354			($id, $description) = git_commit_info($2, undef, undef);
3355			if (!defined($id)) {
3356				WARN("UNKNOWN_COMMIT_ID",
3357				     "Unknown commit id '$2', maybe rebased or not pulled?\n" . $herecurr);
3358			}
3359		}
3360
3361# check for repeated words separated by a single space
3362# avoid false positive from list command eg, '-rw-r--r-- 1 root root'
3363		if (($rawline =~ /^\+/ || $in_commit_log) &&
3364		    $rawline !~ /[bcCdDlMnpPs\?-][rwxsStT-]{9}/) {
3365			pos($rawline) = 1 if (!$in_commit_log);
3366			while ($rawline =~ /\b($word_pattern) (?=($word_pattern))/g) {
3367
3368				my $first = $1;
3369				my $second = $2;
3370				my $start_pos = $-[1];
3371				my $end_pos = $+[2];
3372				if ($first =~ /(?:struct|union|enum)/) {
3373					pos($rawline) += length($first) + length($second) + 1;
3374					next;
3375				}
3376
3377				next if (lc($first) ne lc($second));
3378				next if ($first eq 'long');
3379
3380				# check for character before and after the word matches
3381				my $start_char = '';
3382				my $end_char = '';
3383				$start_char = substr($rawline, $start_pos - 1, 1) if ($start_pos > ($in_commit_log ? 0 : 1));
3384				$end_char = substr($rawline, $end_pos, 1) if ($end_pos < length($rawline));
3385
3386				next if ($start_char =~ /^\S$/);
3387				next if (index(" \t.,;?!", $end_char) == -1);
3388
3389				# avoid repeating hex occurrences like 'ff ff fe 09 ...'
3390				if ($first =~ /\b[0-9a-f]{2,}\b/i) {
3391					next if (!exists($allow_repeated_words{lc($first)}));
3392				}
3393
3394				if (WARN("REPEATED_WORD",
3395					 "Possible repeated word: '$first'\n" . $herecurr) &&
3396				    $fix) {
3397					$fixed[$fixlinenr] =~ s/\b$first $second\b/$first/;
3398				}
3399			}
3400
3401			# if it's a repeated word on consecutive lines in a comment block
3402			if ($prevline =~ /$;+\s*$/ &&
3403			    $prevrawline =~ /($word_pattern)\s*$/) {
3404				my $last_word = $1;
3405				if ($rawline =~ /^\+\s*\*\s*$last_word /) {
3406					if (WARN("REPEATED_WORD",
3407						 "Possible repeated word: '$last_word'\n" . $hereprev) &&
3408					    $fix) {
3409						$fixed[$fixlinenr] =~ s/(\+\s*\*\s*)$last_word /$1/;
3410					}
3411				}
3412			}
3413		}
3414
3415# ignore non-hunk lines and lines being removed
3416		next if (!$hunk_line || $line =~ /^-/);
3417
3418#trailing whitespace
3419		if ($line =~ /^\+.*\015/) {
3420			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3421			if (ERROR("DOS_LINE_ENDINGS",
3422				  "DOS line endings\n" . $herevet) &&
3423			    $fix) {
3424				$fixed[$fixlinenr] =~ s/[\s\015]+$//;
3425			}
3426		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
3427			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3428			if (ERROR("TRAILING_WHITESPACE",
3429				  "trailing whitespace\n" . $herevet) &&
3430			    $fix) {
3431				$fixed[$fixlinenr] =~ s/\s+$//;
3432			}
3433
3434			$rpt_cleaners = 1;
3435		}
3436
3437# Check for FSF mailing addresses.
3438		if ($rawline =~ /\bwrite to the Free/i ||
3439		    $rawline =~ /\b675\s+Mass\s+Ave/i ||
3440		    $rawline =~ /\b59\s+Temple\s+Pl/i ||
3441		    $rawline =~ /\b51\s+Franklin\s+St/i) {
3442			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3443			my $msg_level = \&ERROR;
3444			$msg_level = \&CHK if ($file);
3445			&{$msg_level}("FSF_MAILING_ADDRESS",
3446				      "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)
3447		}
3448
3449# check for Kconfig help text having a real description
3450# Only applies when adding the entry originally, after that we do not have
3451# sufficient context to determine whether it is indeed long enough.
3452		if ($realfile =~ /Kconfig/ &&
3453		    # 'choice' is usually the last thing on the line (though
3454		    # Kconfig supports named choices), so use a word boundary
3455		    # (\b) rather than a whitespace character (\s)
3456		    $line =~ /^\+\s*(?:config|menuconfig|choice)\b/) {
3457			my $length = 0;
3458			my $cnt = $realcnt;
3459			my $ln = $linenr + 1;
3460			my $f;
3461			my $is_start = 0;
3462			my $is_end = 0;
3463			for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
3464				$f = $lines[$ln - 1];
3465				$cnt-- if ($lines[$ln - 1] !~ /^-/);
3466				$is_end = $lines[$ln - 1] =~ /^\+/;
3467
3468				next if ($f =~ /^-/);
3469				last if (!$file && $f =~ /^\@\@/);
3470
3471				if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate|prompt)\s*["']/) {
3472					$is_start = 1;
3473				} elsif ($lines[$ln - 1] =~ /^\+\s*(?:---)?help(?:---)?$/) {
3474					$length = -1;
3475				}
3476
3477				$f =~ s/^.//;
3478				$f =~ s/#.*//;
3479				$f =~ s/^\s+//;
3480				next if ($f =~ /^$/);
3481
3482				# This only checks context lines in the patch
3483				# and so hopefully shouldn't trigger false
3484				# positives, even though some of these are
3485				# common words in help texts
3486				if ($f =~ /^\s*(?:config|menuconfig|choice|endchoice|
3487						  if|endif|menu|endmenu|source)\b/x) {
3488					$is_end = 1;
3489					last;
3490				}
3491				$length++;
3492			}
3493			if ($is_start && $is_end && $length < $min_conf_desc_length) {
3494				WARN("CONFIG_DESCRIPTION",
3495				     "please write a paragraph that describes the config symbol fully\n" . $herecurr);
3496			}
3497			#print "is_start<$is_start> is_end<$is_end> length<$length>\n";
3498		}
3499
3500# check MAINTAINERS entries
3501		if ($realfile =~ /^MAINTAINERS$/) {
3502# check MAINTAINERS entries for the right form
3503			if ($rawline =~ /^\+[A-Z]:/ &&
3504			    $rawline !~ /^\+[A-Z]:\t\S/) {
3505				if (WARN("MAINTAINERS_STYLE",
3506					 "MAINTAINERS entries use one tab after TYPE:\n" . $herecurr) &&
3507				    $fix) {
3508					$fixed[$fixlinenr] =~ s/^(\+[A-Z]):\s*/$1:\t/;
3509				}
3510			}
3511# check MAINTAINERS entries for the right ordering too
3512			my $preferred_order = 'MRLSWQBCPTFXNK';
3513			if ($rawline =~ /^\+[A-Z]:/ &&
3514			    $prevrawline =~ /^[\+ ][A-Z]:/) {
3515				$rawline =~ /^\+([A-Z]):\s*(.*)/;
3516				my $cur = $1;
3517				my $curval = $2;
3518				$prevrawline =~ /^[\+ ]([A-Z]):\s*(.*)/;
3519				my $prev = $1;
3520				my $prevval = $2;
3521				my $curindex = index($preferred_order, $cur);
3522				my $previndex = index($preferred_order, $prev);
3523				if ($curindex < 0) {
3524					WARN("MAINTAINERS_STYLE",
3525					     "Unknown MAINTAINERS entry type: '$cur'\n" . $herecurr);
3526				} else {
3527					if ($previndex >= 0 && $curindex < $previndex) {
3528						WARN("MAINTAINERS_STYLE",
3529						     "Misordered MAINTAINERS entry - list '$cur:' before '$prev:'\n" . $hereprev);
3530					} elsif ((($prev eq 'F' && $cur eq 'F') ||
3531						  ($prev eq 'X' && $cur eq 'X')) &&
3532						 ($prevval cmp $curval) > 0) {
3533						WARN("MAINTAINERS_STYLE",
3534						     "Misordered MAINTAINERS entry - list file patterns in alphabetic order\n" . $hereprev);
3535					}
3536				}
3537			}
3538		}
3539
3540		if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
3541		    ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
3542			my $flag = $1;
3543			my $replacement = {
3544				'EXTRA_AFLAGS' =>   'asflags-y',
3545				'EXTRA_CFLAGS' =>   'ccflags-y',
3546				'EXTRA_CPPFLAGS' => 'cppflags-y',
3547				'EXTRA_LDFLAGS' =>  'ldflags-y',
3548			};
3549
3550			WARN("DEPRECATED_VARIABLE",
3551			     "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
3552		}
3553
3554# check for DT compatible documentation
3555		if (defined $root &&
3556			(($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
3557			 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
3558
3559			my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
3560
3561			my $dt_path = $root . "/Documentation/devicetree/bindings/";
3562			my $vp_file = $dt_path . "vendor-prefixes.yaml";
3563
3564			foreach my $compat (@compats) {
3565				my $compat2 = $compat;
3566				$compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;
3567				my $compat3 = $compat;
3568				$compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;
3569				`grep -Erq "$compat|$compat2|$compat3" $dt_path`;
3570				if ( $? >> 8 ) {
3571					WARN("UNDOCUMENTED_DT_STRING",
3572					     "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
3573				}
3574
3575				next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
3576				my $vendor = $1;
3577				`grep -Eq "\\"\\^\Q$vendor\E,\\.\\*\\":" $vp_file`;
3578				if ( $? >> 8 ) {
3579					WARN("UNDOCUMENTED_DT_STRING",
3580					     "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
3581				}
3582			}
3583		}
3584
3585# check for using SPDX license tag at beginning of files
3586		if ($realline == $checklicenseline) {
3587			if ($rawline =~ /^[ \+]\s*\#\!\s*\//) {
3588				$checklicenseline = 2;
3589			} elsif ($rawline =~ /^\+/) {
3590				my $comment = "";
3591				if ($realfile =~ /\.(h|s|S)$/) {
3592					$comment = '/*';
3593				} elsif ($realfile =~ /\.(c|dts|dtsi)$/) {
3594					$comment = '//';
3595				} elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc|yaml)$/) {
3596					$comment = '#';
3597				} elsif ($realfile =~ /\.rst$/) {
3598					$comment = '..';
3599				}
3600
3601# check SPDX comment style for .[chsS] files
3602				if ($realfile =~ /\.[chsS]$/ &&
3603				    $rawline =~ /SPDX-License-Identifier:/ &&
3604				    $rawline !~ m@^\+\s*\Q$comment\E\s*@) {
3605					WARN("SPDX_LICENSE_TAG",
3606					     "Improper SPDX comment style for '$realfile', please use '$comment' instead\n" . $herecurr);
3607				}
3608
3609				if ($comment !~ /^$/ &&
3610				    $rawline !~ m@^\+\Q$comment\E SPDX-License-Identifier: @) {
3611					WARN("SPDX_LICENSE_TAG",
3612					     "Missing or malformed SPDX-License-Identifier tag in line $checklicenseline\n" . $herecurr);
3613				} elsif ($rawline =~ /(SPDX-License-Identifier: .*)/) {
3614					my $spdx_license = $1;
3615					if (!is_SPDX_License_valid($spdx_license)) {
3616						WARN("SPDX_LICENSE_TAG",
3617						     "'$spdx_license' is not supported in LICENSES/...\n" . $herecurr);
3618					}
3619					if ($realfile =~ m@^Documentation/devicetree/bindings/@ &&
3620					    not $spdx_license =~ /GPL-2\.0.*BSD-2-Clause/) {
3621						my $msg_level = \&WARN;
3622						$msg_level = \&CHK if ($file);
3623						if (&{$msg_level}("SPDX_LICENSE_TAG",
3624
3625								  "DT binding documents should be licensed (GPL-2.0-only OR BSD-2-Clause)\n" . $herecurr) &&
3626						    $fix) {
3627							$fixed[$fixlinenr] =~ s/SPDX-License-Identifier: .*/SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)/;
3628						}
3629					}
3630				}
3631			}
3632		}
3633
3634# check for embedded filenames
3635		if ($rawline =~ /^\+.*\Q$realfile\E/) {
3636			WARN("EMBEDDED_FILENAME",
3637			     "It's generally not useful to have the filename in the file\n" . $herecurr);
3638		}
3639
3640# check we are in a valid source file if not then ignore this hunk
3641		next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/);
3642
3643# check for using SPDX-License-Identifier on the wrong line number
3644		if ($realline != $checklicenseline &&
3645		    $rawline =~ /\bSPDX-License-Identifier:/ &&
3646		    substr($line, @-, @+ - @-) eq "$;" x (@+ - @-)) {
3647			WARN("SPDX_LICENSE_TAG",
3648			     "Misplaced SPDX-License-Identifier tag - use line $checklicenseline instead\n" . $herecurr);
3649		}
3650
3651# line length limit (with some exclusions)
3652#
3653# There are a few types of lines that may extend beyond $max_line_length:
3654#	logging functions like pr_info that end in a string
3655#	lines with a single string
3656#	#defines that are a single string
3657#	lines with an RFC3986 like URL
3658#
3659# There are 3 different line length message types:
3660# LONG_LINE_COMMENT	a comment starts before but extends beyond $max_line_length
3661# LONG_LINE_STRING	a string starts before but extends beyond $max_line_length
3662# LONG_LINE		all other lines longer than $max_line_length
3663#
3664# if LONG_LINE is ignored, the other 2 types are also ignored
3665#
3666
3667		if ($line =~ /^\+/ && $length > $max_line_length) {
3668			my $msg_type = "LONG_LINE";
3669
3670			# Check the allowed long line types first
3671
3672			# logging functions that end in a string that starts
3673			# before $max_line_length
3674			if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ &&
3675			    length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
3676				$msg_type = "";
3677
3678			# lines with only strings (w/ possible termination)
3679			# #defines with only strings
3680			} elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ ||
3681				 $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) {
3682				$msg_type = "";
3683
3684			# More special cases
3685			} elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/ ||
3686				 $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) {
3687				$msg_type = "";
3688
3689			# URL ($rawline is used in case the URL is in a comment)
3690			} elsif ($rawline =~ /^\+.*\b[a-z][\w\.\+\-]*:\/\/\S+/i) {
3691				$msg_type = "";
3692
3693			# Otherwise set the alternate message types
3694
3695			# a comment starts before $max_line_length
3696			} elsif ($line =~ /($;[\s$;]*)$/ &&
3697				 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
3698				$msg_type = "LONG_LINE_COMMENT"
3699
3700			# a quoted string starts before $max_line_length
3701			} elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ &&
3702				 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
3703				$msg_type = "LONG_LINE_STRING"
3704			}
3705
3706			if ($msg_type ne "" &&
3707			    (show_type("LONG_LINE") || show_type($msg_type))) {
3708				my $msg_level = \&WARN;
3709				$msg_level = \&CHK if ($file);
3710				&{$msg_level}($msg_type,
3711					      "line length of $length exceeds $max_line_length columns\n" . $herecurr);
3712			}
3713		}
3714
3715# check for adding lines without a newline.
3716		if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
3717			if (WARN("MISSING_EOF_NEWLINE",
3718			         "adding a line without newline at end of file\n" . $herecurr) &&
3719			    $fix) {
3720				fix_delete_line($fixlinenr+1, "No newline at end of file");
3721			}
3722		}
3723
3724# check for .L prefix local symbols in .S files
3725		if ($realfile =~ /\.S$/ &&
3726		    $line =~ /^\+\s*(?:[A-Z]+_)?SYM_[A-Z]+_(?:START|END)(?:_[A-Z_]+)?\s*\(\s*\.L/) {
3727			WARN("AVOID_L_PREFIX",
3728			     "Avoid using '.L' prefixed local symbol names for denoting a range of code via 'SYM_*_START/END' annotations; see Documentation/asm-annotations.rst\n" . $herecurr);
3729		}
3730
3731# check we are in a valid source file C or perl if not then ignore this hunk
3732		next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
3733
3734# at the beginning of a line any tabs must come first and anything
3735# more than $tabsize must use tabs.
3736		if ($rawline =~ /^\+\s* \t\s*\S/ ||
3737		    $rawline =~ /^\+\s*        \s*/) {
3738			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3739			$rpt_cleaners = 1;
3740			if (ERROR("CODE_INDENT",
3741				  "code indent should use tabs where possible\n" . $herevet) &&
3742			    $fix) {
3743				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3744			}
3745		}
3746
3747# check for space before tabs.
3748		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
3749			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3750			if (WARN("SPACE_BEFORE_TAB",
3751				"please, no space before tabs\n" . $herevet) &&
3752			    $fix) {
3753				while ($fixed[$fixlinenr] =~
3754					   s/(^\+.*) {$tabsize,$tabsize}\t/$1\t\t/) {}
3755				while ($fixed[$fixlinenr] =~
3756					   s/(^\+.*) +\t/$1\t/) {}
3757			}
3758		}
3759
3760# check for assignments on the start of a line
3761		if ($sline =~ /^\+\s+($Assignment)[^=]/) {
3762			my $operator = $1;
3763			if (CHK("ASSIGNMENT_CONTINUATIONS",
3764				"Assignment operator '$1' should be on the previous line\n" . $hereprev) &&
3765			    $fix && $prevrawline =~ /^\+/) {
3766				# add assignment operator to the previous line, remove from current line
3767				$fixed[$fixlinenr - 1] .= " $operator";
3768				$fixed[$fixlinenr] =~ s/\Q$operator\E\s*//;
3769			}
3770		}
3771
3772# check for && or || at the start of a line
3773		if ($rawline =~ /^\+\s*(&&|\|\|)/) {
3774			my $operator = $1;
3775			if (CHK("LOGICAL_CONTINUATIONS",
3776				"Logical continuations should be on the previous line\n" . $hereprev) &&
3777			    $fix && $prevrawline =~ /^\+/) {
3778				# insert logical operator at last non-comment, non-whitepsace char on previous line
3779				$prevline =~ /[\s$;]*$/;
3780				my $line_end = substr($prevrawline, $-[0]);
3781				$fixed[$fixlinenr - 1] =~ s/\Q$line_end\E$/ $operator$line_end/;
3782				$fixed[$fixlinenr] =~ s/\Q$operator\E\s*//;
3783			}
3784		}
3785
3786# check indentation starts on a tab stop
3787		if ($perl_version_ok &&
3788		    $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {
3789			my $indent = length($1);
3790			if ($indent % $tabsize) {
3791				if (WARN("TABSTOP",
3792					 "Statements should start on a tabstop\n" . $herecurr) &&
3793				    $fix) {
3794					$fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/$tabsize)@e;
3795				}
3796			}
3797		}
3798
3799# check multi-line statement indentation matches previous line
3800		if ($perl_version_ok &&
3801		    $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|(?:\*\s*)*$Lval\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
3802			$prevline =~ /^\+(\t*)(.*)$/;
3803			my $oldindent = $1;
3804			my $rest = $2;
3805
3806			my $pos = pos_last_openparen($rest);
3807			if ($pos >= 0) {
3808				$line =~ /^(\+| )([ \t]*)/;
3809				my $newindent = $2;
3810
3811				my $goodtabindent = $oldindent .
3812					"\t" x ($pos / $tabsize) .
3813					" "  x ($pos % $tabsize);
3814				my $goodspaceindent = $oldindent . " "  x $pos;
3815
3816				if ($newindent ne $goodtabindent &&
3817				    $newindent ne $goodspaceindent) {
3818
3819					if (CHK("PARENTHESIS_ALIGNMENT",
3820						"Alignment should match open parenthesis\n" . $hereprev) &&
3821					    $fix && $line =~ /^\+/) {
3822						$fixed[$fixlinenr] =~
3823						    s/^\+[ \t]*/\+$goodtabindent/;
3824					}
3825				}
3826			}
3827		}
3828
3829# check for space after cast like "(int) foo" or "(struct foo) bar"
3830# avoid checking a few false positives:
3831#   "sizeof(<type>)" or "__alignof__(<type>)"
3832#   function pointer declarations like "(*foo)(int) = bar;"
3833#   structure definitions like "(struct foo) { 0 };"
3834#   multiline macros that define functions
3835#   known attributes or the __attribute__ keyword
3836		if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ &&
3837		    (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) {
3838			if (CHK("SPACING",
3839				"No space is necessary after a cast\n" . $herecurr) &&
3840			    $fix) {
3841				$fixed[$fixlinenr] =~
3842				    s/(\(\s*$Type\s*\))[ \t]+/$1/;
3843			}
3844		}
3845
3846# Block comment styles
3847# Networking with an initial /*
3848		if ($realfile =~ m@^(drivers/net/|net/)@ &&
3849		    $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
3850		    $rawline =~ /^\+[ \t]*\*/ &&
3851		    $realline > 3) { # Do not warn about the initial copyright comment block after SPDX-License-Identifier
3852			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
3853			     "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
3854		}
3855
3856# Block comments use * on subsequent lines
3857		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
3858		    $prevrawline =~ /^\+.*?\/\*/ &&		#starting /*
3859		    $prevrawline !~ /\*\/[ \t]*$/ &&		#no trailing */
3860		    $rawline =~ /^\+/ &&			#line is new
3861		    $rawline !~ /^\+[ \t]*\*/) {		#no leading *
3862			WARN("BLOCK_COMMENT_STYLE",
3863			     "Block comments use * on subsequent lines\n" . $hereprev);
3864		}
3865
3866# Block comments use */ on trailing lines
3867		if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&	#trailing */
3868		    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/
3869		    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&	#trailing **/
3870		    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {	#non blank */
3871			WARN("BLOCK_COMMENT_STYLE",
3872			     "Block comments use a trailing */ on a separate line\n" . $herecurr);
3873		}
3874
3875# Block comment * alignment
3876		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
3877		    $line =~ /^\+[ \t]*$;/ &&			#leading comment
3878		    $rawline =~ /^\+[ \t]*\*/ &&		#leading *
3879		    (($prevrawline =~ /^\+.*?\/\*/ &&		#leading /*
3880		      $prevrawline !~ /\*\/[ \t]*$/) ||		#no trailing */
3881		     $prevrawline =~ /^\+[ \t]*\*/)) {		#leading *
3882			my $oldindent;
3883			$prevrawline =~ m@^\+([ \t]*/?)\*@;
3884			if (defined($1)) {
3885				$oldindent = expand_tabs($1);
3886			} else {
3887				$prevrawline =~ m@^\+(.*/?)\*@;
3888				$oldindent = expand_tabs($1);
3889			}
3890			$rawline =~ m@^\+([ \t]*)\*@;
3891			my $newindent = $1;
3892			$newindent = expand_tabs($newindent);
3893			if (length($oldindent) ne length($newindent)) {
3894				WARN("BLOCK_COMMENT_STYLE",
3895				     "Block comments should align the * on each line\n" . $hereprev);
3896			}
3897		}
3898
3899# check for missing blank lines after struct/union declarations
3900# with exceptions for various attributes and macros
3901		if ($prevline =~ /^[\+ ]};?\s*$/ &&
3902		    $line =~ /^\+/ &&
3903		    !($line =~ /^\+\s*$/ ||
3904		      $line =~ /^\+\s*EXPORT_SYMBOL/ ||
3905		      $line =~ /^\+\s*MODULE_/i ||
3906		      $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||
3907		      $line =~ /^\+[a-z_]*init/ ||
3908		      $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||
3909		      $line =~ /^\+\s*DECLARE/ ||
3910		      $line =~ /^\+\s*builtin_[\w_]*driver/ ||
3911		      $line =~ /^\+\s*__setup/)) {
3912			if (CHK("LINE_SPACING",
3913				"Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) &&
3914			    $fix) {
3915				fix_insert_line($fixlinenr, "\+");
3916			}
3917		}
3918
3919# check for multiple consecutive blank lines
3920		if ($prevline =~ /^[\+ ]\s*$/ &&
3921		    $line =~ /^\+\s*$/ &&
3922		    $last_blank_line != ($linenr - 1)) {
3923			if (CHK("LINE_SPACING",
3924				"Please don't use multiple blank lines\n" . $hereprev) &&
3925			    $fix) {
3926				fix_delete_line($fixlinenr, $rawline);
3927			}
3928
3929			$last_blank_line = $linenr;
3930		}
3931
3932# check for missing blank lines after declarations
3933# (declarations must have the same indentation and not be at the start of line)
3934		if (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/) {
3935			# use temporaries
3936			my $sl = $sline;
3937			my $pl = $prevline;
3938			# remove $Attribute/$Sparse uses to simplify comparisons
3939			$sl =~ s/\b(?:$Attribute|$Sparse)\b//g;
3940			$pl =~ s/\b(?:$Attribute|$Sparse)\b//g;
3941			if (($pl =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
3942			# function pointer declarations
3943			     $pl =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3944			# foo bar; where foo is some local typedef or #define
3945			     $pl =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
3946			# known declaration macros
3947			     $pl =~ /^\+\s+$declaration_macros/) &&
3948			# for "else if" which can look like "$Ident $Ident"
3949			    !($pl =~ /^\+\s+$c90_Keywords\b/ ||
3950			# other possible extensions of declaration lines
3951			      $pl =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||
3952			# not starting a section or a macro "\" extended line
3953			      $pl =~ /(?:\{\s*|\\)$/) &&
3954			# looks like a declaration
3955			    !($sl =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
3956			# function pointer declarations
3957			      $sl =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3958			# foo bar; where foo is some local typedef or #define
3959			      $sl =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
3960			# known declaration macros
3961			      $sl =~ /^\+\s+$declaration_macros/ ||
3962			# start of struct or union or enum
3963			      $sl =~ /^\+\s+(?:static\s+)?(?:const\s+)?(?:union|struct|enum|typedef)\b/ ||
3964			# start or end of block or continuation of declaration
3965			      $sl =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||
3966			# bitfield continuation
3967			      $sl =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||
3968			# other possible extensions of declaration lines
3969			      $sl =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/)) {
3970				if (WARN("LINE_SPACING",
3971					 "Missing a blank line after declarations\n" . $hereprev) &&
3972				    $fix) {
3973					fix_insert_line($fixlinenr, "\+");
3974				}
3975			}
3976		}
3977
3978# check for spaces at the beginning of a line.
3979# Exceptions:
3980#  1) within comments
3981#  2) indented preprocessor commands
3982#  3) hanging labels
3983		if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/)  {
3984			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3985			if (WARN("LEADING_SPACE",
3986				 "please, no spaces at the start of a line\n" . $herevet) &&
3987			    $fix) {
3988				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3989			}
3990		}
3991
3992# check we are in a valid C source file if not then ignore this hunk
3993		next if ($realfile !~ /\.(h|c)$/);
3994
3995# check for unusual line ending [ or (
3996		if ($line =~ /^\+.*([\[\(])\s*$/) {
3997			CHK("OPEN_ENDED_LINE",
3998			    "Lines should not end with a '$1'\n" . $herecurr);
3999		}
4000
4001# check if this appears to be the start function declaration, save the name
4002		if ($sline =~ /^\+\{\s*$/ &&
4003		    $prevline =~ /^\+(?:(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*)?($Ident)\(/) {
4004			$context_function = $1;
4005		}
4006
4007# check if this appears to be the end of function declaration
4008		if ($sline =~ /^\+\}\s*$/) {
4009			undef $context_function;
4010		}
4011
4012# check indentation of any line with a bare else
4013# (but not if it is a multiple line "if (foo) return bar; else return baz;")
4014# if the previous line is a break or return and is indented 1 tab more...
4015		if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) {
4016			my $tabs = length($1) + 1;
4017			if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ ||
4018			    ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ &&
4019			     defined $lines[$linenr] &&
4020			     $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) {
4021				WARN("UNNECESSARY_ELSE",
4022				     "else is not generally useful after a break or return\n" . $hereprev);
4023			}
4024		}
4025
4026# check indentation of a line with a break;
4027# if the previous line is a goto, return or break
4028# and is indented the same # of tabs
4029		if ($sline =~ /^\+([\t]+)break\s*;\s*$/) {
4030			my $tabs = $1;
4031			if ($prevline =~ /^\+$tabs(goto|return|break)\b/) {
4032				if (WARN("UNNECESSARY_BREAK",
4033					 "break is not useful after a $1\n" . $hereprev) &&
4034				    $fix) {
4035					fix_delete_line($fixlinenr, $rawline);
4036				}
4037			}
4038		}
4039
4040# check for RCS/CVS revision markers
4041		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
4042			WARN("CVS_KEYWORD",
4043			     "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
4044		}
4045
4046# check for old HOTPLUG __dev<foo> section markings
4047		if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
4048			WARN("HOTPLUG_SECTION",
4049			     "Using $1 is unnecessary\n" . $herecurr);
4050		}
4051
4052# Check for potential 'bare' types
4053		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
4054		    $realline_next);
4055#print "LINE<$line>\n";
4056		if ($linenr > $suppress_statement &&
4057		    $realcnt && $sline =~ /.\s*\S/) {
4058			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
4059				ctx_statement_block($linenr, $realcnt, 0);
4060			$stat =~ s/\n./\n /g;
4061			$cond =~ s/\n./\n /g;
4062
4063#print "linenr<$linenr> <$stat>\n";
4064			# If this statement has no statement boundaries within
4065			# it there is no point in retrying a statement scan
4066			# until we hit end of it.
4067			my $frag = $stat; $frag =~ s/;+\s*$//;
4068			if ($frag !~ /(?:{|;)/) {
4069#print "skip<$line_nr_next>\n";
4070				$suppress_statement = $line_nr_next;
4071			}
4072
4073			# Find the real next line.
4074			$realline_next = $line_nr_next;
4075			if (defined $realline_next &&
4076			    (!defined $lines[$realline_next - 1] ||
4077			     substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
4078				$realline_next++;
4079			}
4080
4081			my $s = $stat;
4082			$s =~ s/{.*$//s;
4083
4084			# Ignore goto labels.
4085			if ($s =~ /$Ident:\*$/s) {
4086
4087			# Ignore functions being called
4088			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
4089
4090			} elsif ($s =~ /^.\s*else\b/s) {
4091
4092			# declarations always start with types
4093			} elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+?)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))(?:\s*$Modifier)?\s*(?:;|=|,|\()/s) {
4094				my $type = $1;
4095				$type =~ s/\s+/ /g;
4096				possible($type, "A:" . $s);
4097
4098			# definitions in global scope can only start with types
4099			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
4100				possible($1, "B:" . $s);
4101			}
4102
4103			# any (foo ... *) is a pointer cast, and foo is a type
4104			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
4105				possible($1, "C:" . $s);
4106			}
4107
4108			# Check for any sort of function declaration.
4109			# int foo(something bar, other baz);
4110			# void (*store_gdt)(x86_descr_ptr *);
4111			if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
4112				my ($name_len) = length($1);
4113
4114				my $ctx = $s;
4115				substr($ctx, 0, $name_len + 1, '');
4116				$ctx =~ s/\)[^\)]*$//;
4117
4118				for my $arg (split(/\s*,\s*/, $ctx)) {
4119					if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
4120
4121						possible($1, "D:" . $s);
4122					}
4123				}
4124			}
4125
4126		}
4127
4128#
4129# Checks which may be anchored in the context.
4130#
4131
4132# Check for switch () and associated case and default
4133# statements should be at the same indent.
4134		if ($line=~/\bswitch\s*\(.*\)/) {
4135			my $err = '';
4136			my $sep = '';
4137			my @ctx = ctx_block_outer($linenr, $realcnt);
4138			shift(@ctx);
4139			for my $ctx (@ctx) {
4140				my ($clen, $cindent) = line_stats($ctx);
4141				if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
4142							$indent != $cindent) {
4143					$err .= "$sep$ctx\n";
4144					$sep = '';
4145				} else {
4146					$sep = "[...]\n";
4147				}
4148			}
4149			if ($err ne '') {
4150				ERROR("SWITCH_CASE_INDENT_LEVEL",
4151				      "switch and case should be at the same indent\n$hereline$err");
4152			}
4153		}
4154
4155# if/while/etc brace do not go on next line, unless defining a do while loop,
4156# or if that brace on the next line is for something else
4157		if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
4158			my $pre_ctx = "$1$2";
4159
4160			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
4161
4162			if ($line =~ /^\+\t{6,}/) {
4163				WARN("DEEP_INDENTATION",
4164				     "Too many leading tabs - consider code refactoring\n" . $herecurr);
4165			}
4166
4167			my $ctx_cnt = $realcnt - $#ctx - 1;
4168			my $ctx = join("\n", @ctx);
4169
4170			my $ctx_ln = $linenr;
4171			my $ctx_skip = $realcnt;
4172
4173			while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
4174					defined $lines[$ctx_ln - 1] &&
4175					$lines[$ctx_ln - 1] =~ /^-/)) {
4176				##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
4177				$ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
4178				$ctx_ln++;
4179			}
4180
4181			#print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
4182			#print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
4183
4184			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
4185				ERROR("OPEN_BRACE",
4186				      "that open brace { should be on the previous line\n" .
4187					"$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
4188			}
4189			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
4190			    $ctx =~ /\)\s*\;\s*$/ &&
4191			    defined $lines[$ctx_ln - 1])
4192			{
4193				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
4194				if ($nindent > $indent) {
4195					WARN("TRAILING_SEMICOLON",
4196					     "trailing semicolon indicates no statements, indent implies otherwise\n" .
4197						"$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
4198				}
4199			}
4200		}
4201
4202# Check relative indent for conditionals and blocks.
4203		if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
4204			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
4205				ctx_statement_block($linenr, $realcnt, 0)
4206					if (!defined $stat);
4207			my ($s, $c) = ($stat, $cond);
4208
4209			substr($s, 0, length($c), '');
4210
4211			# remove inline comments
4212			$s =~ s/$;/ /g;
4213			$c =~ s/$;/ /g;
4214
4215			# Find out how long the conditional actually is.
4216			my @newlines = ($c =~ /\n/gs);
4217			my $cond_lines = 1 + $#newlines;
4218
4219			# Make sure we remove the line prefixes as we have
4220			# none on the first line, and are going to readd them
4221			# where necessary.
4222			$s =~ s/\n./\n/gs;
4223			while ($s =~ /\n\s+\\\n/) {
4224				$cond_lines += $s =~ s/\n\s+\\\n/\n/g;
4225			}
4226
4227			# We want to check the first line inside the block
4228			# starting at the end of the conditional, so remove:
4229			#  1) any blank line termination
4230			#  2) any opening brace { on end of the line
4231			#  3) any do (...) {
4232			my $continuation = 0;
4233			my $check = 0;
4234			$s =~ s/^.*\bdo\b//;
4235			$s =~ s/^\s*{//;
4236			if ($s =~ s/^\s*\\//) {
4237				$continuation = 1;
4238			}
4239			if ($s =~ s/^\s*?\n//) {
4240				$check = 1;
4241				$cond_lines++;
4242			}
4243
4244			# Also ignore a loop construct at the end of a
4245			# preprocessor statement.
4246			if (($prevline =~ /^.\s*#\s*define\s/ ||
4247			    $prevline =~ /\\\s*$/) && $continuation == 0) {
4248				$check = 0;
4249			}
4250
4251			my $cond_ptr = -1;
4252			$continuation = 0;
4253			while ($cond_ptr != $cond_lines) {
4254				$cond_ptr = $cond_lines;
4255
4256				# If we see an #else/#elif then the code
4257				# is not linear.
4258				if ($s =~ /^\s*\#\s*(?:else|elif)/) {
4259					$check = 0;
4260				}
4261
4262				# Ignore:
4263				#  1) blank lines, they should be at 0,
4264				#  2) preprocessor lines, and
4265				#  3) labels.
4266				if ($continuation ||
4267				    $s =~ /^\s*?\n/ ||
4268				    $s =~ /^\s*#\s*?/ ||
4269				    $s =~ /^\s*$Ident\s*:/) {
4270					$continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
4271					if ($s =~ s/^.*?\n//) {
4272						$cond_lines++;
4273					}
4274				}
4275			}
4276
4277			my (undef, $sindent) = line_stats("+" . $s);
4278			my $stat_real = raw_line($linenr, $cond_lines);
4279
4280			# Check if either of these lines are modified, else
4281			# this is not this patch's fault.
4282			if (!defined($stat_real) ||
4283			    $stat !~ /^\+/ && $stat_real !~ /^\+/) {
4284				$check = 0;
4285			}
4286			if (defined($stat_real) && $cond_lines > 1) {
4287				$stat_real = "[...]\n$stat_real";
4288			}
4289
4290			#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";
4291
4292			if ($check && $s ne '' &&
4293			    (($sindent % $tabsize) != 0 ||
4294			     ($sindent < $indent) ||
4295			     ($sindent == $indent &&
4296			      ($s !~ /^\s*(?:\}|\{|else\b)/)) ||
4297			     ($sindent > $indent + $tabsize))) {
4298				WARN("SUSPECT_CODE_INDENT",
4299				     "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
4300			}
4301		}
4302
4303		# Track the 'values' across context and added lines.
4304		my $opline = $line; $opline =~ s/^./ /;
4305		my ($curr_values, $curr_vars) =
4306				annotate_values($opline . "\n", $prev_values);
4307		$curr_values = $prev_values . $curr_values;
4308		if ($dbg_values) {
4309			my $outline = $opline; $outline =~ s/\t/ /g;
4310			print "$linenr > .$outline\n";
4311			print "$linenr > $curr_values\n";
4312			print "$linenr >  $curr_vars\n";
4313		}
4314		$prev_values = substr($curr_values, -1);
4315
4316#ignore lines not being added
4317		next if ($line =~ /^[^\+]/);
4318
4319# check for self assignments used to avoid compiler warnings
4320# e.g.:	int foo = foo, *bar = NULL;
4321#	struct foo bar = *(&(bar));
4322		if ($line =~ /^\+\s*(?:$Declare)?([A-Za-z_][A-Za-z\d_]*)\s*=/) {
4323			my $var = $1;
4324			if ($line =~ /^\+\s*(?:$Declare)?$var\s*=\s*(?:$var|\*\s*\(?\s*&\s*\(?\s*$var\s*\)?\s*\)?)\s*[;,]/) {
4325				WARN("SELF_ASSIGNMENT",
4326				     "Do not use self-assignments to avoid compiler warnings\n" . $herecurr);
4327			}
4328		}
4329
4330# check for dereferences that span multiple lines
4331		if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ &&
4332		    $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) {
4333			$prevline =~ /($Lval\s*(?:\.|->))\s*$/;
4334			my $ref = $1;
4335			$line =~ /^.\s*($Lval)/;
4336			$ref .= $1;
4337			$ref =~ s/\s//g;
4338			WARN("MULTILINE_DEREFERENCE",
4339			     "Avoid multiple line dereference - prefer '$ref'\n" . $hereprev);
4340		}
4341
4342# check for declarations of signed or unsigned without int
4343		while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
4344			my $type = $1;
4345			my $var = $2;
4346			$var = "" if (!defined $var);
4347			if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) {
4348				my $sign = $1;
4349				my $pointer = $2;
4350
4351				$pointer = "" if (!defined $pointer);
4352
4353				if (WARN("UNSPECIFIED_INT",
4354					 "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'\n" . $herecurr) &&
4355				    $fix) {
4356					my $decl = trim($sign) . " int ";
4357					my $comp_pointer = $pointer;
4358					$comp_pointer =~ s/\s//g;
4359					$decl .= $comp_pointer;
4360					$decl = rtrim($decl) if ($var eq "");
4361					$fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@;
4362				}
4363			}
4364		}
4365
4366# TEST: allow direct testing of the type matcher.
4367		if ($dbg_type) {
4368			if ($line =~ /^.\s*$Declare\s*$/) {
4369				ERROR("TEST_TYPE",
4370				      "TEST: is type\n" . $herecurr);
4371			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
4372				ERROR("TEST_NOT_TYPE",
4373				      "TEST: is not type ($1 is)\n". $herecurr);
4374			}
4375			next;
4376		}
4377# TEST: allow direct testing of the attribute matcher.
4378		if ($dbg_attr) {
4379			if ($line =~ /^.\s*$Modifier\s*$/) {
4380				ERROR("TEST_ATTR",
4381				      "TEST: is attr\n" . $herecurr);
4382			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
4383				ERROR("TEST_NOT_ATTR",
4384				      "TEST: is not attr ($1 is)\n". $herecurr);
4385			}
4386			next;
4387		}
4388
4389# check for initialisation to aggregates open brace on the next line
4390		if ($line =~ /^.\s*{/ &&
4391		    $prevline =~ /(?:^|[^=])=\s*$/) {
4392			if (ERROR("OPEN_BRACE",
4393				  "that open brace { should be on the previous line\n" . $hereprev) &&
4394			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
4395				fix_delete_line($fixlinenr - 1, $prevrawline);
4396				fix_delete_line($fixlinenr, $rawline);
4397				my $fixedline = $prevrawline;
4398				$fixedline =~ s/\s*=\s*$/ = {/;
4399				fix_insert_line($fixlinenr, $fixedline);
4400				$fixedline = $line;
4401				$fixedline =~ s/^(.\s*)\{\s*/$1/;
4402				fix_insert_line($fixlinenr, $fixedline);
4403			}
4404		}
4405
4406#
4407# Checks which are anchored on the added line.
4408#
4409
4410# check for malformed paths in #include statements (uses RAW line)
4411		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
4412			my $path = $1;
4413			if ($path =~ m{//}) {
4414				ERROR("MALFORMED_INCLUDE",
4415				      "malformed #include filename\n" . $herecurr);
4416			}
4417			if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
4418				ERROR("UAPI_INCLUDE",
4419				      "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
4420			}
4421		}
4422
4423# no C99 // comments
4424		if ($line =~ m{//}) {
4425			if (ERROR("C99_COMMENTS",
4426				  "do not use C99 // comments\n" . $herecurr) &&
4427			    $fix) {
4428				my $line = $fixed[$fixlinenr];
4429				if ($line =~ /\/\/(.*)$/) {
4430					my $comment = trim($1);
4431					$fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
4432				}
4433			}
4434		}
4435		# Remove C99 comments.
4436		$line =~ s@//.*@@;
4437		$opline =~ s@//.*@@;
4438
4439# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
4440# the whole statement.
4441#print "APW <$lines[$realline_next - 1]>\n";
4442		if (defined $realline_next &&
4443		    exists $lines[$realline_next - 1] &&
4444		    !defined $suppress_export{$realline_next} &&
4445		    ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/)) {
4446			# Handle definitions which produce identifiers with
4447			# a prefix:
4448			#   XXX(foo);
4449			#   EXPORT_SYMBOL(something_foo);
4450			my $name = $1;
4451			if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
4452			    $name =~ /^${Ident}_$2/) {
4453#print "FOO C name<$name>\n";
4454				$suppress_export{$realline_next} = 1;
4455
4456			} elsif ($stat !~ /(?:
4457				\n.}\s*$|
4458				^.DEFINE_$Ident\(\Q$name\E\)|
4459				^.DECLARE_$Ident\(\Q$name\E\)|
4460				^.LIST_HEAD\(\Q$name\E\)|
4461				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
4462				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
4463			    )/x) {
4464#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
4465				$suppress_export{$realline_next} = 2;
4466			} else {
4467				$suppress_export{$realline_next} = 1;
4468			}
4469		}
4470		if (!defined $suppress_export{$linenr} &&
4471		    $prevline =~ /^.\s*$/ &&
4472		    ($line =~ /EXPORT_SYMBOL.*\((.*)\)/)) {
4473#print "FOO B <$lines[$linenr - 1]>\n";
4474			$suppress_export{$linenr} = 2;
4475		}
4476		if (defined $suppress_export{$linenr} &&
4477		    $suppress_export{$linenr} == 2) {
4478			WARN("EXPORT_SYMBOL",
4479			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
4480		}
4481
4482# check for global initialisers.
4483		if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/ &&
4484		    !exclude_global_initialisers($realfile)) {
4485			if (ERROR("GLOBAL_INITIALISERS",
4486				  "do not initialise globals to $1\n" . $herecurr) &&
4487			    $fix) {
4488				$fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/;
4489			}
4490		}
4491# check for static initialisers.
4492		if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) {
4493			if (ERROR("INITIALISED_STATIC",
4494				  "do not initialise statics to $1\n" .
4495				      $herecurr) &&
4496			    $fix) {
4497				$fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/;
4498			}
4499		}
4500
4501# check for misordered declarations of char/short/int/long with signed/unsigned
4502		while ($sline =~ m{(\b$TypeMisordered\b)}g) {
4503			my $tmp = trim($1);
4504			WARN("MISORDERED_TYPE",
4505			     "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order\n" . $herecurr);
4506		}
4507
4508# check for unnecessary <signed> int declarations of short/long/long long
4509		while ($sline =~ m{\b($TypeMisordered(\s*\*)*|$C90_int_types)\b}g) {
4510			my $type = trim($1);
4511			next if ($type !~ /\bint\b/);
4512			next if ($type !~ /\b(?:short|long\s+long|long)\b/);
4513			my $new_type = $type;
4514			$new_type =~ s/\b\s*int\s*\b/ /;
4515			$new_type =~ s/\b\s*(?:un)?signed\b\s*/ /;
4516			$new_type =~ s/^const\s+//;
4517			$new_type = "unsigned $new_type" if ($type =~ /\bunsigned\b/);
4518			$new_type = "const $new_type" if ($type =~ /^const\b/);
4519			$new_type =~ s/\s+/ /g;
4520			$new_type = trim($new_type);
4521			if (WARN("UNNECESSARY_INT",
4522				 "Prefer '$new_type' over '$type' as the int is unnecessary\n" . $herecurr) &&
4523			    $fix) {
4524				$fixed[$fixlinenr] =~ s/\b\Q$type\E\b/$new_type/;
4525			}
4526		}
4527
4528# check for static const char * arrays.
4529		if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
4530			WARN("STATIC_CONST_CHAR_ARRAY",
4531			     "static const char * array should probably be static const char * const\n" .
4532				$herecurr);
4533		}
4534
4535# check for initialized const char arrays that should be static const
4536		if ($line =~ /^\+\s*const\s+(char|unsigned\s+char|_*u8|(?:[us]_)?int8_t)\s+\w+\s*\[\s*(?:\w+\s*)?\]\s*=\s*"/) {
4537			if (WARN("STATIC_CONST_CHAR_ARRAY",
4538				 "const array should probably be static const\n" . $herecurr) &&
4539			    $fix) {
4540				$fixed[$fixlinenr] =~ s/(^.\s*)const\b/${1}static const/;
4541			}
4542		}
4543
4544# check for static char foo[] = "bar" declarations.
4545		if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
4546			WARN("STATIC_CONST_CHAR_ARRAY",
4547			     "static char array declaration should probably be static const char\n" .
4548				$herecurr);
4549		}
4550
4551# check for const <foo> const where <foo> is not a pointer or array type
4552		if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) {
4553			my $found = $1;
4554			if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) {
4555				WARN("CONST_CONST",
4556				     "'const $found const *' should probably be 'const $found * const'\n" . $herecurr);
4557			} elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) {
4558				WARN("CONST_CONST",
4559				     "'const $found const' should probably be 'const $found'\n" . $herecurr);
4560			}
4561		}
4562
4563# check for const static or static <non ptr type> const declarations
4564# prefer 'static const <foo>' over 'const static <foo>' and 'static <foo> const'
4565		if ($sline =~ /^\+\s*const\s+static\s+($Type)\b/ ||
4566		    $sline =~ /^\+\s*static\s+($BasicType)\s+const\b/) {
4567			if (WARN("STATIC_CONST",
4568				 "Move const after static - use 'static const $1'\n" . $herecurr) &&
4569			    $fix) {
4570				$fixed[$fixlinenr] =~ s/\bconst\s+static\b/static const/;
4571				$fixed[$fixlinenr] =~ s/\bstatic\s+($BasicType)\s+const\b/static const $1/;
4572			}
4573		}
4574
4575# check for non-global char *foo[] = {"bar", ...} declarations.
4576		if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
4577			WARN("STATIC_CONST_CHAR_ARRAY",
4578			     "char * array declaration might be better as static const\n" .
4579				$herecurr);
4580		}
4581
4582# check for sizeof(foo)/sizeof(foo[0]) that could be ARRAY_SIZE(foo)
4583		if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) {
4584			my $array = $1;
4585			if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) {
4586				my $array_div = $1;
4587				if (WARN("ARRAY_SIZE",
4588					 "Prefer ARRAY_SIZE($array)\n" . $herecurr) &&
4589				    $fix) {
4590					$fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/;
4591				}
4592			}
4593		}
4594
4595# check for function declarations without arguments like "int foo()"
4596		if ($line =~ /(\b$Type\s*$Ident)\s*\(\s*\)/) {
4597			if (ERROR("FUNCTION_WITHOUT_ARGS",
4598				  "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
4599			    $fix) {
4600				$fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
4601			}
4602		}
4603
4604# check for new typedefs, only function parameters and sparse annotations
4605# make sense.
4606		if ($line =~ /\btypedef\s/ &&
4607		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
4608		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
4609		    $line !~ /\b$typeTypedefs\b/ &&
4610		    $line !~ /\b__bitwise\b/) {
4611			WARN("NEW_TYPEDEFS",
4612			     "do not add new typedefs\n" . $herecurr);
4613		}
4614
4615# * goes on variable not on type
4616		# (char*[ const])
4617		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
4618			#print "AA<$1>\n";
4619			my ($ident, $from, $to) = ($1, $2, $2);
4620
4621			# Should start with a space.
4622			$to =~ s/^(\S)/ $1/;
4623			# Should not end with a space.
4624			$to =~ s/\s+$//;
4625			# '*'s should not have spaces between.
4626			while ($to =~ s/\*\s+\*/\*\*/) {
4627			}
4628
4629##			print "1: from<$from> to<$to> ident<$ident>\n";
4630			if ($from ne $to) {
4631				if (ERROR("POINTER_LOCATION",
4632					  "\"(foo$from)\" should be \"(foo$to)\"\n" .  $herecurr) &&
4633				    $fix) {
4634					my $sub_from = $ident;
4635					my $sub_to = $ident;
4636					$sub_to =~ s/\Q$from\E/$to/;
4637					$fixed[$fixlinenr] =~
4638					    s@\Q$sub_from\E@$sub_to@;
4639				}
4640			}
4641		}
4642		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
4643			#print "BB<$1>\n";
4644			my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
4645
4646			# Should start with a space.
4647			$to =~ s/^(\S)/ $1/;
4648			# Should not end with a space.
4649			$to =~ s/\s+$//;
4650			# '*'s should not have spaces between.
4651			while ($to =~ s/\*\s+\*/\*\*/) {
4652			}
4653			# Modifiers should have spaces.
4654			$to =~ s/(\b$Modifier$)/$1 /;
4655
4656##			print "2: from<$from> to<$to> ident<$ident>\n";
4657			if ($from ne $to && $ident !~ /^$Modifier$/) {
4658				if (ERROR("POINTER_LOCATION",
4659					  "\"foo${from}bar\" should be \"foo${to}bar\"\n" .  $herecurr) &&
4660				    $fix) {
4661
4662					my $sub_from = $match;
4663					my $sub_to = $match;
4664					$sub_to =~ s/\Q$from\E/$to/;
4665					$fixed[$fixlinenr] =~
4666					    s@\Q$sub_from\E@$sub_to@;
4667				}
4668			}
4669		}
4670
4671# avoid BUG() or BUG_ON()
4672		if ($line =~ /\b(?:BUG|BUG_ON)\b/) {
4673			my $msg_level = \&WARN;
4674			$msg_level = \&CHK if ($file);
4675			&{$msg_level}("AVOID_BUG",
4676				      "Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()\n" . $herecurr);
4677		}
4678
4679# avoid LINUX_VERSION_CODE
4680		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
4681			WARN("LINUX_VERSION_CODE",
4682			     "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
4683		}
4684
4685# check for uses of printk_ratelimit
4686		if ($line =~ /\bprintk_ratelimit\s*\(/) {
4687			WARN("PRINTK_RATELIMITED",
4688			     "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
4689		}
4690
4691# printk should use KERN_* levels
4692		if ($line =~ /\bprintk\s*\(\s*(?!KERN_[A-Z]+\b)/) {
4693			WARN("PRINTK_WITHOUT_KERN_LEVEL",
4694			     "printk() should include KERN_<LEVEL> facility level\n" . $herecurr);
4695		}
4696
4697# prefer variants of (subsystem|netdev|dev|pr)_<level> to printk(KERN_<LEVEL>
4698		if ($line =~ /\b(printk(_once|_ratelimited)?)\s*\(\s*KERN_([A-Z]+)/) {
4699			my $printk = $1;
4700			my $modifier = $2;
4701			my $orig = $3;
4702			$modifier = "" if (!defined($modifier));
4703			my $level = lc($orig);
4704			$level = "warn" if ($level eq "warning");
4705			my $level2 = $level;
4706			$level2 = "dbg" if ($level eq "debug");
4707			$level .= $modifier;
4708			$level2 .= $modifier;
4709			WARN("PREFER_PR_LEVEL",
4710			     "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(...  to $printk(KERN_$orig ...\n" . $herecurr);
4711		}
4712
4713# prefer dev_<level> to dev_printk(KERN_<LEVEL>
4714		if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
4715			my $orig = $1;
4716			my $level = lc($orig);
4717			$level = "warn" if ($level eq "warning");
4718			$level = "dbg" if ($level eq "debug");
4719			WARN("PREFER_DEV_LEVEL",
4720			     "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
4721		}
4722
4723# trace_printk should not be used in production code.
4724		if ($line =~ /\b(trace_printk|trace_puts|ftrace_vprintk)\s*\(/) {
4725			WARN("TRACE_PRINTK",
4726			     "Do not use $1() in production code (this can be ignored if built only with a debug config option)\n" . $herecurr);
4727		}
4728
4729# ENOSYS means "bad syscall nr" and nothing else.  This will have a small
4730# number of false positives, but assembly files are not checked, so at
4731# least the arch entry code will not trigger this warning.
4732		if ($line =~ /\bENOSYS\b/) {
4733			WARN("ENOSYS",
4734			     "ENOSYS means 'invalid syscall nr' and nothing else\n" . $herecurr);
4735		}
4736
4737# ENOTSUPP is not a standard error code and should be avoided in new patches.
4738# Folks usually mean EOPNOTSUPP (also called ENOTSUP), when they type ENOTSUPP.
4739# Similarly to ENOSYS warning a small number of false positives is expected.
4740		if (!$file && $line =~ /\bENOTSUPP\b/) {
4741			if (WARN("ENOTSUPP",
4742				 "ENOTSUPP is not a SUSV4 error code, prefer EOPNOTSUPP\n" . $herecurr) &&
4743			    $fix) {
4744				$fixed[$fixlinenr] =~ s/\bENOTSUPP\b/EOPNOTSUPP/;
4745			}
4746		}
4747
4748# function brace can't be on same line, except for #defines of do while,
4749# or if closed on same line
4750		if ($perl_version_ok &&
4751		    $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ &&
4752		    $sline !~ /\#\s*define\b.*do\s*\{/ &&
4753		    $sline !~ /}/) {
4754			if (ERROR("OPEN_BRACE",
4755				  "open brace '{' following function definitions go on the next line\n" . $herecurr) &&
4756			    $fix) {
4757				fix_delete_line($fixlinenr, $rawline);
4758				my $fixed_line = $rawline;
4759				$fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*)\{(.*)$/;
4760				my $line1 = $1;
4761				my $line2 = $2;
4762				fix_insert_line($fixlinenr, ltrim($line1));
4763				fix_insert_line($fixlinenr, "\+{");
4764				if ($line2 !~ /^\s*$/) {
4765					fix_insert_line($fixlinenr, "\+\t" . trim($line2));
4766				}
4767			}
4768		}
4769
4770# open braces for enum, union and struct go on the same line.
4771		if ($line =~ /^.\s*{/ &&
4772		    $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
4773			if (ERROR("OPEN_BRACE",
4774				  "open brace '{' following $1 go on the same line\n" . $hereprev) &&
4775			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
4776				fix_delete_line($fixlinenr - 1, $prevrawline);
4777				fix_delete_line($fixlinenr, $rawline);
4778				my $fixedline = rtrim($prevrawline) . " {";
4779				fix_insert_line($fixlinenr, $fixedline);
4780				$fixedline = $rawline;
4781				$fixedline =~ s/^(.\s*)\{\s*/$1\t/;
4782				if ($fixedline !~ /^\+\s*$/) {
4783					fix_insert_line($fixlinenr, $fixedline);
4784				}
4785			}
4786		}
4787
4788# missing space after union, struct or enum definition
4789		if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
4790			if (WARN("SPACING",
4791				 "missing space after $1 definition\n" . $herecurr) &&
4792			    $fix) {
4793				$fixed[$fixlinenr] =~
4794				    s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
4795			}
4796		}
4797
4798# Function pointer declarations
4799# check spacing between type, funcptr, and args
4800# canonical declaration is "type (*funcptr)(args...)"
4801		if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
4802			my $declare = $1;
4803			my $pre_pointer_space = $2;
4804			my $post_pointer_space = $3;
4805			my $funcname = $4;
4806			my $post_funcname_space = $5;
4807			my $pre_args_space = $6;
4808
4809# the $Declare variable will capture all spaces after the type
4810# so check it for a missing trailing missing space but pointer return types
4811# don't need a space so don't warn for those.
4812			my $post_declare_space = "";
4813			if ($declare =~ /(\s+)$/) {
4814				$post_declare_space = $1;
4815				$declare = rtrim($declare);
4816			}
4817			if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
4818				WARN("SPACING",
4819				     "missing space after return type\n" . $herecurr);
4820				$post_declare_space = " ";
4821			}
4822
4823# unnecessary space "type  (*funcptr)(args...)"
4824# This test is not currently implemented because these declarations are
4825# equivalent to
4826#	int  foo(int bar, ...)
4827# and this is form shouldn't/doesn't generate a checkpatch warning.
4828#
4829#			elsif ($declare =~ /\s{2,}$/) {
4830#				WARN("SPACING",
4831#				     "Multiple spaces after return type\n" . $herecurr);
4832#			}
4833
4834# unnecessary space "type ( *funcptr)(args...)"
4835			if (defined $pre_pointer_space &&
4836			    $pre_pointer_space =~ /^\s/) {
4837				WARN("SPACING",
4838				     "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
4839			}
4840
4841# unnecessary space "type (* funcptr)(args...)"
4842			if (defined $post_pointer_space &&
4843			    $post_pointer_space =~ /^\s/) {
4844				WARN("SPACING",
4845				     "Unnecessary space before function pointer name\n" . $herecurr);
4846			}
4847
4848# unnecessary space "type (*funcptr )(args...)"
4849			if (defined $post_funcname_space &&
4850			    $post_funcname_space =~ /^\s/) {
4851				WARN("SPACING",
4852				     "Unnecessary space after function pointer name\n" . $herecurr);
4853			}
4854
4855# unnecessary space "type (*funcptr) (args...)"
4856			if (defined $pre_args_space &&
4857			    $pre_args_space =~ /^\s/) {
4858				WARN("SPACING",
4859				     "Unnecessary space before function pointer arguments\n" . $herecurr);
4860			}
4861
4862			if (show_type("SPACING") && $fix) {
4863				$fixed[$fixlinenr] =~
4864				    s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
4865			}
4866		}
4867
4868# check for spacing round square brackets; allowed:
4869#  1. with a type on the left -- int [] a;
4870#  2. at the beginning of a line for slice initialisers -- [0...10] = 5,
4871#  3. inside a curly brace -- = { [0...10] = 5 }
4872		while ($line =~ /(.*?\s)\[/g) {
4873			my ($where, $prefix) = ($-[1], $1);
4874			if ($prefix !~ /$Type\s+$/ &&
4875			    ($where != 0 || $prefix !~ /^.\s+$/) &&
4876			    $prefix !~ /[{,:]\s+$/) {
4877				if (ERROR("BRACKET_SPACE",
4878					  "space prohibited before open square bracket '['\n" . $herecurr) &&
4879				    $fix) {
4880				    $fixed[$fixlinenr] =~
4881					s/^(\+.*?)\s+\[/$1\[/;
4882				}
4883			}
4884		}
4885
4886# check for spaces between functions and their parentheses.
4887		while ($line =~ /($Ident)\s+\(/g) {
4888			my $name = $1;
4889			my $ctx_before = substr($line, 0, $-[1]);
4890			my $ctx = "$ctx_before$name";
4891
4892			# Ignore those directives where spaces _are_ permitted.
4893			if ($name =~ /^(?:
4894				if|for|while|switch|return|case|
4895				volatile|__volatile__|
4896				__attribute__|format|__extension__|
4897				asm|__asm__)$/x)
4898			{
4899			# cpp #define statements have non-optional spaces, ie
4900			# if there is a space between the name and the open
4901			# parenthesis it is simply not a parameter group.
4902			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
4903
4904			# cpp #elif statement condition may start with a (
4905			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
4906
4907			# If this whole things ends with a type its most
4908			# likely a typedef for a function.
4909			} elsif ($ctx =~ /$Type$/) {
4910
4911			} else {
4912				if (WARN("SPACING",
4913					 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
4914					     $fix) {
4915					$fixed[$fixlinenr] =~
4916					    s/\b$name\s+\(/$name\(/;
4917				}
4918			}
4919		}
4920
4921# Check operator spacing.
4922		if (!($line=~/\#\s*include/)) {
4923			my $fixed_line = "";
4924			my $line_fixed = 0;
4925
4926			my $ops = qr{
4927				<<=|>>=|<=|>=|==|!=|
4928				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
4929				=>|->|<<|>>|<|>|=|!|~|
4930				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
4931				\?:|\?|:
4932			}x;
4933			my @elements = split(/($ops|;)/, $opline);
4934
4935##			print("element count: <" . $#elements . ">\n");
4936##			foreach my $el (@elements) {
4937##				print("el: <$el>\n");
4938##			}
4939
4940			my @fix_elements = ();
4941			my $off = 0;
4942
4943			foreach my $el (@elements) {
4944				push(@fix_elements, substr($rawline, $off, length($el)));
4945				$off += length($el);
4946			}
4947
4948			$off = 0;
4949
4950			my $blank = copy_spacing($opline);
4951			my $last_after = -1;
4952
4953			for (my $n = 0; $n < $#elements; $n += 2) {
4954
4955				my $good = $fix_elements[$n] . $fix_elements[$n + 1];
4956
4957##				print("n: <$n> good: <$good>\n");
4958
4959				$off += length($elements[$n]);
4960
4961				# Pick up the preceding and succeeding characters.
4962				my $ca = substr($opline, 0, $off);
4963				my $cc = '';
4964				if (length($opline) >= ($off + length($elements[$n + 1]))) {
4965					$cc = substr($opline, $off + length($elements[$n + 1]));
4966				}
4967				my $cb = "$ca$;$cc";
4968
4969				my $a = '';
4970				$a = 'V' if ($elements[$n] ne '');
4971				$a = 'W' if ($elements[$n] =~ /\s$/);
4972				$a = 'C' if ($elements[$n] =~ /$;$/);
4973				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
4974				$a = 'O' if ($elements[$n] eq '');
4975				$a = 'E' if ($ca =~ /^\s*$/);
4976
4977				my $op = $elements[$n + 1];
4978
4979				my $c = '';
4980				if (defined $elements[$n + 2]) {
4981					$c = 'V' if ($elements[$n + 2] ne '');
4982					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
4983					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4984					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
4985					$c = 'O' if ($elements[$n + 2] eq '');
4986					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4987				} else {
4988					$c = 'E';
4989				}
4990
4991				my $ctx = "${a}x${c}";
4992
4993				my $at = "(ctx:$ctx)";
4994
4995				my $ptr = substr($blank, 0, $off) . "^";
4996				my $hereptr = "$hereline$ptr\n";
4997
4998				# Pull out the value of this operator.
4999				my $op_type = substr($curr_values, $off + 1, 1);
5000
5001				# Get the full operator variant.
5002				my $opv = $op . substr($curr_vars, $off, 1);
5003
5004				# Ignore operators passed as parameters.
5005				if ($op_type ne 'V' &&
5006				    $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) {
5007
5008#				# Ignore comments
5009#				} elsif ($op =~ /^$;+$/) {
5010
5011				# ; should have either the end of line or a space or \ after it
5012				} elsif ($op eq ';') {
5013					if ($ctx !~ /.x[WEBC]/ &&
5014					    $cc !~ /^\\/ && $cc !~ /^;/) {
5015						if (ERROR("SPACING",
5016							  "space required after that '$op' $at\n" . $hereptr)) {
5017							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
5018							$line_fixed = 1;
5019						}
5020					}
5021
5022				# // is a comment
5023				} elsif ($op eq '//') {
5024
5025				#   :   when part of a bitfield
5026				} elsif ($opv eq ':B') {
5027					# skip the bitfield test for now
5028
5029				# No spaces for:
5030				#   ->
5031				} elsif ($op eq '->') {
5032					if ($ctx =~ /Wx.|.xW/) {
5033						if (ERROR("SPACING",
5034							  "spaces prohibited around that '$op' $at\n" . $hereptr)) {
5035							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
5036							if (defined $fix_elements[$n + 2]) {
5037								$fix_elements[$n + 2] =~ s/^\s+//;
5038							}
5039							$line_fixed = 1;
5040						}
5041					}
5042
5043				# , must not have a space before and must have a space on the right.
5044				} elsif ($op eq ',') {
5045					my $rtrim_before = 0;
5046					my $space_after = 0;
5047					if ($ctx =~ /Wx./) {
5048						if (ERROR("SPACING",
5049							  "space prohibited before that '$op' $at\n" . $hereptr)) {
5050							$line_fixed = 1;
5051							$rtrim_before = 1;
5052						}
5053					}
5054					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
5055						if (ERROR("SPACING",
5056							  "space required after that '$op' $at\n" . $hereptr)) {
5057							$line_fixed = 1;
5058							$last_after = $n;
5059							$space_after = 1;
5060						}
5061					}
5062					if ($rtrim_before || $space_after) {
5063						if ($rtrim_before) {
5064							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
5065						} else {
5066							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
5067						}
5068						if ($space_after) {
5069							$good .= " ";
5070						}
5071					}
5072
5073				# '*' as part of a type definition -- reported already.
5074				} elsif ($opv eq '*_') {
5075					#warn "'*' is part of type\n";
5076
5077				# unary operators should have a space before and
5078				# none after.  May be left adjacent to another
5079				# unary operator, or a cast
5080				} elsif ($op eq '!' || $op eq '~' ||
5081					 $opv eq '*U' || $opv eq '-U' ||
5082					 $opv eq '&U' || $opv eq '&&U') {
5083					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
5084						if (ERROR("SPACING",
5085							  "space required before that '$op' $at\n" . $hereptr)) {
5086							if ($n != $last_after + 2) {
5087								$good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
5088								$line_fixed = 1;
5089							}
5090						}
5091					}
5092					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
5093						# A unary '*' may be const
5094
5095					} elsif ($ctx =~ /.xW/) {
5096						if (ERROR("SPACING",
5097							  "space prohibited after that '$op' $at\n" . $hereptr)) {
5098							$good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
5099							if (defined $fix_elements[$n + 2]) {
5100								$fix_elements[$n + 2] =~ s/^\s+//;
5101							}
5102							$line_fixed = 1;
5103						}
5104					}
5105
5106				# unary ++ and unary -- are allowed no space on one side.
5107				} elsif ($op eq '++' or $op eq '--') {
5108					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
5109						if (ERROR("SPACING",
5110							  "space required one side of that '$op' $at\n" . $hereptr)) {
5111							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
5112							$line_fixed = 1;
5113						}
5114					}
5115					if ($ctx =~ /Wx[BE]/ ||
5116					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
5117						if (ERROR("SPACING",
5118							  "space prohibited before that '$op' $at\n" . $hereptr)) {
5119							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
5120							$line_fixed = 1;
5121						}
5122					}
5123					if ($ctx =~ /ExW/) {
5124						if (ERROR("SPACING",
5125							  "space prohibited after that '$op' $at\n" . $hereptr)) {
5126							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
5127							if (defined $fix_elements[$n + 2]) {
5128								$fix_elements[$n + 2] =~ s/^\s+//;
5129							}
5130							$line_fixed = 1;
5131						}
5132					}
5133
5134				# << and >> may either have or not have spaces both sides
5135				} elsif ($op eq '<<' or $op eq '>>' or
5136					 $op eq '&' or $op eq '^' or $op eq '|' or
5137					 $op eq '+' or $op eq '-' or
5138					 $op eq '*' or $op eq '/' or
5139					 $op eq '%')
5140				{
5141					if ($check) {
5142						if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) {
5143							if (CHK("SPACING",
5144								"spaces preferred around that '$op' $at\n" . $hereptr)) {
5145								$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
5146								$fix_elements[$n + 2] =~ s/^\s+//;
5147								$line_fixed = 1;
5148							}
5149						} elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) {
5150							if (CHK("SPACING",
5151								"space preferred before that '$op' $at\n" . $hereptr)) {
5152								$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]);
5153								$line_fixed = 1;
5154							}
5155						}
5156					} elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
5157						if (ERROR("SPACING",
5158							  "need consistent spacing around '$op' $at\n" . $hereptr)) {
5159							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
5160							if (defined $fix_elements[$n + 2]) {
5161								$fix_elements[$n + 2] =~ s/^\s+//;
5162							}
5163							$line_fixed = 1;
5164						}
5165					}
5166
5167				# A colon needs no spaces before when it is
5168				# terminating a case value or a label.
5169				} elsif ($opv eq ':C' || $opv eq ':L') {
5170					if ($ctx =~ /Wx./ and $realfile !~ m@.*\.lds\.h$@) {
5171						if (ERROR("SPACING",
5172							  "space prohibited before that '$op' $at\n" . $hereptr)) {
5173							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
5174							$line_fixed = 1;
5175						}
5176					}
5177
5178				# All the others need spaces both sides.
5179				} elsif ($ctx !~ /[EWC]x[CWE]/) {
5180					my $ok = 0;
5181
5182					# Ignore email addresses <foo@bar>
5183					if (($op eq '<' &&
5184					     $cc =~ /^\S+\@\S+>/) ||
5185					    ($op eq '>' &&
5186					     $ca =~ /<\S+\@\S+$/))
5187					{
5188						$ok = 1;
5189					}
5190
5191					# for asm volatile statements
5192					# ignore a colon with another
5193					# colon immediately before or after
5194					if (($op eq ':') &&
5195					    ($ca =~ /:$/ || $cc =~ /^:/)) {
5196						$ok = 1;
5197					}
5198
5199					# messages are ERROR, but ?: are CHK
5200					if ($ok == 0) {
5201						my $msg_level = \&ERROR;
5202						$msg_level = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
5203
5204						if (&{$msg_level}("SPACING",
5205								  "spaces required around that '$op' $at\n" . $hereptr)) {
5206							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
5207							if (defined $fix_elements[$n + 2]) {
5208								$fix_elements[$n + 2] =~ s/^\s+//;
5209							}
5210							$line_fixed = 1;
5211						}
5212					}
5213				}
5214				$off += length($elements[$n + 1]);
5215
5216##				print("n: <$n> GOOD: <$good>\n");
5217
5218				$fixed_line = $fixed_line . $good;
5219			}
5220
5221			if (($#elements % 2) == 0) {
5222				$fixed_line = $fixed_line . $fix_elements[$#elements];
5223			}
5224
5225			if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
5226				$fixed[$fixlinenr] = $fixed_line;
5227			}
5228
5229
5230		}
5231
5232# check for whitespace before a non-naked semicolon
5233		if ($line =~ /^\+.*\S\s+;\s*$/) {
5234			if (WARN("SPACING",
5235				 "space prohibited before semicolon\n" . $herecurr) &&
5236			    $fix) {
5237				1 while $fixed[$fixlinenr] =~
5238				    s/^(\+.*\S)\s+;/$1;/;
5239			}
5240		}
5241
5242# check for multiple assignments
5243		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
5244			CHK("MULTIPLE_ASSIGNMENTS",
5245			    "multiple assignments should be avoided\n" . $herecurr);
5246		}
5247
5248## # check for multiple declarations, allowing for a function declaration
5249## # continuation.
5250## 		if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
5251## 		    $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
5252##
5253## 			# Remove any bracketed sections to ensure we do not
5254## 			# falsely report the parameters of functions.
5255## 			my $ln = $line;
5256## 			while ($ln =~ s/\([^\(\)]*\)//g) {
5257## 			}
5258## 			if ($ln =~ /,/) {
5259## 				WARN("MULTIPLE_DECLARATION",
5260##				     "declaring multiple variables together should be avoided\n" . $herecurr);
5261## 			}
5262## 		}
5263
5264#need space before brace following if, while, etc
5265		if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||
5266		    $line =~ /\b(?:else|do)\{/) {
5267			if (ERROR("SPACING",
5268				  "space required before the open brace '{'\n" . $herecurr) &&
5269			    $fix) {
5270				$fixed[$fixlinenr] =~ s/^(\+.*(?:do|else|\)))\{/$1 {/;
5271			}
5272		}
5273
5274## # check for blank lines before declarations
5275##		if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
5276##		    $prevrawline =~ /^.\s*$/) {
5277##			WARN("SPACING",
5278##			     "No blank lines before declarations\n" . $hereprev);
5279##		}
5280##
5281
5282# closing brace should have a space following it when it has anything
5283# on the line
5284		if ($line =~ /}(?!(?:,|;|\)|\}))\S/) {
5285			if (ERROR("SPACING",
5286				  "space required after that close brace '}'\n" . $herecurr) &&
5287			    $fix) {
5288				$fixed[$fixlinenr] =~
5289				    s/}((?!(?:,|;|\)))\S)/} $1/;
5290			}
5291		}
5292
5293# check spacing on square brackets
5294		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
5295			if (ERROR("SPACING",
5296				  "space prohibited after that open square bracket '['\n" . $herecurr) &&
5297			    $fix) {
5298				$fixed[$fixlinenr] =~
5299				    s/\[\s+/\[/;
5300			}
5301		}
5302		if ($line =~ /\s\]/) {
5303			if (ERROR("SPACING",
5304				  "space prohibited before that close square bracket ']'\n" . $herecurr) &&
5305			    $fix) {
5306				$fixed[$fixlinenr] =~
5307				    s/\s+\]/\]/;
5308			}
5309		}
5310
5311# check spacing on parentheses
5312		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
5313		    $line !~ /for\s*\(\s+;/) {
5314			if (ERROR("SPACING",
5315				  "space prohibited after that open parenthesis '('\n" . $herecurr) &&
5316			    $fix) {
5317				$fixed[$fixlinenr] =~
5318				    s/\(\s+/\(/;
5319			}
5320		}
5321		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
5322		    $line !~ /for\s*\(.*;\s+\)/ &&
5323		    $line !~ /:\s+\)/) {
5324			if (ERROR("SPACING",
5325				  "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
5326			    $fix) {
5327				$fixed[$fixlinenr] =~
5328				    s/\s+\)/\)/;
5329			}
5330		}
5331
5332# check unnecessary parentheses around addressof/dereference single $Lvals
5333# ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar
5334
5335		while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) {
5336			my $var = $1;
5337			if (CHK("UNNECESSARY_PARENTHESES",
5338				"Unnecessary parentheses around $var\n" . $herecurr) &&
5339			    $fix) {
5340				$fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/;
5341			}
5342		}
5343
5344# check for unnecessary parentheses around function pointer uses
5345# ie: (foo->bar)(); should be foo->bar();
5346# but not "if (foo->bar) (" to avoid some false positives
5347		if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) {
5348			my $var = $2;
5349			if (CHK("UNNECESSARY_PARENTHESES",
5350				"Unnecessary parentheses around function pointer $var\n" . $herecurr) &&
5351			    $fix) {
5352				my $var2 = deparenthesize($var);
5353				$var2 =~ s/\s//g;
5354				$fixed[$fixlinenr] =~ s/\Q$var\E/$var2/;
5355			}
5356		}
5357
5358# check for unnecessary parentheses around comparisons in if uses
5359# when !drivers/staging or command-line uses --strict
5360		if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) &&
5361		    $perl_version_ok && defined($stat) &&
5362		    $stat =~ /(^.\s*if\s*($balanced_parens))/) {
5363			my $if_stat = $1;
5364			my $test = substr($2, 1, -1);
5365			my $herectx;
5366			while ($test =~ /(?:^|[^\w\&\!\~])+\s*\(\s*([\&\!\~]?\s*$Lval\s*(?:$Compare\s*$FuncArg)?)\s*\)/g) {
5367				my $match = $1;
5368				# avoid parentheses around potential macro args
5369				next if ($match =~ /^\s*\w+\s*$/);
5370				if (!defined($herectx)) {
5371					$herectx = $here . "\n";
5372					my $cnt = statement_rawlines($if_stat);
5373					for (my $n = 0; $n < $cnt; $n++) {
5374						my $rl = raw_line($linenr, $n);
5375						$herectx .=  $rl . "\n";
5376						last if $rl =~ /^[ \+].*\{/;
5377					}
5378				}
5379				CHK("UNNECESSARY_PARENTHESES",
5380				    "Unnecessary parentheses around '$match'\n" . $herectx);
5381			}
5382		}
5383
5384# check that goto labels aren't indented (allow a single space indentation)
5385# and ignore bitfield definitions like foo:1
5386# Strictly, labels can have whitespace after the identifier and before the :
5387# but this is not allowed here as many ?: uses would appear to be labels
5388		if ($sline =~ /^.\s+[A-Za-z_][A-Za-z\d_]*:(?!\s*\d+)/ &&
5389		    $sline !~ /^. [A-Za-z\d_][A-Za-z\d_]*:/ &&
5390		    $sline !~ /^.\s+default:/) {
5391			if (WARN("INDENTED_LABEL",
5392				 "labels should not be indented\n" . $herecurr) &&
5393			    $fix) {
5394				$fixed[$fixlinenr] =~
5395				    s/^(.)\s+/$1/;
5396			}
5397		}
5398
5399# check if a statement with a comma should be two statements like:
5400#	foo = bar(),	/* comma should be semicolon */
5401#	bar = baz();
5402		if (defined($stat) &&
5403		    $stat =~ /^\+\s*(?:$Lval\s*$Assignment\s*)?$FuncArg\s*,\s*(?:$Lval\s*$Assignment\s*)?$FuncArg\s*;\s*$/) {
5404			my $cnt = statement_rawlines($stat);
5405			my $herectx = get_stat_here($linenr, $cnt, $here);
5406			WARN("SUSPECT_COMMA_SEMICOLON",
5407			     "Possible comma where semicolon could be used\n" . $herectx);
5408		}
5409
5410# return is not a function
5411		if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
5412			my $spacing = $1;
5413			if ($perl_version_ok &&
5414			    $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {
5415				my $value = $1;
5416				$value = deparenthesize($value);
5417				if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {
5418					ERROR("RETURN_PARENTHESES",
5419					      "return is not a function, parentheses are not required\n" . $herecurr);
5420				}
5421			} elsif ($spacing !~ /\s+/) {
5422				ERROR("SPACING",
5423				      "space required before the open parenthesis '('\n" . $herecurr);
5424			}
5425		}
5426
5427# unnecessary return in a void function
5428# at end-of-function, with the previous line a single leading tab, then return;
5429# and the line before that not a goto label target like "out:"
5430		if ($sline =~ /^[ \+]}\s*$/ &&
5431		    $prevline =~ /^\+\treturn\s*;\s*$/ &&
5432		    $linenr >= 3 &&
5433		    $lines[$linenr - 3] =~ /^[ +]/ &&
5434		    $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {
5435			WARN("RETURN_VOID",
5436			     "void function return statements are not generally useful\n" . $hereprev);
5437		}
5438
5439# if statements using unnecessary parentheses - ie: if ((foo == bar))
5440		if ($perl_version_ok &&
5441		    $line =~ /\bif\s*((?:\(\s*){2,})/) {
5442			my $openparens = $1;
5443			my $count = $openparens =~ tr@\(@\(@;
5444			my $msg = "";
5445			if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
5446				my $comp = $4;	#Not $1 because of $LvalOrFunc
5447				$msg = " - maybe == should be = ?" if ($comp eq "==");
5448				WARN("UNNECESSARY_PARENTHESES",
5449				     "Unnecessary parentheses$msg\n" . $herecurr);
5450			}
5451		}
5452
5453# comparisons with a constant or upper case identifier on the left
5454#	avoid cases like "foo + BAR < baz"
5455#	only fix matches surrounded by parentheses to avoid incorrect
5456#	conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5"
5457		if ($perl_version_ok &&
5458		    $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) {
5459			my $lead = $1;
5460			my $const = $2;
5461			my $comp = $3;
5462			my $to = $4;
5463			my $newcomp = $comp;
5464			if ($lead !~ /(?:$Operators|\.)\s*$/ &&
5465			    $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ &&
5466			    WARN("CONSTANT_COMPARISON",
5467				 "Comparisons should place the constant on the right side of the test\n" . $herecurr) &&
5468			    $fix) {
5469				if ($comp eq "<") {
5470					$newcomp = ">";
5471				} elsif ($comp eq "<=") {
5472					$newcomp = ">=";
5473				} elsif ($comp eq ">") {
5474					$newcomp = "<";
5475				} elsif ($comp eq ">=") {
5476					$newcomp = "<=";
5477				}
5478				$fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/;
5479			}
5480		}
5481
5482# Return of what appears to be an errno should normally be negative
5483		if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) {
5484			my $name = $1;
5485			if ($name ne 'EOF' && $name ne 'ERROR' && $name !~ /^EPOLL/) {
5486				WARN("USE_NEGATIVE_ERRNO",
5487				     "return of an errno should typically be negative (ie: return -$1)\n" . $herecurr);
5488			}
5489		}
5490
5491# Need a space before open parenthesis after if, while etc
5492		if ($line =~ /\b(if|while|for|switch)\(/) {
5493			if (ERROR("SPACING",
5494				  "space required before the open parenthesis '('\n" . $herecurr) &&
5495			    $fix) {
5496				$fixed[$fixlinenr] =~
5497				    s/\b(if|while|for|switch)\(/$1 \(/;
5498			}
5499		}
5500
5501# Check for illegal assignment in if conditional -- and check for trailing
5502# statements after the conditional.
5503		if ($line =~ /do\s*(?!{)/) {
5504			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
5505				ctx_statement_block($linenr, $realcnt, 0)
5506					if (!defined $stat);
5507			my ($stat_next) = ctx_statement_block($line_nr_next,
5508						$remain_next, $off_next);
5509			$stat_next =~ s/\n./\n /g;
5510			##print "stat<$stat> stat_next<$stat_next>\n";
5511
5512			if ($stat_next =~ /^\s*while\b/) {
5513				# If the statement carries leading newlines,
5514				# then count those as offsets.
5515				my ($whitespace) =
5516					($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
5517				my $offset =
5518					statement_rawlines($whitespace) - 1;
5519
5520				$suppress_whiletrailers{$line_nr_next +
5521								$offset} = 1;
5522			}
5523		}
5524		if (!defined $suppress_whiletrailers{$linenr} &&
5525		    defined($stat) && defined($cond) &&
5526		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
5527			my ($s, $c) = ($stat, $cond);
5528
5529			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
5530				if (ERROR("ASSIGN_IN_IF",
5531					  "do not use assignment in if condition\n" . $herecurr) &&
5532				    $fix && $perl_version_ok) {
5533					if ($rawline =~ /^\+(\s+)if\s*\(\s*(\!)?\s*\(\s*(($Lval)\s*=\s*$LvalOrFunc)\s*\)\s*(?:($Compare)\s*($FuncArg))?\s*\)\s*(\{)?\s*$/) {
5534						my $space = $1;
5535						my $not = $2;
5536						my $statement = $3;
5537						my $assigned = $4;
5538						my $test = $8;
5539						my $against = $9;
5540						my $brace = $15;
5541						fix_delete_line($fixlinenr, $rawline);
5542						fix_insert_line($fixlinenr, "$space$statement;");
5543						my $newline = "${space}if (";
5544						$newline .= '!' if defined($not);
5545						$newline .= '(' if (defined $not && defined($test) && defined($against));
5546						$newline .= "$assigned";
5547						$newline .= " $test $against" if (defined($test) && defined($against));
5548						$newline .= ')' if (defined $not && defined($test) && defined($against));
5549						$newline .= ')';
5550						$newline .= " {" if (defined($brace));
5551						fix_insert_line($fixlinenr + 1, $newline);
5552					}
5553				}
5554			}
5555
5556			# Find out what is on the end of the line after the
5557			# conditional.
5558			substr($s, 0, length($c), '');
5559			$s =~ s/\n.*//g;
5560			$s =~ s/$;//g;	# Remove any comments
5561			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
5562			    $c !~ /}\s*while\s*/)
5563			{
5564				# Find out how long the conditional actually is.
5565				my @newlines = ($c =~ /\n/gs);
5566				my $cond_lines = 1 + $#newlines;
5567				my $stat_real = '';
5568
5569				$stat_real = raw_line($linenr, $cond_lines)
5570							. "\n" if ($cond_lines);
5571				if (defined($stat_real) && $cond_lines > 1) {
5572					$stat_real = "[...]\n$stat_real";
5573				}
5574
5575				ERROR("TRAILING_STATEMENTS",
5576				      "trailing statements should be on next line\n" . $herecurr . $stat_real);
5577			}
5578		}
5579
5580# Check for bitwise tests written as boolean
5581		if ($line =~ /
5582			(?:
5583				(?:\[|\(|\&\&|\|\|)
5584				\s*0[xX][0-9]+\s*
5585				(?:\&\&|\|\|)
5586			|
5587				(?:\&\&|\|\|)
5588				\s*0[xX][0-9]+\s*
5589				(?:\&\&|\|\||\)|\])
5590			)/x)
5591		{
5592			WARN("HEXADECIMAL_BOOLEAN_TEST",
5593			     "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
5594		}
5595
5596# if and else should not have general statements after it
5597		if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
5598			my $s = $1;
5599			$s =~ s/$;//g;	# Remove any comments
5600			if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
5601				ERROR("TRAILING_STATEMENTS",
5602				      "trailing statements should be on next line\n" . $herecurr);
5603			}
5604		}
5605# if should not continue a brace
5606		if ($line =~ /}\s*if\b/) {
5607			ERROR("TRAILING_STATEMENTS",
5608			      "trailing statements should be on next line (or did you mean 'else if'?)\n" .
5609				$herecurr);
5610		}
5611# case and default should not have general statements after them
5612		if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
5613		    $line !~ /\G(?:
5614			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
5615			\s*return\s+
5616		    )/xg)
5617		{
5618			ERROR("TRAILING_STATEMENTS",
5619			      "trailing statements should be on next line\n" . $herecurr);
5620		}
5621
5622		# Check for }<nl>else {, these must be at the same
5623		# indent level to be relevant to each other.
5624		if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ &&
5625		    $previndent == $indent) {
5626			if (ERROR("ELSE_AFTER_BRACE",
5627				  "else should follow close brace '}'\n" . $hereprev) &&
5628			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
5629				fix_delete_line($fixlinenr - 1, $prevrawline);
5630				fix_delete_line($fixlinenr, $rawline);
5631				my $fixedline = $prevrawline;
5632				$fixedline =~ s/}\s*$//;
5633				if ($fixedline !~ /^\+\s*$/) {
5634					fix_insert_line($fixlinenr, $fixedline);
5635				}
5636				$fixedline = $rawline;
5637				$fixedline =~ s/^(.\s*)else/$1} else/;
5638				fix_insert_line($fixlinenr, $fixedline);
5639			}
5640		}
5641
5642		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
5643		    $previndent == $indent) {
5644			my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
5645
5646			# Find out what is on the end of the line after the
5647			# conditional.
5648			substr($s, 0, length($c), '');
5649			$s =~ s/\n.*//g;
5650
5651			if ($s =~ /^\s*;/) {
5652				if (ERROR("WHILE_AFTER_BRACE",
5653					  "while should follow close brace '}'\n" . $hereprev) &&
5654				    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
5655					fix_delete_line($fixlinenr - 1, $prevrawline);
5656					fix_delete_line($fixlinenr, $rawline);
5657					my $fixedline = $prevrawline;
5658					my $trailing = $rawline;
5659					$trailing =~ s/^\+//;
5660					$trailing = trim($trailing);
5661					$fixedline =~ s/}\s*$/} $trailing/;
5662					fix_insert_line($fixlinenr, $fixedline);
5663				}
5664			}
5665		}
5666
5667#Specific variable tests
5668		while ($line =~ m{($Constant|$Lval)}g) {
5669			my $var = $1;
5670
5671#CamelCase
5672			if ($var !~ /^$Constant$/ &&
5673			    $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
5674#Ignore some autogenerated defines and enum values
5675			    $var !~ /^(?:[A-Z]+_){1,5}[A-Z]{1,3}[a-z]/ &&
5676#Ignore Page<foo> variants
5677			    $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
5678#Ignore SI style variants like nS, mV and dB
5679#(ie: max_uV, regulator_min_uA_show, RANGE_mA_VALUE)
5680			    $var !~ /^(?:[a-z0-9_]*|[A-Z0-9_]*)?_?[a-z][A-Z](?:_[a-z0-9_]+|_[A-Z0-9_]+)?$/ &&
5681#Ignore some three character SI units explicitly, like MiB and KHz
5682			    $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
5683				while ($var =~ m{($Ident)}g) {
5684					my $word = $1;
5685					next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
5686					if ($check) {
5687						seed_camelcase_includes();
5688						if (!$file && !$camelcase_file_seeded) {
5689							seed_camelcase_file($realfile);
5690							$camelcase_file_seeded = 1;
5691						}
5692					}
5693					if (!defined $camelcase{$word}) {
5694						$camelcase{$word} = 1;
5695						CHK("CAMELCASE",
5696						    "Avoid CamelCase: <$word>\n" . $herecurr);
5697					}
5698				}
5699			}
5700		}
5701
5702#no spaces allowed after \ in define
5703		if ($line =~ /\#\s*define.*\\\s+$/) {
5704			if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
5705				 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
5706			    $fix) {
5707				$fixed[$fixlinenr] =~ s/\s+$//;
5708			}
5709		}
5710
5711# warn if <asm/foo.h> is #included and <linux/foo.h> is available and includes
5712# itself <asm/foo.h> (uses RAW line)
5713		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
5714			my $file = "$1.h";
5715			my $checkfile = "include/linux/$file";
5716			if (-f "$root/$checkfile" &&
5717			    $realfile ne $checkfile &&
5718			    $1 !~ /$allowed_asm_includes/)
5719			{
5720				my $asminclude = `grep -Ec "#include\\s+<asm/$file>" $root/$checkfile`;
5721				if ($asminclude > 0) {
5722					if ($realfile =~ m{^arch/}) {
5723						CHK("ARCH_INCLUDE_LINUX",
5724						    "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
5725					} else {
5726						WARN("INCLUDE_LINUX",
5727						     "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
5728					}
5729				}
5730			}
5731		}
5732
5733# multi-statement macros should be enclosed in a do while loop, grab the
5734# first statement and ensure its the whole macro if its not enclosed
5735# in a known good container
5736		if ($realfile !~ m@/vmlinux.lds.h$@ &&
5737		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
5738			my $ln = $linenr;
5739			my $cnt = $realcnt;
5740			my ($off, $dstat, $dcond, $rest);
5741			my $ctx = '';
5742			my $has_flow_statement = 0;
5743			my $has_arg_concat = 0;
5744			($dstat, $dcond, $ln, $cnt, $off) =
5745				ctx_statement_block($linenr, $realcnt, 0);
5746			$ctx = $dstat;
5747			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
5748			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
5749
5750			$has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/);
5751			$has_arg_concat = 1 if ($ctx =~ /\#\#/ && $ctx !~ /\#\#\s*(?:__VA_ARGS__|args)\b/);
5752
5753			$dstat =~ s/^.\s*\#\s*define\s+$Ident(\([^\)]*\))?\s*//;
5754			my $define_args = $1;
5755			my $define_stmt = $dstat;
5756			my @def_args = ();
5757
5758			if (defined $define_args && $define_args ne "") {
5759				$define_args = substr($define_args, 1, length($define_args) - 2);
5760				$define_args =~ s/\s*//g;
5761				$define_args =~ s/\\\+?//g;
5762				@def_args = split(",", $define_args);
5763			}
5764
5765			$dstat =~ s/$;//g;
5766			$dstat =~ s/\\\n.//g;
5767			$dstat =~ s/^\s*//s;
5768			$dstat =~ s/\s*$//s;
5769
5770			# Flatten any parentheses and braces
5771			while ($dstat =~ s/\([^\(\)]*\)/1u/ ||
5772			       $dstat =~ s/\{[^\{\}]*\}/1u/ ||
5773			       $dstat =~ s/.\[[^\[\]]*\]/1u/)
5774			{
5775			}
5776
5777			# Flatten any obvious string concatenation.
5778			while ($dstat =~ s/($String)\s*$Ident/$1/ ||
5779			       $dstat =~ s/$Ident\s*($String)/$1/)
5780			{
5781			}
5782
5783			# Make asm volatile uses seem like a generic function
5784			$dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g;
5785
5786			my $exceptions = qr{
5787				$Declare|
5788				module_param_named|
5789				MODULE_PARM_DESC|
5790				DECLARE_PER_CPU|
5791				DEFINE_PER_CPU|
5792				__typeof__\(|
5793				union|
5794				struct|
5795				\.$Ident\s*=\s*|
5796				^\"|\"$|
5797				^\[
5798			}x;
5799			#print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
5800
5801			$ctx =~ s/\n*$//;
5802			my $stmt_cnt = statement_rawlines($ctx);
5803			my $herectx = get_stat_here($linenr, $stmt_cnt, $here);
5804
5805			if ($dstat ne '' &&
5806			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),
5807			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();
5808			    $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &&		# 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
5809			    $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ &&			# character constants
5810			    $dstat !~ /$exceptions/ &&
5811			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =
5812			    $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&		# stringification #foo
5813			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)
5814			    $dstat !~ /^while\s*$Constant\s*$Constant\s*$/ &&		# while (...) {...}
5815			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)
5816			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()
5817			    $dstat !~ /^do\s*{/ &&					# do {...
5818			    $dstat !~ /^\(\{/ &&						# ({...
5819			    $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
5820			{
5821				if ($dstat =~ /^\s*if\b/) {
5822					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
5823					      "Macros starting with if should be enclosed by a do - while loop to avoid possible if/else logic defects\n" . "$herectx");
5824				} elsif ($dstat =~ /;/) {
5825					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
5826					      "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
5827				} else {
5828					ERROR("COMPLEX_MACRO",
5829					      "Macros with complex values should be enclosed in parentheses\n" . "$herectx");
5830				}
5831
5832			}
5833
5834			# Make $define_stmt single line, comment-free, etc
5835			my @stmt_array = split('\n', $define_stmt);
5836			my $first = 1;
5837			$define_stmt = "";
5838			foreach my $l (@stmt_array) {
5839				$l =~ s/\\$//;
5840				if ($first) {
5841					$define_stmt = $l;
5842					$first = 0;
5843				} elsif ($l =~ /^[\+ ]/) {
5844					$define_stmt .= substr($l, 1);
5845				}
5846			}
5847			$define_stmt =~ s/$;//g;
5848			$define_stmt =~ s/\s+/ /g;
5849			$define_stmt = trim($define_stmt);
5850
5851# check if any macro arguments are reused (ignore '...' and 'type')
5852			foreach my $arg (@def_args) {
5853			        next if ($arg =~ /\.\.\./);
5854			        next if ($arg =~ /^type$/i);
5855				my $tmp_stmt = $define_stmt;
5856				$tmp_stmt =~ s/\b(__must_be_array|offsetof|sizeof|sizeof_field|__stringify|typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;
5857				$tmp_stmt =~ s/\#+\s*$arg\b//g;
5858				$tmp_stmt =~ s/\b$arg\s*\#\#//g;
5859				my $use_cnt = () = $tmp_stmt =~ /\b$arg\b/g;
5860				if ($use_cnt > 1) {
5861					CHK("MACRO_ARG_REUSE",
5862					    "Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx");
5863				    }
5864# check if any macro arguments may have other precedence issues
5865				if ($tmp_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m &&
5866				    ((defined($1) && $1 ne ',') ||
5867				     (defined($2) && $2 ne ','))) {
5868					CHK("MACRO_ARG_PRECEDENCE",
5869					    "Macro argument '$arg' may be better as '($arg)' to avoid precedence issues\n" . "$herectx");
5870				}
5871			}
5872
5873# check for macros with flow control, but without ## concatenation
5874# ## concatenation is commonly a macro that defines a function so ignore those
5875			if ($has_flow_statement && !$has_arg_concat) {
5876				my $cnt = statement_rawlines($ctx);
5877				my $herectx = get_stat_here($linenr, $cnt, $here);
5878
5879				WARN("MACRO_WITH_FLOW_CONTROL",
5880				     "Macros with flow control statements should be avoided\n" . "$herectx");
5881			}
5882
5883# check for line continuations outside of #defines, preprocessor #, and asm
5884
5885		} else {
5886			if ($prevline !~ /^..*\\$/ &&
5887			    $line !~ /^\+\s*\#.*\\$/ &&		# preprocessor
5888			    $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&	# asm
5889			    $line =~ /^\+.*\\$/) {
5890				WARN("LINE_CONTINUATIONS",
5891				     "Avoid unnecessary line continuations\n" . $herecurr);
5892			}
5893		}
5894
5895# do {} while (0) macro tests:
5896# single-statement macros do not need to be enclosed in do while (0) loop,
5897# macro should not end with a semicolon
5898		if ($perl_version_ok &&
5899		    $realfile !~ m@/vmlinux.lds.h$@ &&
5900		    $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
5901			my $ln = $linenr;
5902			my $cnt = $realcnt;
5903			my ($off, $dstat, $dcond, $rest);
5904			my $ctx = '';
5905			($dstat, $dcond, $ln, $cnt, $off) =
5906				ctx_statement_block($linenr, $realcnt, 0);
5907			$ctx = $dstat;
5908
5909			$dstat =~ s/\\\n.//g;
5910			$dstat =~ s/$;/ /g;
5911
5912			if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
5913				my $stmts = $2;
5914				my $semis = $3;
5915
5916				$ctx =~ s/\n*$//;
5917				my $cnt = statement_rawlines($ctx);
5918				my $herectx = get_stat_here($linenr, $cnt, $here);
5919
5920				if (($stmts =~ tr/;/;/) == 1 &&
5921				    $stmts !~ /^\s*(if|while|for|switch)\b/) {
5922					WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
5923					     "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
5924				}
5925				if (defined $semis && $semis ne "") {
5926					WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
5927					     "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
5928				}
5929			} elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
5930				$ctx =~ s/\n*$//;
5931				my $cnt = statement_rawlines($ctx);
5932				my $herectx = get_stat_here($linenr, $cnt, $here);
5933
5934				WARN("TRAILING_SEMICOLON",
5935				     "macros should not use a trailing semicolon\n" . "$herectx");
5936			}
5937		}
5938
5939# check for redundant bracing round if etc
5940		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
5941			my ($level, $endln, @chunks) =
5942				ctx_statement_full($linenr, $realcnt, 1);
5943			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
5944			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
5945			if ($#chunks > 0 && $level == 0) {
5946				my @allowed = ();
5947				my $allow = 0;
5948				my $seen = 0;
5949				my $herectx = $here . "\n";
5950				my $ln = $linenr - 1;
5951				for my $chunk (@chunks) {
5952					my ($cond, $block) = @{$chunk};
5953
5954					# If the condition carries leading newlines, then count those as offsets.
5955					my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
5956					my $offset = statement_rawlines($whitespace) - 1;
5957
5958					$allowed[$allow] = 0;
5959					#print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
5960
5961					# We have looked at and allowed this specific line.
5962					$suppress_ifbraces{$ln + $offset} = 1;
5963
5964					$herectx .= "$rawlines[$ln + $offset]\n[...]\n";
5965					$ln += statement_rawlines($block) - 1;
5966
5967					substr($block, 0, length($cond), '');
5968
5969					$seen++ if ($block =~ /^\s*{/);
5970
5971					#print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
5972					if (statement_lines($cond) > 1) {
5973						#print "APW: ALLOWED: cond<$cond>\n";
5974						$allowed[$allow] = 1;
5975					}
5976					if ($block =~/\b(?:if|for|while)\b/) {
5977						#print "APW: ALLOWED: block<$block>\n";
5978						$allowed[$allow] = 1;
5979					}
5980					if (statement_block_size($block) > 1) {
5981						#print "APW: ALLOWED: lines block<$block>\n";
5982						$allowed[$allow] = 1;
5983					}
5984					$allow++;
5985				}
5986				if ($seen) {
5987					my $sum_allowed = 0;
5988					foreach (@allowed) {
5989						$sum_allowed += $_;
5990					}
5991					if ($sum_allowed == 0) {
5992						WARN("BRACES",
5993						     "braces {} are not necessary for any arm of this statement\n" . $herectx);
5994					} elsif ($sum_allowed != $allow &&
5995						 $seen != $allow) {
5996						CHK("BRACES",
5997						    "braces {} should be used on all arms of this statement\n" . $herectx);
5998					}
5999				}
6000			}
6001		}
6002		if (!defined $suppress_ifbraces{$linenr - 1} &&
6003					$line =~ /\b(if|while|for|else)\b/) {
6004			my $allowed = 0;
6005
6006			# Check the pre-context.
6007			if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
6008				#print "APW: ALLOWED: pre<$1>\n";
6009				$allowed = 1;
6010			}
6011
6012			my ($level, $endln, @chunks) =
6013				ctx_statement_full($linenr, $realcnt, $-[0]);
6014
6015			# Check the condition.
6016			my ($cond, $block) = @{$chunks[0]};
6017			#print "CHECKING<$linenr> cond<$cond> block<$block>\n";
6018			if (defined $cond) {
6019				substr($block, 0, length($cond), '');
6020			}
6021			if (statement_lines($cond) > 1) {
6022				#print "APW: ALLOWED: cond<$cond>\n";
6023				$allowed = 1;
6024			}
6025			if ($block =~/\b(?:if|for|while)\b/) {
6026				#print "APW: ALLOWED: block<$block>\n";
6027				$allowed = 1;
6028			}
6029			if (statement_block_size($block) > 1) {
6030				#print "APW: ALLOWED: lines block<$block>\n";
6031				$allowed = 1;
6032			}
6033			# Check the post-context.
6034			if (defined $chunks[1]) {
6035				my ($cond, $block) = @{$chunks[1]};
6036				if (defined $cond) {
6037					substr($block, 0, length($cond), '');
6038				}
6039				if ($block =~ /^\s*\{/) {
6040					#print "APW: ALLOWED: chunk-1 block<$block>\n";
6041					$allowed = 1;
6042				}
6043			}
6044			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
6045				my $cnt = statement_rawlines($block);
6046				my $herectx = get_stat_here($linenr, $cnt, $here);
6047
6048				WARN("BRACES",
6049				     "braces {} are not necessary for single statement blocks\n" . $herectx);
6050			}
6051		}
6052
6053# check for single line unbalanced braces
6054		if ($sline =~ /^.\s*\}\s*else\s*$/ ||
6055		    $sline =~ /^.\s*else\s*\{\s*$/) {
6056			CHK("BRACES", "Unbalanced braces around else statement\n" . $herecurr);
6057		}
6058
6059# check for unnecessary blank lines around braces
6060		if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
6061			if (CHK("BRACES",
6062				"Blank lines aren't necessary before a close brace '}'\n" . $hereprev) &&
6063			    $fix && $prevrawline =~ /^\+/) {
6064				fix_delete_line($fixlinenr - 1, $prevrawline);
6065			}
6066		}
6067		if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
6068			if (CHK("BRACES",
6069				"Blank lines aren't necessary after an open brace '{'\n" . $hereprev) &&
6070			    $fix) {
6071				fix_delete_line($fixlinenr, $rawline);
6072			}
6073		}
6074
6075# no volatiles please
6076		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
6077		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
6078			WARN("VOLATILE",
6079			     "Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst\n" . $herecurr);
6080		}
6081
6082# Check for user-visible strings broken across lines, which breaks the ability
6083# to grep for the string.  Make exceptions when the previous string ends in a
6084# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
6085# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
6086		if ($line =~ /^\+\s*$String/ &&
6087		    $prevline =~ /"\s*$/ &&
6088		    $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
6089			if (WARN("SPLIT_STRING",
6090				 "quoted string split across lines\n" . $hereprev) &&
6091				     $fix &&
6092				     $prevrawline =~ /^\+.*"\s*$/ &&
6093				     $last_coalesced_string_linenr != $linenr - 1) {
6094				my $extracted_string = get_quoted_string($line, $rawline);
6095				my $comma_close = "";
6096				if ($rawline =~ /\Q$extracted_string\E(\s*\)\s*;\s*$|\s*,\s*)/) {
6097					$comma_close = $1;
6098				}
6099
6100				fix_delete_line($fixlinenr - 1, $prevrawline);
6101				fix_delete_line($fixlinenr, $rawline);
6102				my $fixedline = $prevrawline;
6103				$fixedline =~ s/"\s*$//;
6104				$fixedline .= substr($extracted_string, 1) . trim($comma_close);
6105				fix_insert_line($fixlinenr - 1, $fixedline);
6106				$fixedline = $rawline;
6107				$fixedline =~ s/\Q$extracted_string\E\Q$comma_close\E//;
6108				if ($fixedline !~ /\+\s*$/) {
6109					fix_insert_line($fixlinenr, $fixedline);
6110				}
6111				$last_coalesced_string_linenr = $linenr;
6112			}
6113		}
6114
6115# check for missing a space in a string concatenation
6116		if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) {
6117			WARN('MISSING_SPACE',
6118			     "break quoted strings at a space character\n" . $hereprev);
6119		}
6120
6121# check for an embedded function name in a string when the function is known
6122# This does not work very well for -f --file checking as it depends on patch
6123# context providing the function name or a single line form for in-file
6124# function declarations
6125		if ($line =~ /^\+.*$String/ &&
6126		    defined($context_function) &&
6127		    get_quoted_string($line, $rawline) =~ /\b$context_function\b/ &&
6128		    length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) {
6129			WARN("EMBEDDED_FUNCTION_NAME",
6130			     "Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string\n" . $herecurr);
6131		}
6132
6133# check for unnecessary function tracing like uses
6134# This does not use $logFunctions because there are many instances like
6135# 'dprintk(FOO, "%s()\n", __func__);' which do not match $logFunctions
6136		if ($rawline =~ /^\+.*\([^"]*"$tracing_logging_tags{0,3}%s(?:\s*\(\s*\)\s*)?$tracing_logging_tags{0,3}(?:\\n)?"\s*,\s*__func__\s*\)\s*;/) {
6137			if (WARN("TRACING_LOGGING",
6138				 "Unnecessary ftrace-like logging - prefer using ftrace\n" . $herecurr) &&
6139			    $fix) {
6140                                fix_delete_line($fixlinenr, $rawline);
6141			}
6142		}
6143
6144# check for spaces before a quoted newline
6145		if ($rawline =~ /^.*\".*\s\\n/) {
6146			if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
6147				 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
6148			    $fix) {
6149				$fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
6150			}
6151
6152		}
6153
6154# concatenated string without spaces between elements
6155		if ($line =~ /$String[A-Z_]/ ||
6156		    ($line =~ /([A-Za-z0-9_]+)$String/ && $1 !~ /^[Lu]$/)) {
6157			if (CHK("CONCATENATED_STRING",
6158				"Concatenated strings should use spaces between elements\n" . $herecurr) &&
6159			    $fix) {
6160				while ($line =~ /($String)/g) {
6161					my $extracted_string = substr($rawline, $-[0], $+[0] - $-[0]);
6162					$fixed[$fixlinenr] =~ s/\Q$extracted_string\E([A-Za-z0-9_])/$extracted_string $1/;
6163					$fixed[$fixlinenr] =~ s/([A-Za-z0-9_])\Q$extracted_string\E/$1 $extracted_string/;
6164				}
6165			}
6166		}
6167
6168# uncoalesced string fragments
6169		if ($line =~ /$String\s*[Lu]?"/) {
6170			if (WARN("STRING_FRAGMENTS",
6171				 "Consecutive strings are generally better as a single string\n" . $herecurr) &&
6172			    $fix) {
6173				while ($line =~ /($String)(?=\s*")/g) {
6174					my $extracted_string = substr($rawline, $-[0], $+[0] - $-[0]);
6175					$fixed[$fixlinenr] =~ s/\Q$extracted_string\E\s*"/substr($extracted_string, 0, -1)/e;
6176				}
6177			}
6178		}
6179
6180# check for non-standard and hex prefixed decimal printf formats
6181		my $show_L = 1;	#don't show the same defect twice
6182		my $show_Z = 1;
6183		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
6184			my $string = substr($rawline, $-[1], $+[1] - $-[1]);
6185			$string =~ s/%%/__/g;
6186			# check for %L
6187			if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) {
6188				WARN("PRINTF_L",
6189				     "\%L$1 is non-standard C, use %ll$1\n" . $herecurr);
6190				$show_L = 0;
6191			}
6192			# check for %Z
6193			if ($show_Z && $string =~ /%[\*\d\.\$]*Z([diouxX])/) {
6194				WARN("PRINTF_Z",
6195				     "%Z$1 is non-standard C, use %z$1\n" . $herecurr);
6196				$show_Z = 0;
6197			}
6198			# check for 0x<decimal>
6199			if ($string =~ /0x%[\*\d\.\$\Llzth]*[diou]/) {
6200				ERROR("PRINTF_0XDECIMAL",
6201				      "Prefixing 0x with decimal output is defective\n" . $herecurr);
6202			}
6203		}
6204
6205# check for line continuations in quoted strings with odd counts of "
6206		if ($rawline =~ /\\$/ && $sline =~ tr/"/"/ % 2) {
6207			WARN("LINE_CONTINUATIONS",
6208			     "Avoid line continuations in quoted strings\n" . $herecurr);
6209		}
6210
6211# warn about #if 0
6212		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
6213			WARN("IF_0",
6214			     "Consider removing the code enclosed by this #if 0 and its #endif\n" . $herecurr);
6215		}
6216
6217# warn about #if 1
6218		if ($line =~ /^.\s*\#\s*if\s+1\b/) {
6219			WARN("IF_1",
6220			     "Consider removing the #if 1 and its #endif\n" . $herecurr);
6221		}
6222
6223# check for needless "if (<foo>) fn(<foo>)" uses
6224		if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
6225			my $tested = quotemeta($1);
6226			my $expr = '\s*\(\s*' . $tested . '\s*\)\s*;';
6227			if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?|(?:kmem_cache|mempool|dma_pool)_destroy)$expr/) {
6228				my $func = $1;
6229				if (WARN('NEEDLESS_IF',
6230					 "$func(NULL) is safe and this check is probably not required\n" . $hereprev) &&
6231				    $fix) {
6232					my $do_fix = 1;
6233					my $leading_tabs = "";
6234					my $new_leading_tabs = "";
6235					if ($lines[$linenr - 2] =~ /^\+(\t*)if\s*\(\s*$tested\s*\)\s*$/) {
6236						$leading_tabs = $1;
6237					} else {
6238						$do_fix = 0;
6239					}
6240					if ($lines[$linenr - 1] =~ /^\+(\t+)$func\s*\(\s*$tested\s*\)\s*;\s*$/) {
6241						$new_leading_tabs = $1;
6242						if (length($leading_tabs) + 1 ne length($new_leading_tabs)) {
6243							$do_fix = 0;
6244						}
6245					} else {
6246						$do_fix = 0;
6247					}
6248					if ($do_fix) {
6249						fix_delete_line($fixlinenr - 1, $prevrawline);
6250						$fixed[$fixlinenr] =~ s/^\+$new_leading_tabs/\+$leading_tabs/;
6251					}
6252				}
6253			}
6254		}
6255
6256# check for unnecessary "Out of Memory" messages
6257		if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
6258		    $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
6259		    (defined $1 || defined $3) &&
6260		    $linenr > 3) {
6261			my $testval = $2;
6262			my $testline = $lines[$linenr - 3];
6263
6264			my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
6265#			print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n");
6266
6267			if ($s =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*$allocFunctions\s*\(/ &&
6268			    $s !~ /\b__GFP_NOWARN\b/ ) {
6269				WARN("OOM_MESSAGE",
6270				     "Possible unnecessary 'out of memory' message\n" . $hereprev);
6271			}
6272		}
6273
6274# check for logging functions with KERN_<LEVEL>
6275		if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ &&
6276		    $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) {
6277			my $level = $1;
6278			if (WARN("UNNECESSARY_KERN_LEVEL",
6279				 "Possible unnecessary $level\n" . $herecurr) &&
6280			    $fix) {
6281				$fixed[$fixlinenr] =~ s/\s*$level\s*//;
6282			}
6283		}
6284
6285# check for logging continuations
6286		if ($line =~ /\bprintk\s*\(\s*KERN_CONT\b|\bpr_cont\s*\(/) {
6287			WARN("LOGGING_CONTINUATION",
6288			     "Avoid logging continuation uses where feasible\n" . $herecurr);
6289		}
6290
6291# check for unnecessary use of %h[xudi] and %hh[xudi] in logging functions
6292		if (defined $stat &&
6293		    $line =~ /\b$logFunctions\s*\(/ &&
6294		    index($stat, '"') >= 0) {
6295			my $lc = $stat =~ tr@\n@@;
6296			$lc = $lc + $linenr;
6297			my $stat_real = get_stat_real($linenr, $lc);
6298			pos($stat_real) = index($stat_real, '"');
6299			while ($stat_real =~ /[^\"%]*(%[\#\d\.\*\-]*(h+)[idux])/g) {
6300				my $pspec = $1;
6301				my $h = $2;
6302				my $lineoff = substr($stat_real, 0, $-[1]) =~ tr@\n@@;
6303				if (WARN("UNNECESSARY_MODIFIER",
6304					 "Integer promotion: Using '$h' in '$pspec' is unnecessary\n" . "$here\n$stat_real\n") &&
6305				    $fix && $fixed[$fixlinenr + $lineoff] =~ /^\+/) {
6306					my $nspec = $pspec;
6307					$nspec =~ s/h//g;
6308					$fixed[$fixlinenr + $lineoff] =~ s/\Q$pspec\E/$nspec/;
6309				}
6310			}
6311		}
6312
6313# check for mask then right shift without a parentheses
6314		if ($perl_version_ok &&
6315		    $line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ &&
6316		    $4 !~ /^\&/) { # $LvalOrFunc may be &foo, ignore if so
6317			WARN("MASK_THEN_SHIFT",
6318			     "Possible precedence defect with mask then right shift - may need parentheses\n" . $herecurr);
6319		}
6320
6321# check for pointer comparisons to NULL
6322		if ($perl_version_ok) {
6323			while ($line =~ /\b$LvalOrFunc\s*(==|\!=)\s*NULL\b/g) {
6324				my $val = $1;
6325				my $equal = "!";
6326				$equal = "" if ($4 eq "!=");
6327				if (CHK("COMPARISON_TO_NULL",
6328					"Comparison to NULL could be written \"${equal}${val}\"\n" . $herecurr) &&
6329					    $fix) {
6330					$fixed[$fixlinenr] =~ s/\b\Q$val\E\s*(?:==|\!=)\s*NULL\b/$equal$val/;
6331				}
6332			}
6333		}
6334
6335# check for bad placement of section $InitAttribute (e.g.: __initdata)
6336		if ($line =~ /(\b$InitAttribute\b)/) {
6337			my $attr = $1;
6338			if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
6339				my $ptr = $1;
6340				my $var = $2;
6341				if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
6342				      ERROR("MISPLACED_INIT",
6343					    "$attr should be placed after $var\n" . $herecurr)) ||
6344				     ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
6345				      WARN("MISPLACED_INIT",
6346					   "$attr should be placed after $var\n" . $herecurr))) &&
6347				    $fix) {
6348					$fixed[$fixlinenr] =~ s/(\bstatic\s+(?:const\s+)?)(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*([=;])\s*/"$1" . trim(string_find_replace($2, "\\s*$attr\\s*", " ")) . " " . trim(string_find_replace($3, "\\s*$attr\\s*", "")) . " $attr" . ("$4" eq ";" ? ";" : " = ")/e;
6349				}
6350			}
6351		}
6352
6353# check for $InitAttributeData (ie: __initdata) with const
6354		if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
6355			my $attr = $1;
6356			$attr =~ /($InitAttributePrefix)(.*)/;
6357			my $attr_prefix = $1;
6358			my $attr_type = $2;
6359			if (ERROR("INIT_ATTRIBUTE",
6360				  "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
6361			    $fix) {
6362				$fixed[$fixlinenr] =~
6363				    s/$InitAttributeData/${attr_prefix}initconst/;
6364			}
6365		}
6366
6367# check for $InitAttributeConst (ie: __initconst) without const
6368		if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
6369			my $attr = $1;
6370			if (ERROR("INIT_ATTRIBUTE",
6371				  "Use of $attr requires a separate use of const\n" . $herecurr) &&
6372			    $fix) {
6373				my $lead = $fixed[$fixlinenr] =~
6374				    /(^\+\s*(?:static\s+))/;
6375				$lead = rtrim($1);
6376				$lead = "$lead " if ($lead !~ /^\+$/);
6377				$lead = "${lead}const ";
6378				$fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
6379			}
6380		}
6381
6382# check for __read_mostly with const non-pointer (should just be const)
6383		if ($line =~ /\b__read_mostly\b/ &&
6384		    $line =~ /($Type)\s*$Ident/ && $1 !~ /\*\s*$/ && $1 =~ /\bconst\b/) {
6385			if (ERROR("CONST_READ_MOSTLY",
6386				  "Invalid use of __read_mostly with const type\n" . $herecurr) &&
6387			    $fix) {
6388				$fixed[$fixlinenr] =~ s/\s+__read_mostly\b//;
6389			}
6390		}
6391
6392# don't use __constant_<foo> functions outside of include/uapi/
6393		if ($realfile !~ m@^include/uapi/@ &&
6394		    $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
6395			my $constant_func = $1;
6396			my $func = $constant_func;
6397			$func =~ s/^__constant_//;
6398			if (WARN("CONSTANT_CONVERSION",
6399				 "$constant_func should be $func\n" . $herecurr) &&
6400			    $fix) {
6401				$fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
6402			}
6403		}
6404
6405# prefer usleep_range over udelay
6406		if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
6407			my $delay = $1;
6408			# ignore udelay's < 10, however
6409			if (! ($delay < 10) ) {
6410				CHK("USLEEP_RANGE",
6411				    "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.rst\n" . $herecurr);
6412			}
6413			if ($delay > 2000) {
6414				WARN("LONG_UDELAY",
6415				     "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr);
6416			}
6417		}
6418
6419# warn about unexpectedly long msleep's
6420		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
6421			if ($1 < 20) {
6422				WARN("MSLEEP",
6423				     "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.rst\n" . $herecurr);
6424			}
6425		}
6426
6427# check for comparisons of jiffies
6428		if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
6429			WARN("JIFFIES_COMPARISON",
6430			     "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
6431		}
6432
6433# check for comparisons of get_jiffies_64()
6434		if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
6435			WARN("JIFFIES_COMPARISON",
6436			     "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
6437		}
6438
6439# warn about #ifdefs in C files
6440#		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
6441#			print "#ifdef in C files should be avoided\n";
6442#			print "$herecurr";
6443#			$clean = 0;
6444#		}
6445
6446# warn about spacing in #ifdefs
6447		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
6448			if (ERROR("SPACING",
6449				  "exactly one space required after that #$1\n" . $herecurr) &&
6450			    $fix) {
6451				$fixed[$fixlinenr] =~
6452				    s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
6453			}
6454
6455		}
6456
6457# check for spinlock_t definitions without a comment.
6458		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
6459		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
6460			my $which = $1;
6461			if (!ctx_has_comment($first_line, $linenr)) {
6462				CHK("UNCOMMENTED_DEFINITION",
6463				    "$1 definition without comment\n" . $herecurr);
6464			}
6465		}
6466# check for memory barriers without a comment.
6467
6468		my $barriers = qr{
6469			mb|
6470			rmb|
6471			wmb
6472		}x;
6473		my $barrier_stems = qr{
6474			mb__before_atomic|
6475			mb__after_atomic|
6476			store_release|
6477			load_acquire|
6478			store_mb|
6479			(?:$barriers)
6480		}x;
6481		my $all_barriers = qr{
6482			(?:$barriers)|
6483			smp_(?:$barrier_stems)|
6484			virt_(?:$barrier_stems)
6485		}x;
6486
6487		if ($line =~ /\b(?:$all_barriers)\s*\(/) {
6488			if (!ctx_has_comment($first_line, $linenr)) {
6489				WARN("MEMORY_BARRIER",
6490				     "memory barrier without comment\n" . $herecurr);
6491			}
6492		}
6493
6494		my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}x;
6495
6496		if ($realfile !~ m@^include/asm-generic/@ &&
6497		    $realfile !~ m@/barrier\.h$@ &&
6498		    $line =~ m/\b(?:$underscore_smp_barriers)\s*\(/ &&
6499		    $line !~ m/^.\s*\#\s*define\s+(?:$underscore_smp_barriers)\s*\(/) {
6500			WARN("MEMORY_BARRIER",
6501			     "__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr);
6502		}
6503
6504# check for waitqueue_active without a comment.
6505		if ($line =~ /\bwaitqueue_active\s*\(/) {
6506			if (!ctx_has_comment($first_line, $linenr)) {
6507				WARN("WAITQUEUE_ACTIVE",
6508				     "waitqueue_active without comment\n" . $herecurr);
6509			}
6510		}
6511
6512# check for data_race without a comment.
6513		if ($line =~ /\bdata_race\s*\(/) {
6514			if (!ctx_has_comment($first_line, $linenr)) {
6515				WARN("DATA_RACE",
6516				     "data_race without comment\n" . $herecurr);
6517			}
6518		}
6519
6520# check of hardware specific defines
6521		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
6522			CHK("ARCH_DEFINES",
6523			    "architecture specific defines should be avoided\n" .  $herecurr);
6524		}
6525
6526# check that the storage class is not after a type
6527		if ($line =~ /\b($Type)\s+($Storage)\b/) {
6528			WARN("STORAGE_CLASS",
6529			     "storage class '$2' should be located before type '$1'\n" . $herecurr);
6530		}
6531# Check that the storage class is at the beginning of a declaration
6532		if ($line =~ /\b$Storage\b/ &&
6533		    $line !~ /^.\s*$Storage/ &&
6534		    $line =~ /^.\s*(.+?)\$Storage\s/ &&
6535		    $1 !~ /[\,\)]\s*$/) {
6536			WARN("STORAGE_CLASS",
6537			     "storage class should be at the beginning of the declaration\n" . $herecurr);
6538		}
6539
6540# check the location of the inline attribute, that it is between
6541# storage class and type.
6542		if ($line =~ /\b$Type\s+$Inline\b/ ||
6543		    $line =~ /\b$Inline\s+$Storage\b/) {
6544			ERROR("INLINE_LOCATION",
6545			      "inline keyword should sit between storage class and type\n" . $herecurr);
6546		}
6547
6548# Check for __inline__ and __inline, prefer inline
6549		if ($realfile !~ m@\binclude/uapi/@ &&
6550		    $line =~ /\b(__inline__|__inline)\b/) {
6551			if (WARN("INLINE",
6552				 "plain inline is preferred over $1\n" . $herecurr) &&
6553			    $fix) {
6554				$fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
6555
6556			}
6557		}
6558
6559# Check for compiler attributes
6560		if ($realfile !~ m@\binclude/uapi/@ &&
6561		    $rawline =~ /\b__attribute__\s*\(\s*($balanced_parens)\s*\)/) {
6562			my $attr = $1;
6563			$attr =~ s/\s*\(\s*(.*)\)\s*/$1/;
6564
6565			my %attr_list = (
6566				"alias"				=> "__alias",
6567				"aligned"			=> "__aligned",
6568				"always_inline"			=> "__always_inline",
6569				"assume_aligned"		=> "__assume_aligned",
6570				"cold"				=> "__cold",
6571				"const"				=> "__attribute_const__",
6572				"copy"				=> "__copy",
6573				"designated_init"		=> "__designated_init",
6574				"externally_visible"		=> "__visible",
6575				"format"			=> "printf|scanf",
6576				"gnu_inline"			=> "__gnu_inline",
6577				"malloc"			=> "__malloc",
6578				"mode"				=> "__mode",
6579				"no_caller_saved_registers"	=> "__no_caller_saved_registers",
6580				"noclone"			=> "__noclone",
6581				"noinline"			=> "noinline",
6582				"nonstring"			=> "__nonstring",
6583				"noreturn"			=> "__noreturn",
6584				"packed"			=> "__packed",
6585				"pure"				=> "__pure",
6586				"section"			=> "__section",
6587				"used"				=> "__used",
6588				"weak"				=> "__weak"
6589			);
6590
6591			while ($attr =~ /\s*(\w+)\s*(${balanced_parens})?/g) {
6592				my $orig_attr = $1;
6593				my $params = '';
6594				$params = $2 if defined($2);
6595				my $curr_attr = $orig_attr;
6596				$curr_attr =~ s/^[\s_]+|[\s_]+$//g;
6597				if (exists($attr_list{$curr_attr})) {
6598					my $new = $attr_list{$curr_attr};
6599					if ($curr_attr eq "format" && $params) {
6600						$params =~ /^\s*\(\s*(\w+)\s*,\s*(.*)/;
6601						$new = "__$1\($2";
6602					} else {
6603						$new = "$new$params";
6604					}
6605					if (WARN("PREFER_DEFINED_ATTRIBUTE_MACRO",
6606						 "Prefer $new over __attribute__(($orig_attr$params))\n" . $herecurr) &&
6607					    $fix) {
6608						my $remove = "\Q$orig_attr\E" . '\s*' . "\Q$params\E" . '(?:\s*,\s*)?';
6609						$fixed[$fixlinenr] =~ s/$remove//;
6610						$fixed[$fixlinenr] =~ s/\b__attribute__/$new __attribute__/;
6611						$fixed[$fixlinenr] =~ s/\}\Q$new\E/} $new/;
6612						$fixed[$fixlinenr] =~ s/ __attribute__\s*\(\s*\(\s*\)\s*\)//;
6613					}
6614				}
6615			}
6616
6617			# Check for __attribute__ unused, prefer __always_unused or __maybe_unused
6618			if ($attr =~ /^_*unused/) {
6619				WARN("PREFER_DEFINED_ATTRIBUTE_MACRO",
6620				     "__always_unused or __maybe_unused is preferred over __attribute__((__unused__))\n" . $herecurr);
6621			}
6622		}
6623
6624# Check for __attribute__ weak, or __weak declarations (may have link issues)
6625		if ($perl_version_ok &&
6626		    $line =~ /(?:$Declare|$DeclareMisordered)\s*$Ident\s*$balanced_parens\s*(?:$Attribute)?\s*;/ &&
6627		    ($line =~ /\b__attribute__\s*\(\s*\(.*\bweak\b/ ||
6628		     $line =~ /\b__weak\b/)) {
6629			ERROR("WEAK_DECLARATION",
6630			      "Using weak declarations can have unintended link defects\n" . $herecurr);
6631		}
6632
6633# check for c99 types like uint8_t used outside of uapi/ and tools/
6634		if ($realfile !~ m@\binclude/uapi/@ &&
6635		    $realfile !~ m@\btools/@ &&
6636		    $line =~ /\b($Declare)\s*$Ident\s*[=;,\[]/) {
6637			my $type = $1;
6638			if ($type =~ /\b($typeC99Typedefs)\b/) {
6639				$type = $1;
6640				my $kernel_type = 'u';
6641				$kernel_type = 's' if ($type =~ /^_*[si]/);
6642				$type =~ /(\d+)/;
6643				$kernel_type .= $1;
6644				if (CHK("PREFER_KERNEL_TYPES",
6645					"Prefer kernel type '$kernel_type' over '$type'\n" . $herecurr) &&
6646				    $fix) {
6647					$fixed[$fixlinenr] =~ s/\b$type\b/$kernel_type/;
6648				}
6649			}
6650		}
6651
6652# check for cast of C90 native int or longer types constants
6653		if ($line =~ /(\(\s*$C90_int_types\s*\)\s*)($Constant)\b/) {
6654			my $cast = $1;
6655			my $const = $2;
6656			my $suffix = "";
6657			my $newconst = $const;
6658			$newconst =~ s/${Int_type}$//;
6659			$suffix .= 'U' if ($cast =~ /\bunsigned\b/);
6660			if ($cast =~ /\blong\s+long\b/) {
6661			    $suffix .= 'LL';
6662			} elsif ($cast =~ /\blong\b/) {
6663			    $suffix .= 'L';
6664			}
6665			if (WARN("TYPECAST_INT_CONSTANT",
6666				 "Unnecessary typecast of c90 int constant - '$cast$const' could be '$const$suffix'\n" . $herecurr) &&
6667			    $fix) {
6668				$fixed[$fixlinenr] =~ s/\Q$cast\E$const\b/$newconst$suffix/;
6669			}
6670		}
6671
6672# check for sizeof(&)
6673		if ($line =~ /\bsizeof\s*\(\s*\&/) {
6674			WARN("SIZEOF_ADDRESS",
6675			     "sizeof(& should be avoided\n" . $herecurr);
6676		}
6677
6678# check for sizeof without parenthesis
6679		if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
6680			if (WARN("SIZEOF_PARENTHESIS",
6681				 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
6682			    $fix) {
6683				$fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
6684			}
6685		}
6686
6687# check for struct spinlock declarations
6688		if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
6689			WARN("USE_SPINLOCK_T",
6690			     "struct spinlock should be spinlock_t\n" . $herecurr);
6691		}
6692
6693# check for seq_printf uses that could be seq_puts
6694		if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
6695			my $fmt = get_quoted_string($line, $rawline);
6696			$fmt =~ s/%%//g;
6697			if ($fmt !~ /%/) {
6698				if (WARN("PREFER_SEQ_PUTS",
6699					 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
6700				    $fix) {
6701					$fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
6702				}
6703			}
6704		}
6705
6706# check for vsprintf extension %p<foo> misuses
6707		if ($perl_version_ok &&
6708		    defined $stat &&
6709		    $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
6710		    $1 !~ /^_*volatile_*$/) {
6711			my $stat_real;
6712
6713			my $lc = $stat =~ tr@\n@@;
6714			$lc = $lc + $linenr;
6715		        for (my $count = $linenr; $count <= $lc; $count++) {
6716				my $specifier;
6717				my $extension;
6718				my $qualifier;
6719				my $bad_specifier = "";
6720				my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
6721				$fmt =~ s/%%//g;
6722
6723				while ($fmt =~ /(\%[\*\d\.]*p(\w)(\w*))/g) {
6724					$specifier = $1;
6725					$extension = $2;
6726					$qualifier = $3;
6727					if ($extension !~ /[4SsBKRraEehMmIiUDdgVCbGNOxtf]/ ||
6728					    ($extension eq "f" &&
6729					     defined $qualifier && $qualifier !~ /^w/) ||
6730					    ($extension eq "4" &&
6731					     defined $qualifier && $qualifier !~ /^cc/)) {
6732						$bad_specifier = $specifier;
6733						last;
6734					}
6735					if ($extension eq "x" && !defined($stat_real)) {
6736						if (!defined($stat_real)) {
6737							$stat_real = get_stat_real($linenr, $lc);
6738						}
6739						WARN("VSPRINTF_SPECIFIER_PX",
6740						     "Using vsprintf specifier '\%px' potentially exposes the kernel memory layout, if you don't really need the address please consider using '\%p'.\n" . "$here\n$stat_real\n");
6741					}
6742				}
6743				if ($bad_specifier ne "") {
6744					my $stat_real = get_stat_real($linenr, $lc);
6745					my $ext_type = "Invalid";
6746					my $use = "";
6747					if ($bad_specifier =~ /p[Ff]/) {
6748						$use = " - use %pS instead";
6749						$use =~ s/pS/ps/ if ($bad_specifier =~ /pf/);
6750					}
6751
6752					WARN("VSPRINTF_POINTER_EXTENSION",
6753					     "$ext_type vsprintf pointer extension '$bad_specifier'$use\n" . "$here\n$stat_real\n");
6754				}
6755			}
6756		}
6757
6758# Check for misused memsets
6759		if ($perl_version_ok &&
6760		    defined $stat &&
6761		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) {
6762
6763			my $ms_addr = $2;
6764			my $ms_val = $7;
6765			my $ms_size = $12;
6766
6767			if ($ms_size =~ /^(0x|)0$/i) {
6768				ERROR("MEMSET",
6769				      "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
6770			} elsif ($ms_size =~ /^(0x|)1$/i) {
6771				WARN("MEMSET",
6772				     "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
6773			}
6774		}
6775
6776# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
6777#		if ($perl_version_ok &&
6778#		    defined $stat &&
6779#		    $stat =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
6780#			if (WARN("PREFER_ETHER_ADDR_COPY",
6781#				 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . "$here\n$stat\n") &&
6782#			    $fix) {
6783#				$fixed[$fixlinenr] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
6784#			}
6785#		}
6786
6787# Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar)
6788#		if ($perl_version_ok &&
6789#		    defined $stat &&
6790#		    $stat =~ /^\+(?:.*?)\bmemcmp\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
6791#			WARN("PREFER_ETHER_ADDR_EQUAL",
6792#			     "Prefer ether_addr_equal() or ether_addr_equal_unaligned() over memcmp()\n" . "$here\n$stat\n")
6793#		}
6794
6795# check for memset(foo, 0x0, ETH_ALEN) that could be eth_zero_addr
6796# check for memset(foo, 0xFF, ETH_ALEN) that could be eth_broadcast_addr
6797#		if ($perl_version_ok &&
6798#		    defined $stat &&
6799#		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
6800#
6801#			my $ms_val = $7;
6802#
6803#			if ($ms_val =~ /^(?:0x|)0+$/i) {
6804#				if (WARN("PREFER_ETH_ZERO_ADDR",
6805#					 "Prefer eth_zero_addr over memset()\n" . "$here\n$stat\n") &&
6806#				    $fix) {
6807#					$fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_zero_addr($2)/;
6808#				}
6809#			} elsif ($ms_val =~ /^(?:0xff|255)$/i) {
6810#				if (WARN("PREFER_ETH_BROADCAST_ADDR",
6811#					 "Prefer eth_broadcast_addr() over memset()\n" . "$here\n$stat\n") &&
6812#				    $fix) {
6813#					$fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_broadcast_addr($2)/;
6814#				}
6815#			}
6816#		}
6817
6818# strlcpy uses that should likely be strscpy
6819		if ($line =~ /\bstrlcpy\s*\(/) {
6820			WARN("STRLCPY",
6821			     "Prefer strscpy over strlcpy - see: https://lore.kernel.org/r/CAHk-=wgfRnXz0W3D37d01q3JFkr_i_uTL=V6A6G1oUZcprmknw\@mail.gmail.com/\n" . $herecurr);
6822		}
6823
6824# typecasts on min/max could be min_t/max_t
6825		if ($perl_version_ok &&
6826		    defined $stat &&
6827		    $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
6828			if (defined $2 || defined $7) {
6829				my $call = $1;
6830				my $cast1 = deparenthesize($2);
6831				my $arg1 = $3;
6832				my $cast2 = deparenthesize($7);
6833				my $arg2 = $8;
6834				my $cast;
6835
6836				if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
6837					$cast = "$cast1 or $cast2";
6838				} elsif ($cast1 ne "") {
6839					$cast = $cast1;
6840				} else {
6841					$cast = $cast2;
6842				}
6843				WARN("MINMAX",
6844				     "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
6845			}
6846		}
6847
6848# check usleep_range arguments
6849		if ($perl_version_ok &&
6850		    defined $stat &&
6851		    $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
6852			my $min = $1;
6853			my $max = $7;
6854			if ($min eq $max) {
6855				WARN("USLEEP_RANGE",
6856				     "usleep_range should not use min == max args; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n");
6857			} elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
6858				 $min > $max) {
6859				WARN("USLEEP_RANGE",
6860				     "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n");
6861			}
6862		}
6863
6864# check for naked sscanf
6865		if ($perl_version_ok &&
6866		    defined $stat &&
6867		    $line =~ /\bsscanf\b/ &&
6868		    ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
6869		     $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
6870		     $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
6871			my $lc = $stat =~ tr@\n@@;
6872			$lc = $lc + $linenr;
6873			my $stat_real = get_stat_real($linenr, $lc);
6874			WARN("NAKED_SSCANF",
6875			     "unchecked sscanf return value\n" . "$here\n$stat_real\n");
6876		}
6877
6878# check for simple sscanf that should be kstrto<foo>
6879		if ($perl_version_ok &&
6880		    defined $stat &&
6881		    $line =~ /\bsscanf\b/) {
6882			my $lc = $stat =~ tr@\n@@;
6883			$lc = $lc + $linenr;
6884			my $stat_real = get_stat_real($linenr, $lc);
6885			if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {
6886				my $format = $6;
6887				my $count = $format =~ tr@%@%@;
6888				if ($count == 1 &&
6889				    $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {
6890					WARN("SSCANF_TO_KSTRTO",
6891					     "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n");
6892				}
6893			}
6894		}
6895
6896# check for new externs in .h files.
6897		if ($realfile =~ /\.h$/ &&
6898		    $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
6899			if (CHK("AVOID_EXTERNS",
6900				"extern prototypes should be avoided in .h files\n" . $herecurr) &&
6901			    $fix) {
6902				$fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
6903			}
6904		}
6905
6906# check for new externs in .c files.
6907		if ($realfile =~ /\.c$/ && defined $stat &&
6908		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
6909		{
6910			my $function_name = $1;
6911			my $paren_space = $2;
6912
6913			my $s = $stat;
6914			if (defined $cond) {
6915				substr($s, 0, length($cond), '');
6916			}
6917			if ($s =~ /^\s*;/)
6918			{
6919				WARN("AVOID_EXTERNS",
6920				     "externs should be avoided in .c files\n" .  $herecurr);
6921			}
6922
6923			if ($paren_space =~ /\n/) {
6924				WARN("FUNCTION_ARGUMENTS",
6925				     "arguments for function declarations should follow identifier\n" . $herecurr);
6926			}
6927
6928		} elsif ($realfile =~ /\.c$/ && defined $stat &&
6929		    $stat =~ /^.\s*extern\s+/)
6930		{
6931			WARN("AVOID_EXTERNS",
6932			     "externs should be avoided in .c files\n" .  $herecurr);
6933		}
6934
6935# check for function declarations that have arguments without identifier names
6936		if (defined $stat &&
6937		    $stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s &&
6938		    $1 ne "void") {
6939			my $args = trim($1);
6940			while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {
6941				my $arg = trim($1);
6942				if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) {
6943					WARN("FUNCTION_ARGUMENTS",
6944					     "function definition argument '$arg' should also have an identifier name\n" . $herecurr);
6945				}
6946			}
6947		}
6948
6949# check for function definitions
6950		if ($perl_version_ok &&
6951		    defined $stat &&
6952		    $stat =~ /^.\s*(?:$Storage\s+)?$Type\s*($Ident)\s*$balanced_parens\s*{/s) {
6953			$context_function = $1;
6954
6955# check for multiline function definition with misplaced open brace
6956			my $ok = 0;
6957			my $cnt = statement_rawlines($stat);
6958			my $herectx = $here . "\n";
6959			for (my $n = 0; $n < $cnt; $n++) {
6960				my $rl = raw_line($linenr, $n);
6961				$herectx .=  $rl . "\n";
6962				$ok = 1 if ($rl =~ /^[ \+]\{/);
6963				$ok = 1 if ($rl =~ /\{/ && $n == 0);
6964				last if $rl =~ /^[ \+].*\{/;
6965			}
6966			if (!$ok) {
6967				ERROR("OPEN_BRACE",
6968				      "open brace '{' following function definitions go on the next line\n" . $herectx);
6969			}
6970		}
6971
6972# checks for new __setup's
6973		if ($rawline =~ /\b__setup\("([^"]*)"/) {
6974			my $name = $1;
6975
6976			if (!grep(/$name/, @setup_docs)) {
6977				CHK("UNDOCUMENTED_SETUP",
6978				    "__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.txt\n" . $herecurr);
6979			}
6980		}
6981
6982# check for pointless casting of alloc functions
6983		if ($line =~ /\*\s*\)\s*$allocFunctions\b/) {
6984			WARN("UNNECESSARY_CASTS",
6985			     "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
6986		}
6987
6988# alloc style
6989# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
6990		if ($perl_version_ok &&
6991		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k|v)[mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
6992			CHK("ALLOC_SIZEOF_STRUCT",
6993			    "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
6994		}
6995
6996# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
6997		if ($perl_version_ok &&
6998		    defined $stat &&
6999		    $stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
7000			my $oldfunc = $3;
7001			my $a1 = $4;
7002			my $a2 = $10;
7003			my $newfunc = "kmalloc_array";
7004			$newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
7005			my $r1 = $a1;
7006			my $r2 = $a2;
7007			if ($a1 =~ /^sizeof\s*\S/) {
7008				$r1 = $a2;
7009				$r2 = $a1;
7010			}
7011			if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
7012			    !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
7013				my $cnt = statement_rawlines($stat);
7014				my $herectx = get_stat_here($linenr, $cnt, $here);
7015
7016				if (WARN("ALLOC_WITH_MULTIPLY",
7017					 "Prefer $newfunc over $oldfunc with multiply\n" . $herectx) &&
7018				    $cnt == 1 &&
7019				    $fix) {
7020					$fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e;
7021				}
7022			}
7023		}
7024
7025# check for krealloc arg reuse
7026		if ($perl_version_ok &&
7027		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*($Lval)\s*,/ &&
7028		    $1 eq $3) {
7029			WARN("KREALLOC_ARG_REUSE",
7030			     "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
7031		}
7032
7033# check for alloc argument mismatch
7034		if ($line =~ /\b((?:devm_)?(?:kcalloc|kmalloc_array))\s*\(\s*sizeof\b/) {
7035			WARN("ALLOC_ARRAY_ARGS",
7036			     "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
7037		}
7038
7039# check for multiple semicolons
7040		if ($line =~ /;\s*;\s*$/) {
7041			if (WARN("ONE_SEMICOLON",
7042				 "Statements terminations use 1 semicolon\n" . $herecurr) &&
7043			    $fix) {
7044				$fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
7045			}
7046		}
7047
7048# check for #defines like: 1 << <digit> that could be BIT(digit), it is not exported to uapi
7049		if ($realfile !~ m@^include/uapi/@ &&
7050		    $line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) {
7051			my $ull = "";
7052			$ull = "_ULL" if (defined($1) && $1 =~ /ll/i);
7053			if (CHK("BIT_MACRO",
7054				"Prefer using the BIT$ull macro\n" . $herecurr) &&
7055			    $fix) {
7056				$fixed[$fixlinenr] =~ s/\(?\s*1\s*[ulUL]*\s*<<\s*(\d+|$Ident)\s*\)?/BIT${ull}($1)/;
7057			}
7058		}
7059
7060# check for IS_ENABLED() without CONFIG_<FOO> ($rawline for comments too)
7061		if ($rawline =~ /\bIS_ENABLED\s*\(\s*(\w+)\s*\)/ && $1 !~ /^${CONFIG_}/) {
7062			WARN("IS_ENABLED_CONFIG",
7063			     "IS_ENABLED($1) is normally used as IS_ENABLED(${CONFIG_}$1)\n" . $herecurr);
7064		}
7065
7066# check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE
7067		if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(${CONFIG_}[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) {
7068			my $config = $1;
7069			if (WARN("PREFER_IS_ENABLED",
7070				 "Prefer IS_ENABLED(<FOO>) to ${CONFIG_}<FOO> || ${CONFIG_}<FOO>_MODULE\n" . $herecurr) &&
7071			    $fix) {
7072				$fixed[$fixlinenr] = "\+#if IS_ENABLED($config)";
7073			}
7074		}
7075
7076# check for /* fallthrough */ like comment, prefer fallthrough;
7077		my @fallthroughs = (
7078			'fallthrough',
7079			'@fallthrough@',
7080			'lint -fallthrough[ \t]*',
7081			'intentional(?:ly)?[ \t]*fall(?:(?:s | |-)[Tt]|t)hr(?:ough|u|ew)',
7082			'(?:else,?\s*)?FALL(?:S | |-)?THR(?:OUGH|U|EW)[ \t.!]*(?:-[^\n\r]*)?',
7083			'Fall(?:(?:s | |-)[Tt]|t)hr(?:ough|u|ew)[ \t.!]*(?:-[^\n\r]*)?',
7084			'fall(?:s | |-)?thr(?:ough|u|ew)[ \t.!]*(?:-[^\n\r]*)?',
7085		    );
7086		if ($raw_comment ne '') {
7087			foreach my $ft (@fallthroughs) {
7088				if ($raw_comment =~ /$ft/) {
7089					my $msg_level = \&WARN;
7090					$msg_level = \&CHK if ($file);
7091					&{$msg_level}("PREFER_FALLTHROUGH",
7092						      "Prefer 'fallthrough;' over fallthrough comment\n" . $herecurr);
7093					last;
7094				}
7095			}
7096		}
7097
7098# check for switch/default statements without a break;
7099		if ($perl_version_ok &&
7100		    defined $stat &&
7101		    $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
7102			my $cnt = statement_rawlines($stat);
7103			my $herectx = get_stat_here($linenr, $cnt, $here);
7104
7105			WARN("DEFAULT_NO_BREAK",
7106			     "switch default: should use break\n" . $herectx);
7107		}
7108
7109# check for gcc specific __FUNCTION__
7110		if ($line =~ /\b__FUNCTION__\b/) {
7111			if (WARN("USE_FUNC",
7112				 "__func__ should be used instead of gcc specific __FUNCTION__\n"  . $herecurr) &&
7113			    $fix) {
7114				$fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
7115			}
7116		}
7117
7118# check for uses of __DATE__, __TIME__, __TIMESTAMP__
7119		while ($line =~ /\b(__(?:DATE|TIME|TIMESTAMP)__)\b/g) {
7120			ERROR("DATE_TIME",
7121			      "Use of the '$1' macro makes the build non-deterministic\n" . $herecurr);
7122		}
7123
7124# check for use of yield()
7125		if ($line =~ /\byield\s*\(\s*\)/) {
7126			WARN("YIELD",
7127			     "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n"  . $herecurr);
7128		}
7129
7130# check for comparisons against true and false
7131		if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
7132			my $lead = $1;
7133			my $arg = $2;
7134			my $test = $3;
7135			my $otype = $4;
7136			my $trail = $5;
7137			my $op = "!";
7138
7139			($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
7140
7141			my $type = lc($otype);
7142			if ($type =~ /^(?:true|false)$/) {
7143				if (("$test" eq "==" && "$type" eq "true") ||
7144				    ("$test" eq "!=" && "$type" eq "false")) {
7145					$op = "";
7146				}
7147
7148				CHK("BOOL_COMPARISON",
7149				    "Using comparison to $otype is error prone\n" . $herecurr);
7150
7151## maybe suggesting a correct construct would better
7152##				    "Using comparison to $otype is error prone.  Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
7153
7154			}
7155		}
7156
7157# check for semaphores initialized locked
7158		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
7159			WARN("CONSIDER_COMPLETION",
7160			     "consider using a completion\n" . $herecurr);
7161		}
7162
7163# recommend kstrto* over simple_strto* and strict_strto*
7164		if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
7165			WARN("CONSIDER_KSTRTO",
7166			     "$1 is obsolete, use k$3 instead\n" . $herecurr);
7167		}
7168
7169# check for __initcall(), use device_initcall() explicitly or more appropriate function please
7170		if ($line =~ /^.\s*__initcall\s*\(/) {
7171			WARN("USE_DEVICE_INITCALL",
7172			     "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr);
7173		}
7174
7175# check for spin_is_locked(), suggest lockdep instead
7176		if ($line =~ /\bspin_is_locked\(/) {
7177			WARN("USE_LOCKDEP",
7178			     "Where possible, use lockdep_assert_held instead of assertions based on spin_is_locked\n" . $herecurr);
7179		}
7180
7181# check for deprecated apis
7182		if ($line =~ /\b($deprecated_apis_search)\b\s*\(/) {
7183			my $deprecated_api = $1;
7184			my $new_api = $deprecated_apis{$deprecated_api};
7185			WARN("DEPRECATED_API",
7186			     "Deprecated use of '$deprecated_api', prefer '$new_api' instead\n" . $herecurr);
7187		}
7188
7189# check for various structs that are normally const (ops, kgdb, device_tree)
7190# and avoid what seem like struct definitions 'struct foo {'
7191		if (defined($const_structs) &&
7192		    $line !~ /\bconst\b/ &&
7193		    $line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) {
7194			WARN("CONST_STRUCT",
7195			     "struct $1 should normally be const\n" . $herecurr);
7196		}
7197
7198# use of NR_CPUS is usually wrong
7199# ignore definitions of NR_CPUS and usage to define arrays as likely right
7200# ignore designated initializers using NR_CPUS
7201		if ($line =~ /\bNR_CPUS\b/ &&
7202		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
7203		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
7204		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
7205		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
7206		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/ &&
7207		    $line !~ /^.\s*\.\w+\s*=\s*.*\bNR_CPUS\b/)
7208		{
7209			WARN("NR_CPUS",
7210			     "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
7211		}
7212
7213# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
7214		if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
7215			ERROR("DEFINE_ARCH_HAS",
7216			      "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
7217		}
7218
7219# likely/unlikely comparisons similar to "(likely(foo) > 0)"
7220		if ($perl_version_ok &&
7221		    $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) {
7222			WARN("LIKELY_MISUSE",
7223			     "Using $1 should generally have parentheses around the comparison\n" . $herecurr);
7224		}
7225
7226# return sysfs_emit(foo, fmt, ...) fmt without newline
7227		if ($line =~ /\breturn\s+sysfs_emit\s*\(\s*$FuncArg\s*,\s*($String)/ &&
7228		    substr($rawline, $-[6], $+[6] - $-[6]) !~ /\\n"$/) {
7229			my $offset = $+[6] - 1;
7230			if (WARN("SYSFS_EMIT",
7231				 "return sysfs_emit(...) formats should include a terminating newline\n" . $herecurr) &&
7232			    $fix) {
7233				substr($fixed[$fixlinenr], $offset, 0) = '\\n';
7234			}
7235		}
7236
7237# nested likely/unlikely calls
7238		if ($line =~ /\b(?:(?:un)?likely)\s*\(\s*!?\s*(IS_ERR(?:_OR_NULL|_VALUE)?|WARN)/) {
7239			WARN("LIKELY_MISUSE",
7240			     "nested (un)?likely() calls, $1 already uses unlikely() internally\n" . $herecurr);
7241		}
7242
7243# whine mightly about in_atomic
7244		if ($line =~ /\bin_atomic\s*\(/) {
7245			if ($realfile =~ m@^drivers/@) {
7246				ERROR("IN_ATOMIC",
7247				      "do not use in_atomic in drivers\n" . $herecurr);
7248			} elsif ($realfile !~ m@^kernel/@) {
7249				WARN("IN_ATOMIC",
7250				     "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
7251			}
7252		}
7253
7254# check for lockdep_set_novalidate_class
7255		if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
7256		    $line =~ /__lockdep_no_validate__\s*\)/ ) {
7257			if ($realfile !~ m@^kernel/lockdep@ &&
7258			    $realfile !~ m@^include/linux/lockdep@ &&
7259			    $realfile !~ m@^drivers/base/core@) {
7260				ERROR("LOCKDEP",
7261				      "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
7262			}
7263		}
7264
7265		if ($line =~ /debugfs_create_\w+.*\b$mode_perms_world_writable\b/ ||
7266		    $line =~ /DEVICE_ATTR.*\b$mode_perms_world_writable\b/) {
7267			WARN("EXPORTED_WORLD_WRITABLE",
7268			     "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
7269		}
7270
7271# check for DEVICE_ATTR uses that could be DEVICE_ATTR_<FOO>
7272# and whether or not function naming is typical and if
7273# DEVICE_ATTR permissions uses are unusual too
7274		if ($perl_version_ok &&
7275		    defined $stat &&
7276		    $stat =~ /\bDEVICE_ATTR\s*\(\s*(\w+)\s*,\s*\(?\s*(\s*(?:${multi_mode_perms_string_search}|0[0-7]{3,3})\s*)\s*\)?\s*,\s*(\w+)\s*,\s*(\w+)\s*\)/) {
7277			my $var = $1;
7278			my $perms = $2;
7279			my $show = $3;
7280			my $store = $4;
7281			my $octal_perms = perms_to_octal($perms);
7282			if ($show =~ /^${var}_show$/ &&
7283			    $store =~ /^${var}_store$/ &&
7284			    $octal_perms eq "0644") {
7285				if (WARN("DEVICE_ATTR_RW",
7286					 "Use DEVICE_ATTR_RW\n" . $herecurr) &&
7287				    $fix) {
7288					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*$store\s*\)/DEVICE_ATTR_RW(${var})/;
7289				}
7290			} elsif ($show =~ /^${var}_show$/ &&
7291				 $store =~ /^NULL$/ &&
7292				 $octal_perms eq "0444") {
7293				if (WARN("DEVICE_ATTR_RO",
7294					 "Use DEVICE_ATTR_RO\n" . $herecurr) &&
7295				    $fix) {
7296					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*NULL\s*\)/DEVICE_ATTR_RO(${var})/;
7297				}
7298			} elsif ($show =~ /^NULL$/ &&
7299				 $store =~ /^${var}_store$/ &&
7300				 $octal_perms eq "0200") {
7301				if (WARN("DEVICE_ATTR_WO",
7302					 "Use DEVICE_ATTR_WO\n" . $herecurr) &&
7303				    $fix) {
7304					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*NULL\s*,\s*$store\s*\)/DEVICE_ATTR_WO(${var})/;
7305				}
7306			} elsif ($octal_perms eq "0644" ||
7307				 $octal_perms eq "0444" ||
7308				 $octal_perms eq "0200") {
7309				my $newshow = "$show";
7310				$newshow = "${var}_show" if ($show ne "NULL" && $show ne "${var}_show");
7311				my $newstore = $store;
7312				$newstore = "${var}_store" if ($store ne "NULL" && $store ne "${var}_store");
7313				my $rename = "";
7314				if ($show ne $newshow) {
7315					$rename .= " '$show' to '$newshow'";
7316				}
7317				if ($store ne $newstore) {
7318					$rename .= " '$store' to '$newstore'";
7319				}
7320				WARN("DEVICE_ATTR_FUNCTIONS",
7321				     "Consider renaming function(s)$rename\n" . $herecurr);
7322			} else {
7323				WARN("DEVICE_ATTR_PERMS",
7324				     "DEVICE_ATTR unusual permissions '$perms' used\n" . $herecurr);
7325			}
7326		}
7327
7328# Mode permission misuses where it seems decimal should be octal
7329# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
7330# o Ignore module_param*(...) uses with a decimal 0 permission as that has a
7331#   specific definition of not visible in sysfs.
7332# o Ignore proc_create*(...) uses with a decimal 0 permission as that means
7333#   use the default permissions
7334		if ($perl_version_ok &&
7335		    defined $stat &&
7336		    $line =~ /$mode_perms_search/) {
7337			foreach my $entry (@mode_permission_funcs) {
7338				my $func = $entry->[0];
7339				my $arg_pos = $entry->[1];
7340
7341				my $lc = $stat =~ tr@\n@@;
7342				$lc = $lc + $linenr;
7343				my $stat_real = get_stat_real($linenr, $lc);
7344
7345				my $skip_args = "";
7346				if ($arg_pos > 1) {
7347					$arg_pos--;
7348					$skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
7349				}
7350				my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]";
7351				if ($stat =~ /$test/) {
7352					my $val = $1;
7353					$val = $6 if ($skip_args ne "");
7354					if (!($func =~ /^(?:module_param|proc_create)/ && $val eq "0") &&
7355					    (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
7356					     ($val =~ /^$Octal$/ && length($val) ne 4))) {
7357						ERROR("NON_OCTAL_PERMISSIONS",
7358						      "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real);
7359					}
7360					if ($val =~ /^$Octal$/ && (oct($val) & 02)) {
7361						ERROR("EXPORTED_WORLD_WRITABLE",
7362						      "Exporting writable files is usually an error. Consider more restrictive permissions.\n" . "$here\n" . $stat_real);
7363					}
7364				}
7365			}
7366		}
7367
7368# check for uses of S_<PERMS> that could be octal for readability
7369		while ($line =~ m{\b($multi_mode_perms_string_search)\b}g) {
7370			my $oval = $1;
7371			my $octal = perms_to_octal($oval);
7372			if (WARN("SYMBOLIC_PERMS",
7373				 "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) &&
7374			    $fix) {
7375				$fixed[$fixlinenr] =~ s/\Q$oval\E/$octal/;
7376			}
7377		}
7378
7379# validate content of MODULE_LICENSE against list from include/linux/module.h
7380		if ($line =~ /\bMODULE_LICENSE\s*\(\s*($String)\s*\)/) {
7381			my $extracted_string = get_quoted_string($line, $rawline);
7382			my $valid_licenses = qr{
7383						GPL|
7384						GPL\ v2|
7385						GPL\ and\ additional\ rights|
7386						Dual\ BSD/GPL|
7387						Dual\ MIT/GPL|
7388						Dual\ MPL/GPL|
7389						Proprietary
7390					}x;
7391			if ($extracted_string !~ /^"(?:$valid_licenses)"$/x) {
7392				WARN("MODULE_LICENSE",
7393				     "unknown module license " . $extracted_string . "\n" . $herecurr);
7394			}
7395		}
7396
7397# check for sysctl duplicate constants
7398		if ($line =~ /\.extra[12]\s*=\s*&(zero|one|int_max)\b/) {
7399			WARN("DUPLICATED_SYSCTL_CONST",
7400				"duplicated sysctl range checking value '$1', consider using the shared one in include/linux/sysctl.h\n" . $herecurr);
7401		}
7402	}
7403
7404	# If we have no input at all, then there is nothing to report on
7405	# so just keep quiet.
7406	if ($#rawlines == -1) {
7407		exit(0);
7408	}
7409
7410	# In mailback mode only produce a report in the negative, for
7411	# things that appear to be patches.
7412	if ($mailback && ($clean == 1 || !$is_patch)) {
7413		exit(0);
7414	}
7415
7416	# This is not a patch, and we are in 'no-patch' mode so
7417	# just keep quiet.
7418	if (!$chk_patch && !$is_patch) {
7419		exit(0);
7420	}
7421
7422	if (!$is_patch && $filename !~ /cover-letter\.patch$/) {
7423		ERROR("NOT_UNIFIED_DIFF",
7424		      "Does not appear to be a unified-diff format patch\n");
7425	}
7426	if ($is_patch && $has_commit_log && $chk_signoff) {
7427		if ($signoff == 0) {
7428			ERROR("MISSING_SIGN_OFF",
7429			      "Missing Signed-off-by: line(s)\n");
7430		} elsif ($authorsignoff != 1) {
7431			# authorsignoff values:
7432			# 0 -> missing sign off
7433			# 1 -> sign off identical
7434			# 2 -> names and addresses match, comments mismatch
7435			# 3 -> addresses match, names different
7436			# 4 -> names match, addresses different
7437			# 5 -> names match, addresses excluding subaddress details (refer RFC 5233) match
7438
7439			my $sob_msg = "'From: $author' != 'Signed-off-by: $author_sob'";
7440
7441			if ($authorsignoff == 0) {
7442				ERROR("NO_AUTHOR_SIGN_OFF",
7443				      "Missing Signed-off-by: line by nominal patch author '$author'\n");
7444			} elsif ($authorsignoff == 2) {
7445				CHK("FROM_SIGN_OFF_MISMATCH",
7446				    "From:/Signed-off-by: email comments mismatch: $sob_msg\n");
7447			} elsif ($authorsignoff == 3) {
7448				WARN("FROM_SIGN_OFF_MISMATCH",
7449				     "From:/Signed-off-by: email name mismatch: $sob_msg\n");
7450			} elsif ($authorsignoff == 4) {
7451				WARN("FROM_SIGN_OFF_MISMATCH",
7452				     "From:/Signed-off-by: email address mismatch: $sob_msg\n");
7453			} elsif ($authorsignoff == 5) {
7454				WARN("FROM_SIGN_OFF_MISMATCH",
7455				     "From:/Signed-off-by: email subaddress mismatch: $sob_msg\n");
7456			}
7457		}
7458	}
7459
7460	print report_dump();
7461	if ($summary && !($clean == 1 && $quiet == 1)) {
7462		print "$filename " if ($summary_file);
7463		print "total: $cnt_error errors, $cnt_warn warnings, " .
7464			(($check)? "$cnt_chk checks, " : "") .
7465			"$cnt_lines lines checked\n";
7466	}
7467
7468	if ($quiet == 0) {
7469		# If there were any defects found and not already fixing them
7470		if (!$clean and !$fix) {
7471			print << "EOM"
7472
7473NOTE: For some of the reported defects, checkpatch may be able to
7474      mechanically convert to the typical style using --fix or --fix-inplace.
7475EOM
7476		}
7477		# If there were whitespace errors which cleanpatch can fix
7478		# then suggest that.
7479		if ($rpt_cleaners) {
7480			$rpt_cleaners = 0;
7481			print << "EOM"
7482
7483NOTE: Whitespace errors detected.
7484      You may wish to use scripts/cleanpatch or scripts/cleanfile
7485EOM
7486		}
7487	}
7488
7489	if ($clean == 0 && $fix &&
7490	    ("@rawlines" ne "@fixed" ||
7491	     $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
7492		my $newfile = $filename;
7493		$newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
7494		my $linecount = 0;
7495		my $f;
7496
7497		@fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
7498
7499		open($f, '>', $newfile)
7500		    or die "$P: Can't open $newfile for write\n";
7501		foreach my $fixed_line (@fixed) {
7502			$linecount++;
7503			if ($file) {
7504				if ($linecount > 3) {
7505					$fixed_line =~ s/^\+//;
7506					print $f $fixed_line . "\n";
7507				}
7508			} else {
7509				print $f $fixed_line . "\n";
7510			}
7511		}
7512		close($f);
7513
7514		if (!$quiet) {
7515			print << "EOM";
7516
7517Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
7518
7519Do _NOT_ trust the results written to this file.
7520Do _NOT_ submit these changes without inspecting them for correctness.
7521
7522This EXPERIMENTAL file is simply a convenience to help rewrite patches.
7523No warranties, expressed or implied...
7524EOM
7525		}
7526	}
7527
7528	if ($quiet == 0) {
7529		print "\n";
7530		if ($clean == 1) {
7531			print "$vname has no obvious style problems and is ready for submission.\n";
7532		} else {
7533			print "$vname has style problems, please review.\n";
7534		}
7535	}
7536	return $clean;
7537}
7538