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