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