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