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