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