blob: 496f9abdb93015ebfa49758b6bca20ad8a67d4ca [file] [log] [blame]
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001#!/usr/bin/perl -w
Dave Jonesdbf004d2010-01-12 16:59:52 -05002# (c) 2001, Dave Jones. (the file handling bit)
Andy Whitcroft00df344f2007-06-08 13:47:06 -07003# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
Andy Whitcroft2a5a2c22009-01-06 14:41:23 -08004# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
Andy Whitcroft015830be2010-10-26 14:23:17 -07005# (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07006# Licensed under the terms of the GNU GPL License version 2
7
8use strict;
Joe Perchesc707a812013-07-08 16:00:43 -07009use POSIX;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -070010
11my $P = $0;
Andy Whitcroft00df344f2007-06-08 13:47:06 -070012$P =~ s@.*/@@g;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -070013
Joe Perches000d1cc12011-07-25 17:13:25 -070014my $V = '0.32';
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -070015
16use Getopt::Long qw(:config no_auto_abbrev);
17
18my $quiet = 0;
19my $tree = 1;
20my $chk_signoff = 1;
21my $chk_patch = 1;
Andy Whitcroft773647a2008-03-28 14:15:58 -070022my $tst_only;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -070023my $emacs = 0;
Andy Whitcroft8905a672007-11-28 16:21:06 -080024my $terse = 0;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -070025my $file = 0;
26my $check = 0;
Joe Perches2ac73b4f2014-06-04 16:12:05 -070027my $check_orig = 0;
Andy Whitcroft8905a672007-11-28 16:21:06 -080028my $summary = 1;
29my $mailback = 0;
Andy Whitcroft13214ad2008-02-08 04:22:03 -080030my $summary_file = 0;
Joe Perches000d1cc12011-07-25 17:13:25 -070031my $show_types = 0;
Joe Perches3705ce52013-07-03 15:05:31 -070032my $fix = 0;
Joe Perches9624b8d2014-01-23 15:54:44 -080033my $fix_inplace = 0;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -070034my $root;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -080035my %debug;
Joe Perches34456862013-07-03 15:05:34 -070036my %camelcase = ();
Joe Perches91bfe482013-09-11 14:23:59 -070037my %use_type = ();
38my @use = ();
39my %ignore_type = ();
Joe Perches000d1cc12011-07-25 17:13:25 -070040my @ignore = ();
Hannes Eder77f5b102009-09-21 17:04:37 -070041my $help = 0;
Joe Perches000d1cc12011-07-25 17:13:25 -070042my $configuration_file = ".checkpatch.conf";
Joe Perches6cd7f382012-12-17 16:01:54 -080043my $max_line_length = 80;
Dave Hansend62a2012013-09-11 14:23:56 -070044my $ignore_perl_version = 0;
45my $minimum_perl_version = 5.10.0;
Hannes Eder77f5b102009-09-21 17:04:37 -070046
47sub help {
48 my ($exitcode) = @_;
49
50 print << "EOM";
51Usage: $P [OPTION]... [FILE]...
52Version: $V
53
54Options:
55 -q, --quiet quiet
56 --no-tree run without a kernel tree
57 --no-signoff do not check for 'Signed-off-by' line
58 --patch treat FILE as patchfile (default)
59 --emacs emacs compile window format
60 --terse one line per report
61 -f, --file treat FILE as regular source file
62 --subjective, --strict enable more subjective tests
Joe Perches91bfe482013-09-11 14:23:59 -070063 --types TYPE(,TYPE2...) show only these comma separated message types
Joe Perches000d1cc12011-07-25 17:13:25 -070064 --ignore TYPE(,TYPE2...) ignore various comma separated message types
Joe Perches6cd7f382012-12-17 16:01:54 -080065 --max-line-length=n set the maximum line length, if exceeded, warn
Joe Perches000d1cc12011-07-25 17:13:25 -070066 --show-types show the message "types" in the output
Hannes Eder77f5b102009-09-21 17:04:37 -070067 --root=PATH PATH to the kernel tree root
68 --no-summary suppress the per-file summary
69 --mailback only produce a report in case of warnings/errors
70 --summary-file include the filename in summary
71 --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of
72 'values', 'possible', 'type', and 'attr' (default
73 is all off)
74 --test-only=WORD report only warnings/errors containing WORD
75 literally
Joe Perches3705ce52013-07-03 15:05:31 -070076 --fix EXPERIMENTAL - may create horrible results
77 If correctable single-line errors exist, create
78 "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
79 with potential errors corrected to the preferred
80 checkpatch style
Joe Perches9624b8d2014-01-23 15:54:44 -080081 --fix-inplace EXPERIMENTAL - may create horrible results
82 Is the same as --fix, but overwrites the input
83 file. It's your fault if there's no backup or git
Dave Hansend62a2012013-09-11 14:23:56 -070084 --ignore-perl-version override checking of perl version. expect
85 runtime errors.
Hannes Eder77f5b102009-09-21 17:04:37 -070086 -h, --help, --version display this help and exit
87
88When FILE is - read standard input.
89EOM
90
91 exit($exitcode);
92}
93
Joe Perches000d1cc12011-07-25 17:13:25 -070094my $conf = which_conf($configuration_file);
95if (-f $conf) {
96 my @conf_args;
97 open(my $conffile, '<', "$conf")
98 or warn "$P: Can't find a readable $configuration_file file $!\n";
99
100 while (<$conffile>) {
101 my $line = $_;
102
103 $line =~ s/\s*\n?$//g;
104 $line =~ s/^\s*//g;
105 $line =~ s/\s+/ /g;
106
107 next if ($line =~ m/^\s*#/);
108 next if ($line =~ m/^\s*$/);
109
110 my @words = split(" ", $line);
111 foreach my $word (@words) {
112 last if ($word =~ m/^#/);
113 push (@conf_args, $word);
114 }
115 }
116 close($conffile);
117 unshift(@ARGV, @conf_args) if @conf_args;
118}
119
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700120GetOptions(
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700121 'q|quiet+' => \$quiet,
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700122 'tree!' => \$tree,
123 'signoff!' => \$chk_signoff,
124 'patch!' => \$chk_patch,
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700125 'emacs!' => \$emacs,
Andy Whitcroft8905a672007-11-28 16:21:06 -0800126 'terse!' => \$terse,
Hannes Eder77f5b102009-09-21 17:04:37 -0700127 'f|file!' => \$file,
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700128 'subjective!' => \$check,
129 'strict!' => \$check,
Joe Perches000d1cc12011-07-25 17:13:25 -0700130 'ignore=s' => \@ignore,
Joe Perches91bfe482013-09-11 14:23:59 -0700131 'types=s' => \@use,
Joe Perches000d1cc12011-07-25 17:13:25 -0700132 'show-types!' => \$show_types,
Joe Perches6cd7f382012-12-17 16:01:54 -0800133 'max-line-length=i' => \$max_line_length,
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700134 'root=s' => \$root,
Andy Whitcroft8905a672007-11-28 16:21:06 -0800135 'summary!' => \$summary,
136 'mailback!' => \$mailback,
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800137 'summary-file!' => \$summary_file,
Joe Perches3705ce52013-07-03 15:05:31 -0700138 'fix!' => \$fix,
Joe Perches9624b8d2014-01-23 15:54:44 -0800139 'fix-inplace!' => \$fix_inplace,
Dave Hansend62a2012013-09-11 14:23:56 -0700140 'ignore-perl-version!' => \$ignore_perl_version,
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800141 'debug=s' => \%debug,
Andy Whitcroft773647a2008-03-28 14:15:58 -0700142 'test-only=s' => \$tst_only,
Hannes Eder77f5b102009-09-21 17:04:37 -0700143 'h|help' => \$help,
144 'version' => \$help
145) or help(1);
146
147help(0) if ($help);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700148
Joe Perches9624b8d2014-01-23 15:54:44 -0800149$fix = 1 if ($fix_inplace);
Joe Perches2ac73b4f2014-06-04 16:12:05 -0700150$check_orig = $check;
Joe Perches9624b8d2014-01-23 15:54:44 -0800151
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700152my $exit = 0;
153
Dave Hansend62a2012013-09-11 14:23:56 -0700154if ($^V && $^V lt $minimum_perl_version) {
155 printf "$P: requires at least perl version %vd\n", $minimum_perl_version;
156 if (!$ignore_perl_version) {
157 exit(1);
158 }
159}
160
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700161if ($#ARGV < 0) {
Hannes Eder77f5b102009-09-21 17:04:37 -0700162 print "$P: no input files\n";
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700163 exit(1);
164}
165
Joe Perches91bfe482013-09-11 14:23:59 -0700166sub hash_save_array_words {
167 my ($hashRef, $arrayRef) = @_;
Joe Perches000d1cc12011-07-25 17:13:25 -0700168
Joe Perches91bfe482013-09-11 14:23:59 -0700169 my @array = split(/,/, join(',', @$arrayRef));
170 foreach my $word (@array) {
171 $word =~ s/\s*\n?$//g;
172 $word =~ s/^\s*//g;
173 $word =~ s/\s+/ /g;
174 $word =~ tr/[a-z]/[A-Z]/;
Joe Perches000d1cc12011-07-25 17:13:25 -0700175
Joe Perches91bfe482013-09-11 14:23:59 -0700176 next if ($word =~ m/^\s*#/);
177 next if ($word =~ m/^\s*$/);
178
179 $hashRef->{$word}++;
180 }
Joe Perches000d1cc12011-07-25 17:13:25 -0700181}
182
Joe Perches91bfe482013-09-11 14:23:59 -0700183sub hash_show_words {
184 my ($hashRef, $prefix) = @_;
185
Joe Perches58cb3cf2013-09-11 14:24:04 -0700186 if ($quiet == 0 && keys %$hashRef) {
Joe Perches91bfe482013-09-11 14:23:59 -0700187 print "NOTE: $prefix message types:";
Joe Perches58cb3cf2013-09-11 14:24:04 -0700188 foreach my $word (sort keys %$hashRef) {
Joe Perches91bfe482013-09-11 14:23:59 -0700189 print " $word";
190 }
191 print "\n\n";
192 }
193}
194
195hash_save_array_words(\%ignore_type, \@ignore);
196hash_save_array_words(\%use_type, \@use);
197
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800198my $dbg_values = 0;
199my $dbg_possible = 0;
Andy Whitcroft7429c692008-07-23 21:29:06 -0700200my $dbg_type = 0;
Andy Whitcrofta1ef2772008-10-15 22:02:17 -0700201my $dbg_attr = 0;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800202for my $key (keys %debug) {
Andy Whitcroft21caa132009-01-06 14:41:30 -0800203 ## no critic
204 eval "\${dbg_$key} = '$debug{$key}';";
205 die "$@" if ($@);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800206}
207
Andy Whitcroftd2c0a232010-10-26 14:23:12 -0700208my $rpt_cleaners = 0;
209
Andy Whitcroft8905a672007-11-28 16:21:06 -0800210if ($terse) {
211 $emacs = 1;
212 $quiet++;
213}
214
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700215if ($tree) {
216 if (defined $root) {
217 if (!top_of_kernel_tree($root)) {
218 die "$P: $root: --root does not point at a valid tree\n";
219 }
220 } else {
221 if (top_of_kernel_tree('.')) {
222 $root = '.';
223 } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
224 top_of_kernel_tree($1)) {
225 $root = $1;
226 }
227 }
228
229 if (!defined $root) {
230 print "Must be run from the top-level dir. of a kernel tree\n";
231 exit(2);
232 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700233}
234
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700235my $emitted_corrupt = 0;
236
Andy Whitcroft2ceb5322009-10-26 16:50:14 -0700237our $Ident = qr{
238 [A-Za-z_][A-Za-z\d_]*
239 (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
240 }x;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700241our $Storage = qr{extern|static|asmlinkage};
242our $Sparse = qr{
243 __user|
244 __kernel|
245 __force|
246 __iomem|
247 __must_check|
248 __init_refok|
Andy Whitcroft417495e2009-02-27 14:03:08 -0800249 __kprobes|
Sven Eckelmann165e72a2011-07-25 17:13:23 -0700250 __ref|
251 __rcu
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700252 }x;
Joe Perchese970b8842013-11-12 15:10:10 -0800253our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
254our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
255our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
256our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
257our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
Joe Perches8716de32013-09-11 14:24:05 -0700258
Wolfram Sang52131292010-03-05 13:43:51 -0800259# Notes to $Attribute:
260# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700261our $Attribute = qr{
262 const|
Joe Perches03f1df72010-10-26 14:23:16 -0700263 __percpu|
264 __nocast|
265 __safe|
266 __bitwise__|
267 __packed__|
268 __packed2__|
269 __naked|
270 __maybe_unused|
271 __always_unused|
272 __noreturn|
273 __used|
274 __cold|
275 __noclone|
276 __deprecated|
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700277 __read_mostly|
278 __kprobes|
Joe Perches8716de32013-09-11 14:24:05 -0700279 $InitAttribute|
Andy Whitcroft24e1d812008-10-15 22:02:18 -0700280 ____cacheline_aligned|
281 ____cacheline_aligned_in_smp|
Andy Whitcroft5fe3af12009-01-06 14:41:18 -0800282 ____cacheline_internodealigned_in_smp|
283 __weak
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700284 }x;
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700285our $Modifier;
Joe Perches91cb5192014-04-03 14:49:32 -0700286our $Inline = qr{inline|__always_inline|noinline|__inline|__inline__};
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700287our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]};
288our $Lval = qr{$Ident(?:$Member)*};
289
Joe Perches95e2c602013-07-03 15:05:20 -0700290our $Int_type = qr{(?i)llu|ull|ll|lu|ul|l|u};
291our $Binary = qr{(?i)0b[01]+$Int_type?};
292our $Hex = qr{(?i)0x[0-9a-f]+$Int_type?};
293our $Int = qr{[0-9]+$Int_type?};
Joe Perches24358802014-04-03 14:49:13 -0700294our $Octal = qr{0[0-7]+$Int_type?};
Joe Perches326b1ff2013-02-04 14:28:51 -0800295our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
296our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
297our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?};
Joe Perches74349bc2012-12-17 16:02:05 -0800298our $Float = qr{$Float_hex|$Float_dec|$Float_int};
Joe Perches24358802014-04-03 14:49:13 -0700299our $Constant = qr{$Float|$Binary|$Octal|$Hex|$Int};
Joe Perches326b1ff2013-02-04 14:28:51 -0800300our $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
Joe Perches447432f2014-04-03 14:49:17 -0700301our $Compare = qr{<=|>=|==|!=|<|(?<!-)>};
Joe Perches23f780c2013-07-03 15:05:31 -0700302our $Arithmetic = qr{\+|-|\*|\/|%};
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700303our $Operators = qr{
304 <=|>=|==|!=|
305 =>|->|<<|>>|<|>|!|~|
Joe Perches23f780c2013-07-03 15:05:31 -0700306 &&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700307 }x;
308
Joe Perches91cb5192014-04-03 14:49:32 -0700309our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x;
310
Andy Whitcroft8905a672007-11-28 16:21:06 -0800311our $NonptrType;
Joe Perches8716de32013-09-11 14:24:05 -0700312our $NonptrTypeWithAttr;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800313our $Type;
314our $Declare;
315
Joe Perches15662b32011-10-31 17:13:12 -0700316our $NON_ASCII_UTF8 = qr{
317 [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
Andy Whitcroft171ae1a2008-04-29 00:59:32 -0700318 | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
319 | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
320 | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
321 | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
322 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
323 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
324}x;
325
Joe Perches15662b32011-10-31 17:13:12 -0700326our $UTF8 = qr{
327 [\x09\x0A\x0D\x20-\x7E] # ASCII
328 | $NON_ASCII_UTF8
329}x;
330
Andy Whitcroft8ed22ca2008-10-15 22:02:32 -0700331our $typeTypedefs = qr{(?x:
Andy Whitcroftfb9e9092009-09-21 17:04:38 -0700332 (?:__)?(?:u|s|be|le)(?:8|16|32|64)|
Andy Whitcroft8ed22ca2008-10-15 22:02:32 -0700333 atomic_t
334)};
335
Joe Perches691e6692010-03-05 13:43:51 -0800336our $logFunctions = qr{(?x:
Joe Perches6e60c022011-07-25 17:13:27 -0700337 printk(?:_ratelimited|_once|)|
Jacob Keller7d0b6592013-07-03 15:05:35 -0700338 (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
Joe Perches6e60c022011-07-25 17:13:27 -0700339 WARN(?:_RATELIMIT|_ONCE|)|
Joe Perchesb0531722011-05-24 17:13:40 -0700340 panic|
Joe Perches06668722013-11-12 15:10:07 -0800341 MODULE_[A-Z_]+|
342 seq_vprintf|seq_printf|seq_puts
Joe Perches691e6692010-03-05 13:43:51 -0800343)};
344
Joe Perches20112472011-07-25 17:13:23 -0700345our $signature_tags = qr{(?xi:
346 Signed-off-by:|
347 Acked-by:|
348 Tested-by:|
349 Reviewed-by:|
350 Reported-by:|
Mugunthan V N8543ae12013-04-29 16:18:17 -0700351 Suggested-by:|
Joe Perches20112472011-07-25 17:13:23 -0700352 To:|
353 Cc:
354)};
355
Andy Whitcroft8905a672007-11-28 16:21:06 -0800356our @typeList = (
357 qr{void},
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700358 qr{(?:unsigned\s+)?char},
359 qr{(?:unsigned\s+)?short},
360 qr{(?:unsigned\s+)?int},
361 qr{(?:unsigned\s+)?long},
362 qr{(?:unsigned\s+)?long\s+int},
363 qr{(?:unsigned\s+)?long\s+long},
364 qr{(?:unsigned\s+)?long\s+long\s+int},
Andy Whitcroft8905a672007-11-28 16:21:06 -0800365 qr{unsigned},
366 qr{float},
367 qr{double},
368 qr{bool},
Andy Whitcroft8905a672007-11-28 16:21:06 -0800369 qr{struct\s+$Ident},
370 qr{union\s+$Ident},
371 qr{enum\s+$Ident},
372 qr{${Ident}_t},
373 qr{${Ident}_handler},
374 qr{${Ident}_handler_fn},
375);
Joe Perches8716de32013-09-11 14:24:05 -0700376our @typeListWithAttr = (
377 @typeList,
378 qr{struct\s+$InitAttribute\s+$Ident},
379 qr{union\s+$InitAttribute\s+$Ident},
380);
381
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700382our @modifierList = (
383 qr{fastcall},
384);
Andy Whitcroft8905a672007-11-28 16:21:06 -0800385
Joe Perches24358802014-04-03 14:49:13 -0700386our @mode_permission_funcs = (
387 ["module_param", 3],
388 ["module_param_(?:array|named|string)", 4],
389 ["module_param_array_named", 5],
390 ["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],
391 ["proc_create(?:_data|)", 2],
392 ["(?:CLASS|DEVICE|SENSOR)_ATTR", 2],
393);
394
Joe Perches515a2352014-04-03 14:49:24 -0700395#Create a search pattern for all these functions to speed up a loop below
396our $mode_perms_search = "";
397foreach my $entry (@mode_permission_funcs) {
398 $mode_perms_search .= '|' if ($mode_perms_search ne "");
399 $mode_perms_search .= $entry->[0];
400}
401
Joe Perches3f7bac02014-06-04 16:12:04 -0700402our $declaration_macros = qr{(?x:
403 (?:$Storage\s+)?(?:DECLARE|DEFINE)_[A-Z]+\s*\(|
404 (?:$Storage\s+)?LIST_HEAD\s*\(
405)};
406
Wolfram Sang7840a942010-08-09 17:20:57 -0700407our $allowed_asm_includes = qr{(?x:
408 irq|
409 memory
410)};
411# memory.h: ARM has a custom one
412
Andy Whitcroft8905a672007-11-28 16:21:06 -0800413sub build_types {
Andy Whitcroftd2172eb2008-07-23 21:29:07 -0700414 my $mods = "(?x: \n" . join("|\n ", @modifierList) . "\n)";
415 my $all = "(?x: \n" . join("|\n ", @typeList) . "\n)";
Joe Perches8716de32013-09-11 14:24:05 -0700416 my $allWithAttr = "(?x: \n" . join("|\n ", @typeListWithAttr) . "\n)";
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -0700417 $Modifier = qr{(?:$Attribute|$Sparse|$mods)};
Andy Whitcroft8905a672007-11-28 16:21:06 -0800418 $NonptrType = qr{
Andy Whitcroftd2172eb2008-07-23 21:29:07 -0700419 (?:$Modifier\s+|const\s+)*
Andy Whitcroftcf655042008-03-04 14:28:20 -0800420 (?:
Andy Whitcroft6b48db22012-01-10 15:10:13 -0800421 (?:typeof|__typeof__)\s*\([^\)]*\)|
Andy Whitcroft8ed22ca2008-10-15 22:02:32 -0700422 (?:$typeTypedefs\b)|
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700423 (?:${all}\b)
Andy Whitcroftcf655042008-03-04 14:28:20 -0800424 )
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -0700425 (?:\s+$Modifier|\s+const)*
Andy Whitcroft8905a672007-11-28 16:21:06 -0800426 }x;
Joe Perches8716de32013-09-11 14:24:05 -0700427 $NonptrTypeWithAttr = qr{
428 (?:$Modifier\s+|const\s+)*
429 (?:
430 (?:typeof|__typeof__)\s*\([^\)]*\)|
431 (?:$typeTypedefs\b)|
432 (?:${allWithAttr}\b)
433 )
434 (?:\s+$Modifier|\s+const)*
435 }x;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800436 $Type = qr{
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700437 $NonptrType
Joe Perches1574a292014-08-06 16:10:50 -0700438 (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -0700439 (?:\s+$Inline|\s+$Modifier)*
Andy Whitcroft8905a672007-11-28 16:21:06 -0800440 }x;
Joe Perches91cb5192014-04-03 14:49:32 -0700441 $Declare = qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
Andy Whitcroft8905a672007-11-28 16:21:06 -0800442}
443build_types();
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700444
Joe Perches7d2367a2011-07-25 17:13:22 -0700445our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
Joe Perchesd1fe9c02012-03-23 15:02:16 -0700446
447# Using $balanced_parens, $LvalOrFunc, or $FuncArg
448# requires at least perl version v5.10.0
449# Any use must be runtime checked with $^V
450
451our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
Joe Perches24358802014-04-03 14:49:13 -0700452our $LvalOrFunc = qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
Joe Perchesd7c76ba2012-01-10 15:09:58 -0800453our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};
Joe Perches7d2367a2011-07-25 17:13:22 -0700454
455sub deparenthesize {
456 my ($string) = @_;
457 return "" if (!defined($string));
Joe Perches5b9553a2014-04-03 14:49:21 -0700458
459 while ($string =~ /^\s*\(.*\)\s*$/) {
460 $string =~ s@^\s*\(\s*@@;
461 $string =~ s@\s*\)\s*$@@;
462 }
463
Joe Perches7d2367a2011-07-25 17:13:22 -0700464 $string =~ s@\s+@ @g;
Joe Perches5b9553a2014-04-03 14:49:21 -0700465
Joe Perches7d2367a2011-07-25 17:13:22 -0700466 return $string;
467}
468
Joe Perches34456862013-07-03 15:05:34 -0700469sub seed_camelcase_file {
470 my ($file) = @_;
471
472 return if (!(-f $file));
473
474 local $/;
475
476 open(my $include_file, '<', "$file")
477 or warn "$P: Can't read '$file' $!\n";
478 my $text = <$include_file>;
479 close($include_file);
480
481 my @lines = split('\n', $text);
482
483 foreach my $line (@lines) {
484 next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
485 if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
486 $camelcase{$1} = 1;
Joe Perches11ea5162013-11-12 15:10:08 -0800487 } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
488 $camelcase{$1} = 1;
489 } elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
Joe Perches34456862013-07-03 15:05:34 -0700490 $camelcase{$1} = 1;
491 }
492 }
493}
494
495my $camelcase_seeded = 0;
496sub seed_camelcase_includes {
497 return if ($camelcase_seeded);
498
499 my $files;
Joe Perchesc707a812013-07-08 16:00:43 -0700500 my $camelcase_cache = "";
501 my @include_files = ();
502
503 $camelcase_seeded = 1;
Joe Perches351b2a12013-07-03 15:05:36 -0700504
Richard Genoud3645e322014-02-10 14:25:32 -0800505 if (-e ".git") {
Joe Perches351b2a12013-07-03 15:05:36 -0700506 my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
507 chomp $git_last_include_commit;
Joe Perchesc707a812013-07-08 16:00:43 -0700508 $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
Joe Perches34456862013-07-03 15:05:34 -0700509 } else {
Joe Perchesc707a812013-07-08 16:00:43 -0700510 my $last_mod_date = 0;
Joe Perches34456862013-07-03 15:05:34 -0700511 $files = `find $root/include -name "*.h"`;
Joe Perchesc707a812013-07-08 16:00:43 -0700512 @include_files = split('\n', $files);
513 foreach my $file (@include_files) {
514 my $date = POSIX::strftime("%Y%m%d%H%M",
515 localtime((stat $file)[9]));
516 $last_mod_date = $date if ($last_mod_date < $date);
517 }
518 $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
Joe Perches34456862013-07-03 15:05:34 -0700519 }
Joe Perchesc707a812013-07-08 16:00:43 -0700520
521 if ($camelcase_cache ne "" && -f $camelcase_cache) {
522 open(my $camelcase_file, '<', "$camelcase_cache")
523 or warn "$P: Can't read '$camelcase_cache' $!\n";
524 while (<$camelcase_file>) {
525 chomp;
526 $camelcase{$_} = 1;
527 }
528 close($camelcase_file);
529
530 return;
531 }
532
Richard Genoud3645e322014-02-10 14:25:32 -0800533 if (-e ".git") {
Joe Perchesc707a812013-07-08 16:00:43 -0700534 $files = `git ls-files "include/*.h"`;
535 @include_files = split('\n', $files);
536 }
537
Joe Perches34456862013-07-03 15:05:34 -0700538 foreach my $file (@include_files) {
539 seed_camelcase_file($file);
540 }
Joe Perches351b2a12013-07-03 15:05:36 -0700541
Joe Perchesc707a812013-07-08 16:00:43 -0700542 if ($camelcase_cache ne "") {
Joe Perches351b2a12013-07-03 15:05:36 -0700543 unlink glob ".checkpatch-camelcase.*";
Joe Perchesc707a812013-07-08 16:00:43 -0700544 open(my $camelcase_file, '>', "$camelcase_cache")
545 or warn "$P: Can't write '$camelcase_cache' $!\n";
Joe Perches351b2a12013-07-03 15:05:36 -0700546 foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
547 print $camelcase_file ("$_\n");
548 }
549 close($camelcase_file);
550 }
Joe Perches34456862013-07-03 15:05:34 -0700551}
552
Joe Perchesd311cd42014-08-06 16:10:57 -0700553sub git_commit_info {
554 my ($commit, $id, $desc) = @_;
555
556 return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));
557
558 my $output = `git log --no-color --format='%H %s' -1 $commit 2>&1`;
559 $output =~ s/^\s*//gm;
560 my @lines = split("\n", $output);
561
562 if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous\./) {
563# Maybe one day convert this block of bash into something that returns
564# all matching commit ids, but it's very slow...
565#
566# echo "checking commits $1..."
567# git rev-list --remotes | grep -i "^$1" |
568# while read line ; do
569# git log --format='%H %s' -1 $line |
570# echo "commit $(cut -c 1-12,41-)"
571# done
572 } elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
573 } else {
574 $id = substr($lines[0], 0, 12);
575 $desc = substr($lines[0], 41);
576 }
577
578 return ($id, $desc);
579}
580
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700581$chk_signoff = 0 if ($file);
582
Andy Whitcroft00df344f2007-06-08 13:47:06 -0700583my @rawlines = ();
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800584my @lines = ();
Joe Perches3705ce52013-07-03 15:05:31 -0700585my @fixed = ();
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800586my $vname;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700587for my $filename (@ARGV) {
Andy Whitcroft21caa132009-01-06 14:41:30 -0800588 my $FILE;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700589 if ($file) {
Andy Whitcroft21caa132009-01-06 14:41:30 -0800590 open($FILE, '-|', "diff -u /dev/null $filename") ||
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700591 die "$P: $filename: diff failed - $!\n";
Andy Whitcroft21caa132009-01-06 14:41:30 -0800592 } elsif ($filename eq '-') {
593 open($FILE, '<&STDIN');
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700594 } else {
Andy Whitcroft21caa132009-01-06 14:41:30 -0800595 open($FILE, '<', "$filename") ||
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700596 die "$P: $filename: open failed - $!\n";
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700597 }
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800598 if ($filename eq '-') {
599 $vname = 'Your patch';
600 } else {
601 $vname = $filename;
602 }
Andy Whitcroft21caa132009-01-06 14:41:30 -0800603 while (<$FILE>) {
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700604 chomp;
605 push(@rawlines, $_);
606 }
Andy Whitcroft21caa132009-01-06 14:41:30 -0800607 close($FILE);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800608 if (!process($filename)) {
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700609 $exit = 1;
610 }
611 @rawlines = ();
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800612 @lines = ();
Joe Perches3705ce52013-07-03 15:05:31 -0700613 @fixed = ();
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700614}
615
616exit($exit);
617
618sub top_of_kernel_tree {
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700619 my ($root) = @_;
620
621 my @tree_check = (
622 "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
623 "README", "Documentation", "arch", "include", "drivers",
624 "fs", "init", "ipc", "kernel", "lib", "scripts",
625 );
626
627 foreach my $check (@tree_check) {
628 if (! -e $root . '/' . $check) {
629 return 0;
630 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700631 }
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700632 return 1;
Joe Perches8f26b832012-10-04 17:13:32 -0700633}
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700634
Joe Perches20112472011-07-25 17:13:23 -0700635sub parse_email {
636 my ($formatted_email) = @_;
637
638 my $name = "";
639 my $address = "";
640 my $comment = "";
641
642 if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
643 $name = $1;
644 $address = $2;
645 $comment = $3 if defined $3;
646 } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
647 $address = $1;
648 $comment = $2 if defined $2;
649 } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
650 $address = $1;
651 $comment = $2 if defined $2;
652 $formatted_email =~ s/$address.*$//;
653 $name = $formatted_email;
Joe Perches3705ce52013-07-03 15:05:31 -0700654 $name = trim($name);
Joe Perches20112472011-07-25 17:13:23 -0700655 $name =~ s/^\"|\"$//g;
656 # If there's a name left after stripping spaces and
657 # leading quotes, and the address doesn't have both
658 # leading and trailing angle brackets, the address
659 # is invalid. ie:
660 # "joe smith joe@smith.com" bad
661 # "joe smith <joe@smith.com" bad
662 if ($name ne "" && $address !~ /^<[^>]+>$/) {
663 $name = "";
664 $address = "";
665 $comment = "";
666 }
667 }
668
Joe Perches3705ce52013-07-03 15:05:31 -0700669 $name = trim($name);
Joe Perches20112472011-07-25 17:13:23 -0700670 $name =~ s/^\"|\"$//g;
Joe Perches3705ce52013-07-03 15:05:31 -0700671 $address = trim($address);
Joe Perches20112472011-07-25 17:13:23 -0700672 $address =~ s/^\<|\>$//g;
673
674 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
675 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
676 $name = "\"$name\"";
677 }
678
679 return ($name, $address, $comment);
680}
681
682sub format_email {
683 my ($name, $address) = @_;
684
685 my $formatted_email;
686
Joe Perches3705ce52013-07-03 15:05:31 -0700687 $name = trim($name);
Joe Perches20112472011-07-25 17:13:23 -0700688 $name =~ s/^\"|\"$//g;
Joe Perches3705ce52013-07-03 15:05:31 -0700689 $address = trim($address);
Joe Perches20112472011-07-25 17:13:23 -0700690
691 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
692 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
693 $name = "\"$name\"";
694 }
695
696 if ("$name" eq "") {
697 $formatted_email = "$address";
698 } else {
699 $formatted_email = "$name <$address>";
700 }
701
702 return $formatted_email;
703}
704
Joe Perchesd311cd42014-08-06 16:10:57 -0700705sub which {
706 my ($bin) = @_;
707
708 foreach my $path (split(/:/, $ENV{PATH})) {
709 if (-e "$path/$bin") {
710 return "$path/$bin";
711 }
712 }
713
714 return "";
715}
716
Joe Perches000d1cc12011-07-25 17:13:25 -0700717sub which_conf {
718 my ($conf) = @_;
719
720 foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
721 if (-e "$path/$conf") {
722 return "$path/$conf";
723 }
724 }
725
726 return "";
727}
728
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700729sub expand_tabs {
730 my ($str) = @_;
731
732 my $res = '';
733 my $n = 0;
734 for my $c (split(//, $str)) {
735 if ($c eq "\t") {
736 $res .= ' ';
737 $n++;
738 for (; ($n % 8) != 0; $n++) {
739 $res .= ' ';
740 }
741 next;
742 }
743 $res .= $c;
744 $n++;
745 }
746
747 return $res;
748}
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700749sub copy_spacing {
Andy Whitcroft773647a2008-03-28 14:15:58 -0700750 (my $res = shift) =~ tr/\t/ /c;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700751 return $res;
752}
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700753
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -0700754sub line_stats {
755 my ($line) = @_;
756
757 # Drop the diff line leader and expand tabs
758 $line =~ s/^.//;
759 $line = expand_tabs($line);
760
761 # Pick the indent from the front of the line.
762 my ($white) = ($line =~ /^(\s*)/);
763
764 return (length($line), length($white));
765}
766
Andy Whitcroft773647a2008-03-28 14:15:58 -0700767my $sanitise_quote = '';
768
769sub sanitise_line_reset {
770 my ($in_comment) = @_;
771
772 if ($in_comment) {
773 $sanitise_quote = '*/';
774 } else {
775 $sanitise_quote = '';
776 }
777}
Andy Whitcroft00df344f2007-06-08 13:47:06 -0700778sub sanitise_line {
779 my ($line) = @_;
780
781 my $res = '';
782 my $l = '';
783
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800784 my $qlen = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -0700785 my $off = 0;
786 my $c;
Andy Whitcroft00df344f2007-06-08 13:47:06 -0700787
Andy Whitcroft773647a2008-03-28 14:15:58 -0700788 # Always copy over the diff marker.
789 $res = substr($line, 0, 1);
790
791 for ($off = 1; $off < length($line); $off++) {
792 $c = substr($line, $off, 1);
793
794 # Comments we are wacking completly including the begin
795 # and end, all to $;.
796 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
797 $sanitise_quote = '*/';
798
799 substr($res, $off, 2, "$;$;");
800 $off++;
801 next;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800802 }
Andy Whitcroft81bc0e02008-10-15 22:02:26 -0700803 if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
Andy Whitcroft773647a2008-03-28 14:15:58 -0700804 $sanitise_quote = '';
805 substr($res, $off, 2, "$;$;");
806 $off++;
807 next;
808 }
Daniel Walker113f04a2009-09-21 17:04:35 -0700809 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
810 $sanitise_quote = '//';
811
812 substr($res, $off, 2, $sanitise_quote);
813 $off++;
814 next;
815 }
Andy Whitcroft773647a2008-03-28 14:15:58 -0700816
817 # A \ in a string means ignore the next character.
818 if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
819 $c eq "\\") {
820 substr($res, $off, 2, 'XX');
821 $off++;
822 next;
823 }
824 # Regular quotes.
825 if ($c eq "'" || $c eq '"') {
826 if ($sanitise_quote eq '') {
827 $sanitise_quote = $c;
828
829 substr($res, $off, 1, $c);
Andy Whitcroft00df344f2007-06-08 13:47:06 -0700830 next;
Andy Whitcroft773647a2008-03-28 14:15:58 -0700831 } elsif ($sanitise_quote eq $c) {
832 $sanitise_quote = '';
Andy Whitcroft00df344f2007-06-08 13:47:06 -0700833 }
834 }
Andy Whitcroft773647a2008-03-28 14:15:58 -0700835
Andy Whitcroftfae17da2009-01-06 14:41:20 -0800836 #print "c<$c> SQ<$sanitise_quote>\n";
Andy Whitcroft773647a2008-03-28 14:15:58 -0700837 if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
838 substr($res, $off, 1, $;);
Daniel Walker113f04a2009-09-21 17:04:35 -0700839 } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
840 substr($res, $off, 1, $;);
Andy Whitcroft773647a2008-03-28 14:15:58 -0700841 } elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
842 substr($res, $off, 1, 'X');
Andy Whitcroft00df344f2007-06-08 13:47:06 -0700843 } else {
Andy Whitcroft773647a2008-03-28 14:15:58 -0700844 substr($res, $off, 1, $c);
Andy Whitcroft00df344f2007-06-08 13:47:06 -0700845 }
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800846 }
847
Daniel Walker113f04a2009-09-21 17:04:35 -0700848 if ($sanitise_quote eq '//') {
849 $sanitise_quote = '';
850 }
851
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800852 # The pathname on a #include may be surrounded by '<' and '>'.
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700853 if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800854 my $clean = 'X' x length($1);
855 $res =~ s@\<.*\>@<$clean>@;
856
857 # The whole of a #error is a string.
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700858 } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800859 my $clean = 'X' x length($1);
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700860 $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800861 }
862
Andy Whitcroft00df344f2007-06-08 13:47:06 -0700863 return $res;
864}
865
Joe Perchesa6962d72013-04-29 16:18:13 -0700866sub get_quoted_string {
867 my ($line, $rawline) = @_;
868
869 return "" if ($line !~ m/(\"[X]+\")/g);
870 return substr($rawline, $-[0], $+[0] - $-[0]);
871}
872
Andy Whitcroft8905a672007-11-28 16:21:06 -0800873sub ctx_statement_block {
874 my ($linenr, $remain, $off) = @_;
875 my $line = $linenr - 1;
876 my $blk = '';
877 my $soff = $off;
878 my $coff = $off - 1;
Andy Whitcroft773647a2008-03-28 14:15:58 -0700879 my $coff_set = 0;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800880
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800881 my $loff = 0;
882
Andy Whitcroft8905a672007-11-28 16:21:06 -0800883 my $type = '';
884 my $level = 0;
Andy Whitcrofta2750642009-01-15 13:51:04 -0800885 my @stack = ();
Andy Whitcroftcf655042008-03-04 14:28:20 -0800886 my $p;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800887 my $c;
888 my $len = 0;
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800889
890 my $remainder;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800891 while (1) {
Andy Whitcrofta2750642009-01-15 13:51:04 -0800892 @stack = (['', 0]) if ($#stack == -1);
893
Andy Whitcroft773647a2008-03-28 14:15:58 -0700894 #warn "CSB: blk<$blk> remain<$remain>\n";
Andy Whitcroft8905a672007-11-28 16:21:06 -0800895 # If we are about to drop off the end, pull in more
896 # context.
897 if ($off >= $len) {
898 for (; $remain > 0; $line++) {
Andy Whitcroftdea33492008-10-15 22:02:25 -0700899 last if (!defined $lines[$line]);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800900 next if ($lines[$line] =~ /^-/);
Andy Whitcroft8905a672007-11-28 16:21:06 -0800901 $remain--;
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800902 $loff = $len;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800903 $blk .= $lines[$line] . "\n";
Andy Whitcroft8905a672007-11-28 16:21:06 -0800904 $len = length($blk);
905 $line++;
906 last;
907 }
908 # Bail if there is no further context.
909 #warn "CSB: blk<$blk> off<$off> len<$len>\n";
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800910 if ($off >= $len) {
Andy Whitcroft8905a672007-11-28 16:21:06 -0800911 last;
912 }
Andy Whitcroftf74bd192012-01-10 15:09:54 -0800913 if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
914 $level++;
915 $type = '#';
916 }
Andy Whitcroft8905a672007-11-28 16:21:06 -0800917 }
Andy Whitcroftcf655042008-03-04 14:28:20 -0800918 $p = $c;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800919 $c = substr($blk, $off, 1);
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800920 $remainder = substr($blk, $off);
Andy Whitcroft8905a672007-11-28 16:21:06 -0800921
Andy Whitcroft773647a2008-03-28 14:15:58 -0700922 #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
Andy Whitcroft4635f4f2009-01-06 14:41:27 -0800923
924 # Handle nested #if/#else.
925 if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
926 push(@stack, [ $type, $level ]);
927 } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
928 ($type, $level) = @{$stack[$#stack - 1]};
929 } elsif ($remainder =~ /^#\s*endif\b/) {
930 ($type, $level) = @{pop(@stack)};
931 }
932
Andy Whitcroft8905a672007-11-28 16:21:06 -0800933 # Statement ends at the ';' or a close '}' at the
934 # outermost level.
935 if ($level == 0 && $c eq ';') {
936 last;
937 }
938
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800939 # An else is really a conditional as long as its not else if
Andy Whitcroft773647a2008-03-28 14:15:58 -0700940 if ($level == 0 && $coff_set == 0 &&
941 (!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
942 $remainder =~ /^(else)(?:\s|{)/ &&
943 $remainder !~ /^else\s+if\b/) {
944 $coff = $off + length($1) - 1;
945 $coff_set = 1;
946 #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
947 #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800948 }
949
Andy Whitcroft8905a672007-11-28 16:21:06 -0800950 if (($type eq '' || $type eq '(') && $c eq '(') {
951 $level++;
952 $type = '(';
953 }
954 if ($type eq '(' && $c eq ')') {
955 $level--;
956 $type = ($level != 0)? '(' : '';
957
958 if ($level == 0 && $coff < $soff) {
959 $coff = $off;
Andy Whitcroft773647a2008-03-28 14:15:58 -0700960 $coff_set = 1;
961 #warn "CSB: mark coff<$coff>\n";
Andy Whitcroft8905a672007-11-28 16:21:06 -0800962 }
963 }
964 if (($type eq '' || $type eq '{') && $c eq '{') {
965 $level++;
966 $type = '{';
967 }
968 if ($type eq '{' && $c eq '}') {
969 $level--;
970 $type = ($level != 0)? '{' : '';
971
972 if ($level == 0) {
Patrick Pannutob998e002010-08-09 17:21:03 -0700973 if (substr($blk, $off + 1, 1) eq ';') {
974 $off++;
975 }
Andy Whitcroft8905a672007-11-28 16:21:06 -0800976 last;
977 }
978 }
Andy Whitcroftf74bd192012-01-10 15:09:54 -0800979 # Preprocessor commands end at the newline unless escaped.
980 if ($type eq '#' && $c eq "\n" && $p ne "\\") {
981 $level--;
982 $type = '';
983 $off++;
984 last;
985 }
Andy Whitcroft8905a672007-11-28 16:21:06 -0800986 $off++;
987 }
Andy Whitcrofta3bb97a2008-07-23 21:29:00 -0700988 # We are truly at the end, so shuffle to the next line.
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800989 if ($off == $len) {
Andy Whitcrofta3bb97a2008-07-23 21:29:00 -0700990 $loff = $len + 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800991 $line++;
992 $remain--;
993 }
Andy Whitcroft8905a672007-11-28 16:21:06 -0800994
995 my $statement = substr($blk, $soff, $off - $soff + 1);
996 my $condition = substr($blk, $soff, $coff - $soff + 1);
997
998 #warn "STATEMENT<$statement>\n";
999 #warn "CONDITION<$condition>\n";
1000
Andy Whitcroft773647a2008-03-28 14:15:58 -07001001 #print "coff<$coff> soff<$off> loff<$loff>\n";
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001002
1003 return ($statement, $condition,
1004 $line, $remain + 1, $off - $loff + 1, $level);
1005}
1006
Andy Whitcroftcf655042008-03-04 14:28:20 -08001007sub statement_lines {
1008 my ($stmt) = @_;
1009
1010 # Strip the diff line prefixes and rip blank lines at start and end.
1011 $stmt =~ s/(^|\n)./$1/g;
1012 $stmt =~ s/^\s*//;
1013 $stmt =~ s/\s*$//;
1014
1015 my @stmt_lines = ($stmt =~ /\n/g);
1016
1017 return $#stmt_lines + 2;
1018}
1019
1020sub statement_rawlines {
1021 my ($stmt) = @_;
1022
1023 my @stmt_lines = ($stmt =~ /\n/g);
1024
1025 return $#stmt_lines + 2;
1026}
1027
1028sub statement_block_size {
1029 my ($stmt) = @_;
1030
1031 $stmt =~ s/(^|\n)./$1/g;
1032 $stmt =~ s/^\s*{//;
1033 $stmt =~ s/}\s*$//;
1034 $stmt =~ s/^\s*//;
1035 $stmt =~ s/\s*$//;
1036
1037 my @stmt_lines = ($stmt =~ /\n/g);
1038 my @stmt_statements = ($stmt =~ /;/g);
1039
1040 my $stmt_lines = $#stmt_lines + 2;
1041 my $stmt_statements = $#stmt_statements + 1;
1042
1043 if ($stmt_lines > $stmt_statements) {
1044 return $stmt_lines;
1045 } else {
1046 return $stmt_statements;
1047 }
1048}
1049
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001050sub ctx_statement_full {
1051 my ($linenr, $remain, $off) = @_;
1052 my ($statement, $condition, $level);
1053
1054 my (@chunks);
1055
Andy Whitcroftcf655042008-03-04 14:28:20 -08001056 # Grab the first conditional/block pair.
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001057 ($statement, $condition, $linenr, $remain, $off, $level) =
1058 ctx_statement_block($linenr, $remain, $off);
Andy Whitcroft773647a2008-03-28 14:15:58 -07001059 #print "F: c<$condition> s<$statement> remain<$remain>\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08001060 push(@chunks, [ $condition, $statement ]);
1061 if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
1062 return ($level, $linenr, @chunks);
1063 }
1064
1065 # Pull in the following conditional/block pairs and see if they
1066 # could continue the statement.
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001067 for (;;) {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001068 ($statement, $condition, $linenr, $remain, $off, $level) =
1069 ctx_statement_block($linenr, $remain, $off);
Andy Whitcroftcf655042008-03-04 14:28:20 -08001070 #print "C: c<$condition> s<$statement> remain<$remain>\n";
Andy Whitcroft773647a2008-03-28 14:15:58 -07001071 last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
Andy Whitcroftcf655042008-03-04 14:28:20 -08001072 #print "C: push\n";
1073 push(@chunks, [ $condition, $statement ]);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001074 }
1075
1076 return ($level, $linenr, @chunks);
Andy Whitcroft8905a672007-11-28 16:21:06 -08001077}
1078
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001079sub ctx_block_get {
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001080 my ($linenr, $remain, $outer, $open, $close, $off) = @_;
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001081 my $line;
1082 my $start = $linenr - 1;
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001083 my $blk = '';
1084 my @o;
1085 my @c;
1086 my @res = ();
1087
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001088 my $level = 0;
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001089 my @stack = ($level);
Andy Whitcroft00df344f2007-06-08 13:47:06 -07001090 for ($line = $start; $remain > 0; $line++) {
1091 next if ($rawlines[$line] =~ /^-/);
1092 $remain--;
1093
1094 $blk .= $rawlines[$line];
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001095
1096 # Handle nested #if/#else.
Andy Whitcroft01464f32010-10-26 14:23:19 -07001097 if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001098 push(@stack, $level);
Andy Whitcroft01464f32010-10-26 14:23:19 -07001099 } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001100 $level = $stack[$#stack - 1];
Andy Whitcroft01464f32010-10-26 14:23:19 -07001101 } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001102 $level = pop(@stack);
1103 }
1104
Andy Whitcroft01464f32010-10-26 14:23:19 -07001105 foreach my $c (split(//, $lines[$line])) {
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001106 ##print "C<$c>L<$level><$open$close>O<$off>\n";
1107 if ($off > 0) {
1108 $off--;
1109 next;
1110 }
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001111
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001112 if ($c eq $close && $level > 0) {
1113 $level--;
1114 last if ($level == 0);
1115 } elsif ($c eq $open) {
1116 $level++;
1117 }
1118 }
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001119
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001120 if (!$outer || $level <= 1) {
Andy Whitcroft00df344f2007-06-08 13:47:06 -07001121 push(@res, $rawlines[$line]);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001122 }
1123
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001124 last if ($level == 0);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001125 }
1126
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001127 return ($level, @res);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001128}
1129sub ctx_block_outer {
1130 my ($linenr, $remain) = @_;
1131
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001132 my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
1133 return @r;
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001134}
1135sub ctx_block {
1136 my ($linenr, $remain) = @_;
1137
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001138 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1139 return @r;
Andy Whitcroft653d4872007-06-23 17:16:34 -07001140}
1141sub ctx_statement {
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001142 my ($linenr, $remain, $off) = @_;
1143
1144 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1145 return @r;
1146}
1147sub ctx_block_level {
Andy Whitcroft653d4872007-06-23 17:16:34 -07001148 my ($linenr, $remain) = @_;
1149
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001150 return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001151}
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001152sub ctx_statement_level {
1153 my ($linenr, $remain, $off) = @_;
1154
1155 return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1156}
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001157
1158sub ctx_locate_comment {
1159 my ($first_line, $end_line) = @_;
1160
1161 # Catch a comment on the end of the line itself.
Andy Whitcroftbeae6332008-07-23 21:28:59 -07001162 my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001163 return $current_comment if (defined $current_comment);
1164
1165 # Look through the context and try and figure out if there is a
1166 # comment.
1167 my $in_comment = 0;
1168 $current_comment = '';
1169 for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
Andy Whitcroft00df344f2007-06-08 13:47:06 -07001170 my $line = $rawlines[$linenr - 1];
1171 #warn " $line\n";
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001172 if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
1173 $in_comment = 1;
1174 }
1175 if ($line =~ m@/\*@) {
1176 $in_comment = 1;
1177 }
1178 if (!$in_comment && $current_comment ne '') {
1179 $current_comment = '';
1180 }
1181 $current_comment .= $line . "\n" if ($in_comment);
1182 if ($line =~ m@\*/@) {
1183 $in_comment = 0;
1184 }
1185 }
1186
1187 chomp($current_comment);
1188 return($current_comment);
1189}
1190sub ctx_has_comment {
1191 my ($first_line, $end_line) = @_;
1192 my $cmt = ctx_locate_comment($first_line, $end_line);
1193
Andy Whitcroft00df344f2007-06-08 13:47:06 -07001194 ##print "LINE: $rawlines[$end_line - 1 ]\n";
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001195 ##print "CMMT: $cmt\n";
1196
1197 return ($cmt ne '');
1198}
1199
Andy Whitcroft4d001e42008-10-15 22:02:21 -07001200sub raw_line {
1201 my ($linenr, $cnt) = @_;
1202
1203 my $offset = $linenr - 1;
1204 $cnt++;
1205
1206 my $line;
1207 while ($cnt) {
1208 $line = $rawlines[$offset++];
1209 next if (defined($line) && $line =~ /^-/);
1210 $cnt--;
1211 }
1212
1213 return $line;
1214}
1215
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001216sub cat_vet {
1217 my ($vet) = @_;
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001218 my ($res, $coded);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001219
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001220 $res = '';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001221 while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
1222 $res .= $1;
1223 if ($2 ne '') {
1224 $coded = sprintf("^%c", unpack('C', $2) + 64);
1225 $res .= $coded;
1226 }
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001227 }
1228 $res =~ s/$/\$/;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001229
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001230 return $res;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001231}
1232
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001233my $av_preprocessor = 0;
Andy Whitcroftcf655042008-03-04 14:28:20 -08001234my $av_pending;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001235my @av_paren_type;
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001236my $av_pend_colon;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001237
1238sub annotate_reset {
1239 $av_preprocessor = 0;
Andy Whitcroftcf655042008-03-04 14:28:20 -08001240 $av_pending = '_';
1241 @av_paren_type = ('E');
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001242 $av_pend_colon = 'O';
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001243}
1244
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001245sub annotate_values {
1246 my ($stream, $type) = @_;
1247
1248 my $res;
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001249 my $var = '_' x length($stream);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001250 my $cur = $stream;
1251
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001252 print "$stream\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001253
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001254 while (length($cur)) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001255 @av_paren_type = ('E') if ($#av_paren_type < 0);
Andy Whitcroftcf655042008-03-04 14:28:20 -08001256 print " <" . join('', @av_paren_type) .
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001257 "> <$type> <$av_pending>" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001258 if ($cur =~ /^(\s+)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001259 print "WS($1)\n" if ($dbg_values > 1);
1260 if ($1 =~ /\n/ && $av_preprocessor) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001261 $type = pop(@av_paren_type);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001262 $av_preprocessor = 0;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001263 }
1264
Florian Micklerc023e4732011-01-12 16:59:58 -08001265 } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
Andy Whitcroft9446ef52010-10-26 14:23:13 -07001266 print "CAST($1)\n" if ($dbg_values > 1);
1267 push(@av_paren_type, $type);
Andy Whitcroftaddcdce2012-01-10 15:10:11 -08001268 $type = 'c';
Andy Whitcroft9446ef52010-10-26 14:23:13 -07001269
Andy Whitcrofte91b6e22010-10-26 14:23:11 -07001270 } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001271 print "DECLARE($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001272 $type = 'T';
1273
Andy Whitcroft389a2fe2008-07-23 21:29:05 -07001274 } elsif ($cur =~ /^($Modifier)\s*/) {
1275 print "MODIFIER($1)\n" if ($dbg_values > 1);
1276 $type = 'T';
1277
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001278 } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001279 print "DEFINE($1,$2)\n" if ($dbg_values > 1);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001280 $av_preprocessor = 1;
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001281 push(@av_paren_type, $type);
1282 if ($2 ne '') {
1283 $av_pending = 'N';
1284 }
1285 $type = 'E';
1286
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001287 } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001288 print "UNDEF($1)\n" if ($dbg_values > 1);
1289 $av_preprocessor = 1;
1290 push(@av_paren_type, $type);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001291
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001292 } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001293 print "PRE_START($1)\n" if ($dbg_values > 1);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001294 $av_preprocessor = 1;
Andy Whitcroftcf655042008-03-04 14:28:20 -08001295
1296 push(@av_paren_type, $type);
1297 push(@av_paren_type, $type);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001298 $type = 'E';
Andy Whitcroftcf655042008-03-04 14:28:20 -08001299
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001300 } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001301 print "PRE_RESTART($1)\n" if ($dbg_values > 1);
1302 $av_preprocessor = 1;
1303
1304 push(@av_paren_type, $av_paren_type[$#av_paren_type]);
1305
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001306 $type = 'E';
Andy Whitcroftcf655042008-03-04 14:28:20 -08001307
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001308 } elsif ($cur =~ /^(\#\s*(?:endif))/o) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001309 print "PRE_END($1)\n" if ($dbg_values > 1);
1310
1311 $av_preprocessor = 1;
1312
1313 # Assume all arms of the conditional end as this
1314 # one does, and continue as if the #endif was not here.
1315 pop(@av_paren_type);
1316 push(@av_paren_type, $type);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001317 $type = 'E';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001318
1319 } elsif ($cur =~ /^(\\\n)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001320 print "PRECONT($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001321
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001322 } elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
1323 print "ATTR($1)\n" if ($dbg_values > 1);
1324 $av_pending = $type;
1325 $type = 'N';
1326
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001327 } elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001328 print "SIZEOF($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001329 if (defined $2) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001330 $av_pending = 'V';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001331 }
1332 $type = 'N';
1333
Andy Whitcroft14b111c2008-10-15 22:02:16 -07001334 } elsif ($cur =~ /^(if|while|for)\b/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001335 print "COND($1)\n" if ($dbg_values > 1);
Andy Whitcroft14b111c2008-10-15 22:02:16 -07001336 $av_pending = 'E';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001337 $type = 'N';
1338
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001339 } elsif ($cur =~/^(case)/o) {
1340 print "CASE($1)\n" if ($dbg_values > 1);
1341 $av_pend_colon = 'C';
1342 $type = 'N';
1343
Andy Whitcroft14b111c2008-10-15 22:02:16 -07001344 } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001345 print "KEYWORD($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001346 $type = 'N';
1347
1348 } elsif ($cur =~ /^(\()/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001349 print "PAREN('$1')\n" if ($dbg_values > 1);
Andy Whitcroftcf655042008-03-04 14:28:20 -08001350 push(@av_paren_type, $av_pending);
1351 $av_pending = '_';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001352 $type = 'N';
1353
1354 } elsif ($cur =~ /^(\))/o) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001355 my $new_type = pop(@av_paren_type);
1356 if ($new_type ne '_') {
1357 $type = $new_type;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001358 print "PAREN('$1') -> $type\n"
1359 if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001360 } else {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001361 print "PAREN('$1')\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001362 }
1363
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -07001364 } elsif ($cur =~ /^($Ident)\s*\(/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001365 print "FUNC($1)\n" if ($dbg_values > 1);
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -07001366 $type = 'V';
Andy Whitcroftcf655042008-03-04 14:28:20 -08001367 $av_pending = 'V';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001368
Andy Whitcroft8e761b02009-01-06 14:41:19 -08001369 } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
1370 if (defined $2 && $type eq 'C' || $type eq 'T') {
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001371 $av_pend_colon = 'B';
Andy Whitcroft8e761b02009-01-06 14:41:19 -08001372 } elsif ($type eq 'E') {
1373 $av_pend_colon = 'L';
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001374 }
1375 print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
1376 $type = 'V';
1377
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001378 } elsif ($cur =~ /^($Ident|$Constant)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001379 print "IDENT($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001380 $type = 'V';
1381
1382 } elsif ($cur =~ /^($Assignment)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001383 print "ASSIGN($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001384 $type = 'N';
1385
Andy Whitcroftcf655042008-03-04 14:28:20 -08001386 } elsif ($cur =~/^(;|{|})/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001387 print "END($1)\n" if ($dbg_values > 1);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001388 $type = 'E';
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001389 $av_pend_colon = 'O';
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001390
Andy Whitcroft8e761b02009-01-06 14:41:19 -08001391 } elsif ($cur =~/^(,)/) {
1392 print "COMMA($1)\n" if ($dbg_values > 1);
1393 $type = 'C';
1394
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001395 } elsif ($cur =~ /^(\?)/o) {
1396 print "QUESTION($1)\n" if ($dbg_values > 1);
1397 $type = 'N';
1398
1399 } elsif ($cur =~ /^(:)/o) {
1400 print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
1401
1402 substr($var, length($res), 1, $av_pend_colon);
1403 if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
1404 $type = 'E';
1405 } else {
1406 $type = 'N';
1407 }
1408 $av_pend_colon = 'O';
1409
Andy Whitcroft8e761b02009-01-06 14:41:19 -08001410 } elsif ($cur =~ /^(\[)/o) {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001411 print "CLOSE($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001412 $type = 'N';
1413
Andy Whitcroft0d413862008-10-15 22:02:16 -07001414 } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
Andy Whitcroft74048ed2008-07-23 21:29:10 -07001415 my $variant;
1416
1417 print "OPV($1)\n" if ($dbg_values > 1);
1418 if ($type eq 'V') {
1419 $variant = 'B';
1420 } else {
1421 $variant = 'U';
1422 }
1423
1424 substr($var, length($res), 1, $variant);
1425 $type = 'N';
1426
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001427 } elsif ($cur =~ /^($Operators)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001428 print "OP($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001429 if ($1 ne '++' && $1 ne '--') {
1430 $type = 'N';
1431 }
1432
1433 } elsif ($cur =~ /(^.)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001434 print "C($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001435 }
1436 if (defined $1) {
1437 $cur = substr($cur, length($1));
1438 $res .= $type x length($1);
1439 }
1440 }
1441
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001442 return ($res, $var);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001443}
1444
Andy Whitcroft8905a672007-11-28 16:21:06 -08001445sub possible {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001446 my ($possible, $line) = @_;
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001447 my $notPermitted = qr{(?:
Andy Whitcroft0776e592008-10-15 22:02:29 -07001448 ^(?:
1449 $Modifier|
1450 $Storage|
1451 $Type|
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001452 DEFINE_\S+
1453 )$|
1454 ^(?:
Andy Whitcroft0776e592008-10-15 22:02:29 -07001455 goto|
1456 return|
1457 case|
1458 else|
1459 asm|__asm__|
Andy Whitcroft89a88352012-01-10 15:10:00 -08001460 do|
1461 \#|
1462 \#\#|
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001463 )(?:\s|$)|
Andy Whitcroft0776e592008-10-15 22:02:29 -07001464 ^(?:typedef|struct|enum)\b
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001465 )}x;
1466 warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
1467 if ($possible !~ $notPermitted) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001468 # Check for modifiers.
1469 $possible =~ s/\s*$Storage\s*//g;
1470 $possible =~ s/\s*$Sparse\s*//g;
1471 if ($possible =~ /^\s*$/) {
1472
1473 } elsif ($possible =~ /\s/) {
1474 $possible =~ s/\s*$Type\s*//g;
Andy Whitcroftd2506582008-07-23 21:29:09 -07001475 for my $modifier (split(' ', $possible)) {
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001476 if ($modifier !~ $notPermitted) {
1477 warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
1478 push(@modifierList, $modifier);
1479 }
Andy Whitcroftd2506582008-07-23 21:29:09 -07001480 }
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001481
1482 } else {
1483 warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
1484 push(@typeList, $possible);
1485 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08001486 build_types();
Andy Whitcroft0776e592008-10-15 22:02:29 -07001487 } else {
1488 warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
Andy Whitcroft8905a672007-11-28 16:21:06 -08001489 }
1490}
1491
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001492my $prefix = '';
1493
Joe Perches000d1cc12011-07-25 17:13:25 -07001494sub show_type {
Joe Perchescbec18a2014-04-03 14:49:19 -07001495 my ($type) = @_;
Joe Perches91bfe482013-09-11 14:23:59 -07001496
Joe Perchescbec18a2014-04-03 14:49:19 -07001497 return defined $use_type{$type} if (scalar keys %use_type > 0);
1498
1499 return !defined $ignore_type{$type};
Joe Perches000d1cc12011-07-25 17:13:25 -07001500}
1501
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001502sub report {
Joe Perchescbec18a2014-04-03 14:49:19 -07001503 my ($level, $type, $msg) = @_;
1504
1505 if (!show_type($type) ||
1506 (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001507 return 0;
1508 }
Joe Perches000d1cc12011-07-25 17:13:25 -07001509 my $line;
1510 if ($show_types) {
Joe Perchescbec18a2014-04-03 14:49:19 -07001511 $line = "$prefix$level:$type: $msg\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07001512 } else {
Joe Perchescbec18a2014-04-03 14:49:19 -07001513 $line = "$prefix$level: $msg\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07001514 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08001515 $line = (split('\n', $line))[0] . "\n" if ($terse);
1516
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001517 push(our @report, $line);
Andy Whitcroft773647a2008-03-28 14:15:58 -07001518
1519 return 1;
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001520}
Joe Perchescbec18a2014-04-03 14:49:19 -07001521
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001522sub report_dump {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001523 our @report;
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001524}
Joe Perches000d1cc12011-07-25 17:13:25 -07001525
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001526sub ERROR {
Joe Perchescbec18a2014-04-03 14:49:19 -07001527 my ($type, $msg) = @_;
1528
1529 if (report("ERROR", $type, $msg)) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001530 our $clean = 0;
1531 our $cnt_error++;
Joe Perches3705ce52013-07-03 15:05:31 -07001532 return 1;
Andy Whitcroft773647a2008-03-28 14:15:58 -07001533 }
Joe Perches3705ce52013-07-03 15:05:31 -07001534 return 0;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001535}
1536sub WARN {
Joe Perchescbec18a2014-04-03 14:49:19 -07001537 my ($type, $msg) = @_;
1538
1539 if (report("WARNING", $type, $msg)) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001540 our $clean = 0;
1541 our $cnt_warn++;
Joe Perches3705ce52013-07-03 15:05:31 -07001542 return 1;
Andy Whitcroft773647a2008-03-28 14:15:58 -07001543 }
Joe Perches3705ce52013-07-03 15:05:31 -07001544 return 0;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001545}
1546sub CHK {
Joe Perchescbec18a2014-04-03 14:49:19 -07001547 my ($type, $msg) = @_;
1548
1549 if ($check && report("CHECK", $type, $msg)) {
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001550 our $clean = 0;
1551 our $cnt_chk++;
Joe Perches3705ce52013-07-03 15:05:31 -07001552 return 1;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001553 }
Joe Perches3705ce52013-07-03 15:05:31 -07001554 return 0;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001555}
1556
Andy Whitcroft6ecd9672008-10-15 22:02:21 -07001557sub check_absolute_file {
1558 my ($absolute, $herecurr) = @_;
1559 my $file = $absolute;
1560
1561 ##print "absolute<$absolute>\n";
1562
1563 # See if any suffix of this path is a path within the tree.
1564 while ($file =~ s@^[^/]*/@@) {
1565 if (-f "$root/$file") {
1566 ##print "file<$file>\n";
1567 last;
1568 }
1569 }
1570 if (! -f _) {
1571 return 0;
1572 }
1573
1574 # It is, so see if the prefix is acceptable.
1575 my $prefix = $absolute;
1576 substr($prefix, -length($file)) = '';
1577
1578 ##print "prefix<$prefix>\n";
1579 if ($prefix ne ".../") {
Joe Perches000d1cc12011-07-25 17:13:25 -07001580 WARN("USE_RELATIVE_PATH",
1581 "use relative pathname instead of absolute in changelog text\n" . $herecurr);
Andy Whitcroft6ecd9672008-10-15 22:02:21 -07001582 }
1583}
1584
Joe Perches3705ce52013-07-03 15:05:31 -07001585sub trim {
1586 my ($string) = @_;
1587
Joe Perchesb34c6482013-09-11 14:24:01 -07001588 $string =~ s/^\s+|\s+$//g;
1589
1590 return $string;
1591}
1592
1593sub ltrim {
1594 my ($string) = @_;
1595
1596 $string =~ s/^\s+//;
1597
1598 return $string;
1599}
1600
1601sub rtrim {
1602 my ($string) = @_;
1603
1604 $string =~ s/\s+$//;
Joe Perches3705ce52013-07-03 15:05:31 -07001605
1606 return $string;
1607}
1608
Joe Perches52ea8502013-11-12 15:10:09 -08001609sub string_find_replace {
1610 my ($string, $find, $replace) = @_;
1611
1612 $string =~ s/$find/$replace/g;
1613
1614 return $string;
1615}
1616
Joe Perches3705ce52013-07-03 15:05:31 -07001617sub tabify {
1618 my ($leading) = @_;
1619
1620 my $source_indent = 8;
1621 my $max_spaces_before_tab = $source_indent - 1;
1622 my $spaces_to_tab = " " x $source_indent;
1623
1624 #convert leading spaces to tabs
1625 1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
1626 #Remove spaces before a tab
1627 1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
1628
1629 return "$leading";
1630}
1631
Joe Perchesd1fe9c02012-03-23 15:02:16 -07001632sub pos_last_openparen {
1633 my ($line) = @_;
1634
1635 my $pos = 0;
1636
1637 my $opens = $line =~ tr/\(/\(/;
1638 my $closes = $line =~ tr/\)/\)/;
1639
1640 my $last_openparen = 0;
1641
1642 if (($opens == 0) || ($closes >= $opens)) {
1643 return -1;
1644 }
1645
1646 my $len = length($line);
1647
1648 for ($pos = 0; $pos < $len; $pos++) {
1649 my $string = substr($line, $pos);
1650 if ($string =~ /^($FuncArg|$balanced_parens)/) {
1651 $pos += length($1) - 1;
1652 } elsif (substr($line, $pos, 1) eq '(') {
1653 $last_openparen = $pos;
1654 } elsif (index($string, '(') == -1) {
1655 last;
1656 }
1657 }
1658
Joe Perches91cb5192014-04-03 14:49:32 -07001659 return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
Joe Perchesd1fe9c02012-03-23 15:02:16 -07001660}
1661
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001662sub process {
1663 my $filename = shift;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001664
1665 my $linenr=0;
1666 my $prevline="";
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001667 my $prevrawline="";
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001668 my $stashline="";
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001669 my $stashrawline="";
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001670
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001671 my $length;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001672 my $indent;
1673 my $previndent=0;
1674 my $stashindent=0;
1675
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001676 our $clean = 1;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001677 my $signoff = 0;
1678 my $is_patch = 0;
1679
Joe Perches29ee1b02014-08-06 16:10:35 -07001680 my $in_header_lines = $file ? 0 : 1;
Joe Perches15662b32011-10-31 17:13:12 -07001681 my $in_commit_log = 0; #Scanning lines before patch
1682
Pasi Savanainenfa64205d2012-10-04 17:13:29 -07001683 my $non_utf8_charset = 0;
1684
Joe Perches365dd4e2014-08-06 16:10:42 -07001685 my $last_blank_line = 0;
1686
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001687 our @report = ();
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001688 our $cnt_lines = 0;
1689 our $cnt_error = 0;
1690 our $cnt_warn = 0;
1691 our $cnt_chk = 0;
1692
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001693 # Trace the real file/line as we go.
1694 my $realfile = '';
1695 my $realline = 0;
1696 my $realcnt = 0;
1697 my $here = '';
1698 my $in_comment = 0;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001699 my $comment_edge = 0;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001700 my $first_line = 0;
Wolfram Sang1e855722009-01-06 14:41:24 -08001701 my $p1_prefix = '';
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001702
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001703 my $prev_values = 'E';
1704
1705 # suppression flags
Andy Whitcroft773647a2008-03-28 14:15:58 -07001706 my %suppress_ifbraces;
Andy Whitcroft170d3a22008-10-15 22:02:30 -07001707 my %suppress_whiletrailers;
Andy Whitcroft2b474a12009-10-26 16:50:16 -07001708 my %suppress_export;
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08001709 my $suppress_statement = 0;
Andy Whitcroft653d4872007-06-23 17:16:34 -07001710
Joe Perches7e51f192013-09-11 14:23:57 -07001711 my %signatures = ();
Joe Perches323c1262012-12-17 16:02:07 -08001712
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001713 # Pre-scan the patch sanitizing the lines.
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001714 # Pre-scan the patch looking for any __setup documentation.
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001715 #
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001716 my @setup_docs = ();
1717 my $setup_docs = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -07001718
Joe Perchesd8b07712013-11-12 15:10:06 -08001719 my $camelcase_file_seeded = 0;
1720
Andy Whitcroft773647a2008-03-28 14:15:58 -07001721 sanitise_line_reset();
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001722 my $line;
1723 foreach my $rawline (@rawlines) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001724 $linenr++;
1725 $line = $rawline;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001726
Joe Perches3705ce52013-07-03 15:05:31 -07001727 push(@fixed, $rawline) if ($fix);
1728
Andy Whitcroft773647a2008-03-28 14:15:58 -07001729 if ($rawline=~/^\+\+\+\s+(\S+)/) {
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001730 $setup_docs = 0;
1731 if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
1732 $setup_docs = 1;
1733 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07001734 #next;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001735 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07001736 if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
1737 $realline=$1-1;
1738 if (defined $2) {
1739 $realcnt=$3+1;
1740 } else {
1741 $realcnt=1+1;
1742 }
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001743 $in_comment = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -07001744
1745 # Guestimate if this is a continuing comment. Run
1746 # the context looking for a comment "edge". If this
1747 # edge is a close comment then we must be in a comment
1748 # at context start.
1749 my $edge;
Andy Whitcroft01fa9142008-10-15 22:02:19 -07001750 my $cnt = $realcnt;
1751 for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
1752 next if (defined $rawlines[$ln - 1] &&
1753 $rawlines[$ln - 1] =~ /^-/);
1754 $cnt--;
1755 #print "RAW<$rawlines[$ln - 1]>\n";
Andy Whitcroft721c1cb2009-01-06 14:41:16 -08001756 last if (!defined $rawlines[$ln - 1]);
Andy Whitcroftfae17da2009-01-06 14:41:20 -08001757 if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
1758 $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
1759 ($edge) = $1;
1760 last;
1761 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07001762 }
1763 if (defined $edge && $edge eq '*/') {
1764 $in_comment = 1;
1765 }
1766
1767 # Guestimate if this is a continuing comment. If this
1768 # is the start of a diff block and this line starts
1769 # ' *' then it is very likely a comment.
1770 if (!defined $edge &&
Andy Whitcroft83242e02009-01-06 14:41:17 -08001771 $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
Andy Whitcroft773647a2008-03-28 14:15:58 -07001772 {
1773 $in_comment = 1;
1774 }
1775
1776 ##print "COMMENT:$in_comment edge<$edge> $rawline\n";
1777 sanitise_line_reset($in_comment);
1778
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001779 } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001780 # Standardise the strings and chars within the input to
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001781 # simplify matching -- only bother with positive lines.
Andy Whitcroft773647a2008-03-28 14:15:58 -07001782 $line = sanitise_line($rawline);
1783 }
1784 push(@lines, $line);
1785
1786 if ($realcnt > 1) {
1787 $realcnt-- if ($line =~ /^(?:\+| |$)/);
1788 } else {
1789 $realcnt = 0;
1790 }
1791
1792 #print "==>$rawline\n";
1793 #print "-->$line\n";
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001794
1795 if ($setup_docs && $line =~ /^\+/) {
1796 push(@setup_docs, $line);
1797 }
1798 }
1799
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001800 $prefix = '';
1801
Andy Whitcroft773647a2008-03-28 14:15:58 -07001802 $realcnt = 0;
1803 $linenr = 0;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001804 foreach my $line (@lines) {
1805 $linenr++;
Joe Perches1b5539b2013-09-11 14:24:03 -07001806 my $sline = $line; #copy of $line
1807 $sline =~ s/$;/ /g; #with comments as spaces
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001808
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001809 my $rawline = $rawlines[$linenr - 1];
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001810
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001811#extract the line range in the file after the patch is applied
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001812 if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001813 $is_patch = 1;
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001814 $first_line = $linenr + 1;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001815 $realline=$1-1;
1816 if (defined $2) {
1817 $realcnt=$3+1;
1818 } else {
1819 $realcnt=1+1;
1820 }
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001821 annotate_reset();
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001822 $prev_values = 'E';
1823
Andy Whitcroft773647a2008-03-28 14:15:58 -07001824 %suppress_ifbraces = ();
Andy Whitcroft170d3a22008-10-15 22:02:30 -07001825 %suppress_whiletrailers = ();
Andy Whitcroft2b474a12009-10-26 16:50:16 -07001826 %suppress_export = ();
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08001827 $suppress_statement = 0;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001828 next;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001829
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001830# track the line number as we move through the hunk, note that
1831# new versions of GNU diff omit the leading space on completely
1832# blank context lines so we need to count that too.
Andy Whitcroft773647a2008-03-28 14:15:58 -07001833 } elsif ($line =~ /^( |\+|$)/) {
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001834 $realline++;
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07001835 $realcnt-- if ($realcnt != 0);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001836
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001837 # Measure the line length and indent.
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001838 ($length, $indent) = line_stats($rawline);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001839
1840 # Track the previous line.
1841 ($prevline, $stashline) = ($stashline, $line);
1842 ($previndent, $stashindent) = ($stashindent, $indent);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001843 ($prevrawline, $stashrawline) = ($stashrawline, $rawline);
1844
Andy Whitcroft773647a2008-03-28 14:15:58 -07001845 #warn "line<$line>\n";
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001846
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07001847 } elsif ($realcnt == 1) {
1848 $realcnt--;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001849 }
1850
Andy Whitcroftcc77cdc2009-10-26 16:50:13 -07001851 my $hunk_line = ($realcnt != 0);
1852
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001853#make up the handle for any error we report on this line
Andy Whitcroft773647a2008-03-28 14:15:58 -07001854 $prefix = "$filename:$realline: " if ($emacs && $file);
1855 $prefix = "$filename:$linenr: " if ($emacs && !$file);
1856
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001857 $here = "#$linenr: " if (!$file);
1858 $here = "#$realline: " if ($file);
Andy Whitcroft773647a2008-03-28 14:15:58 -07001859
Joe Perches2ac73b4f2014-06-04 16:12:05 -07001860 my $found_file = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -07001861 # extract the filename as it passes
Rabin Vincent3bf9a002010-10-26 14:23:16 -07001862 if ($line =~ /^diff --git.*?(\S+)$/) {
1863 $realfile = $1;
Joe Perches2b7ab452013-11-12 15:10:14 -08001864 $realfile =~ s@^([^/]*)/@@ if (!$file);
Joe Perches270c49a2012-01-10 15:09:50 -08001865 $in_commit_log = 0;
Joe Perches2ac73b4f2014-06-04 16:12:05 -07001866 $found_file = 1;
Rabin Vincent3bf9a002010-10-26 14:23:16 -07001867 } elsif ($line =~ /^\+\+\+\s+(\S+)/) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001868 $realfile = $1;
Joe Perches2b7ab452013-11-12 15:10:14 -08001869 $realfile =~ s@^([^/]*)/@@ if (!$file);
Joe Perches270c49a2012-01-10 15:09:50 -08001870 $in_commit_log = 0;
Wolfram Sang1e855722009-01-06 14:41:24 -08001871
1872 $p1_prefix = $1;
Andy Whitcrofte2f7aa42009-02-27 14:03:06 -08001873 if (!$file && $tree && $p1_prefix ne '' &&
1874 -e "$root/$p1_prefix") {
Joe Perches000d1cc12011-07-25 17:13:25 -07001875 WARN("PATCH_PREFIX",
1876 "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
Wolfram Sang1e855722009-01-06 14:41:24 -08001877 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07001878
Andy Whitcroftc1ab3322008-10-15 22:02:20 -07001879 if ($realfile =~ m@^include/asm/@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07001880 ERROR("MODIFIED_INCLUDE_ASM",
1881 "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
Andy Whitcroft773647a2008-03-28 14:15:58 -07001882 }
Joe Perches2ac73b4f2014-06-04 16:12:05 -07001883 $found_file = 1;
1884 }
1885
1886 if ($found_file) {
1887 if ($realfile =~ m@^(drivers/net/|net/)@) {
1888 $check = 1;
1889 } else {
1890 $check = $check_orig;
1891 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07001892 next;
1893 }
1894
Randy Dunlap389834b2007-06-08 13:47:03 -07001895 $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001896
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001897 my $hereline = "$here\n$rawline\n";
1898 my $herecurr = "$here\n$rawline\n";
1899 my $hereprev = "$here\n$prevrawline\n$rawline\n";
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001900
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001901 $cnt_lines++ if ($realcnt != 0);
1902
Rabin Vincent3bf9a002010-10-26 14:23:16 -07001903# Check for incorrect file permissions
1904 if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
1905 my $permhere = $here . "FILE: $realfile\n";
Joe Perches04db4d22013-04-29 16:18:14 -07001906 if ($realfile !~ m@scripts/@ &&
1907 $realfile !~ /\.(py|pl|awk|sh)$/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07001908 ERROR("EXECUTE_PERMISSIONS",
1909 "do not set execute permissions for source files\n" . $permhere);
Rabin Vincent3bf9a002010-10-26 14:23:16 -07001910 }
1911 }
1912
Joe Perches20112472011-07-25 17:13:23 -07001913# Check the patch for a signoff:
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07001914 if ($line =~ /^\s*signed-off-by:/i) {
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001915 $signoff++;
Joe Perches15662b32011-10-31 17:13:12 -07001916 $in_commit_log = 0;
Joe Perches20112472011-07-25 17:13:23 -07001917 }
1918
1919# Check signature styles
Joe Perches270c49a2012-01-10 15:09:50 -08001920 if (!$in_header_lines &&
Joe Perchesce0338df3c2012-07-30 14:41:18 -07001921 $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
Joe Perches20112472011-07-25 17:13:23 -07001922 my $space_before = $1;
1923 my $sign_off = $2;
1924 my $space_after = $3;
1925 my $email = $4;
1926 my $ucfirst_sign_off = ucfirst(lc($sign_off));
1927
Joe Perchesce0338df3c2012-07-30 14:41:18 -07001928 if ($sign_off !~ /$signature_tags/) {
1929 WARN("BAD_SIGN_OFF",
1930 "Non-standard signature: $sign_off\n" . $herecurr);
1931 }
Joe Perches20112472011-07-25 17:13:23 -07001932 if (defined $space_before && $space_before ne "") {
Joe Perches3705ce52013-07-03 15:05:31 -07001933 if (WARN("BAD_SIGN_OFF",
1934 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
1935 $fix) {
1936 $fixed[$linenr - 1] =
1937 "$ucfirst_sign_off $email";
1938 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001939 }
Joe Perches20112472011-07-25 17:13:23 -07001940 if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
Joe Perches3705ce52013-07-03 15:05:31 -07001941 if (WARN("BAD_SIGN_OFF",
1942 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
1943 $fix) {
1944 $fixed[$linenr - 1] =
1945 "$ucfirst_sign_off $email";
1946 }
1947
Joe Perches20112472011-07-25 17:13:23 -07001948 }
1949 if (!defined $space_after || $space_after ne " ") {
Joe Perches3705ce52013-07-03 15:05:31 -07001950 if (WARN("BAD_SIGN_OFF",
1951 "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
1952 $fix) {
1953 $fixed[$linenr - 1] =
1954 "$ucfirst_sign_off $email";
1955 }
Joe Perches20112472011-07-25 17:13:23 -07001956 }
1957
1958 my ($email_name, $email_address, $comment) = parse_email($email);
1959 my $suggested_email = format_email(($email_name, $email_address));
1960 if ($suggested_email eq "") {
Joe Perches000d1cc12011-07-25 17:13:25 -07001961 ERROR("BAD_SIGN_OFF",
1962 "Unrecognized email address: '$email'\n" . $herecurr);
Joe Perches20112472011-07-25 17:13:23 -07001963 } else {
1964 my $dequoted = $suggested_email;
1965 $dequoted =~ s/^"//;
1966 $dequoted =~ s/" </ </;
1967 # Don't force email to have quotes
1968 # Allow just an angle bracketed address
1969 if ("$dequoted$comment" ne $email &&
1970 "<$email_address>$comment" ne $email &&
1971 "$suggested_email$comment" ne $email) {
Joe Perches000d1cc12011-07-25 17:13:25 -07001972 WARN("BAD_SIGN_OFF",
1973 "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
Joe Perches20112472011-07-25 17:13:23 -07001974 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001975 }
Joe Perches7e51f192013-09-11 14:23:57 -07001976
1977# Check for duplicate signatures
1978 my $sig_nospace = $line;
1979 $sig_nospace =~ s/\s//g;
1980 $sig_nospace = lc($sig_nospace);
1981 if (defined $signatures{$sig_nospace}) {
1982 WARN("BAD_SIGN_OFF",
1983 "Duplicate signature\n" . $herecurr);
1984 } else {
1985 $signatures{$sig_nospace} = 1;
1986 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001987 }
1988
Joe Perches9b3189eb2014-06-04 16:12:10 -07001989# Check for old stable address
1990 if ($line =~ /^\s*cc:\s*.*<?\bstable\@kernel\.org\b>?.*$/i) {
1991 ERROR("STABLE_ADDRESS",
1992 "The 'stable' address should be 'stable\@vger.kernel.org'\n" . $herecurr);
1993 }
1994
Christopher Covington7ebd05e2014-04-03 14:49:31 -07001995# Check for unwanted Gerrit info
1996 if ($in_commit_log && $line =~ /^\s*change-id:/i) {
1997 ERROR("GERRIT_CHANGE_ID",
1998 "Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr);
1999 }
2000
Joe Perchesd311cd42014-08-06 16:10:57 -07002001# Check for improperly formed commit descriptions
2002 if ($in_commit_log &&
2003 $line =~ /\bcommit\s+[0-9a-f]{5,}/i &&
2004 $line !~ /\b[Cc]ommit [0-9a-f]{12,16} \("/) {
2005 $line =~ /\b(c)ommit\s+([0-9a-f]{5,})/i;
2006 my $init_char = $1;
2007 my $orig_commit = lc($2);
2008 my $id = '01234567890ab';
2009 my $desc = 'commit description';
2010 ($id, $desc) = git_commit_info($orig_commit, $id, $desc);
2011 ERROR("GIT_COMMIT_ID",
2012 "Please use 12 to 16 chars for the git commit ID like: '${init_char}ommit $id (\"$desc\")'\n" . $herecurr);
2013 }
2014
Andy Whitcroft00df344f2007-06-08 13:47:06 -07002015# Check for wrappage within a valid hunk of the file
Andy Whitcroft8905a672007-11-28 16:21:06 -08002016 if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002017 ERROR("CORRUPTED_PATCH",
2018 "patch seems to be corrupt (line wrapped?)\n" .
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002019 $herecurr) if (!$emitted_corrupt++);
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07002020 }
2021
Andy Whitcroft6ecd9672008-10-15 22:02:21 -07002022# Check for absolute kernel paths.
2023 if ($tree) {
2024 while ($line =~ m{(?:^|\s)(/\S*)}g) {
2025 my $file = $1;
2026
2027 if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
2028 check_absolute_file($1, $herecurr)) {
2029 #
2030 } else {
2031 check_absolute_file($file, $herecurr);
2032 }
2033 }
2034 }
2035
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07002036# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
2037 if (($realfile =~ /^$/ || $line =~ /^\+/) &&
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002038 $rawline !~ m/^$UTF8*$/) {
2039 my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
2040
2041 my $blank = copy_spacing($rawline);
2042 my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
2043 my $hereptr = "$hereline$ptr\n";
2044
Joe Perches34d99212011-07-25 17:13:26 -07002045 CHK("INVALID_UTF8",
2046 "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
Andy Whitcroft00df344f2007-06-08 13:47:06 -07002047 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002048
Joe Perches15662b32011-10-31 17:13:12 -07002049# Check if it's the start of a commit log
2050# (not a header line and we haven't seen the patch filename)
2051 if ($in_header_lines && $realfile =~ /^$/ &&
Joe Perches29ee1b02014-08-06 16:10:35 -07002052 !($rawline =~ /^\s+\S/ ||
2053 $rawline =~ /^(commit\b|from\b|[\w-]+:).*$/i)) {
Joe Perches15662b32011-10-31 17:13:12 -07002054 $in_header_lines = 0;
2055 $in_commit_log = 1;
2056 }
2057
Pasi Savanainenfa64205d2012-10-04 17:13:29 -07002058# Check if there is UTF-8 in a commit log when a mail header has explicitly
2059# declined it, i.e defined some charset where it is missing.
2060 if ($in_header_lines &&
2061 $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
2062 $1 !~ /utf-8/i) {
2063 $non_utf8_charset = 1;
2064 }
2065
2066 if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
Joe Perches15662b32011-10-31 17:13:12 -07002067 $rawline =~ /$NON_ASCII_UTF8/) {
Pasi Savanainenfa64205d2012-10-04 17:13:29 -07002068 WARN("UTF8_BEFORE_PATCH",
Joe Perches15662b32011-10-31 17:13:12 -07002069 "8-bit UTF-8 used in possible commit log\n" . $herecurr);
2070 }
2071
Andy Whitcroft306708542008-10-15 22:02:28 -07002072# ignore non-hunk lines and lines being removed
2073 next if (!$hunk_line || $line =~ /^-/);
Andy Whitcroft00df344f2007-06-08 13:47:06 -07002074
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002075#trailing whitespace
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002076 if ($line =~ /^\+.*\015/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002077 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Joe Perchesd5e616f2013-09-11 14:23:54 -07002078 if (ERROR("DOS_LINE_ENDINGS",
2079 "DOS line endings\n" . $herevet) &&
2080 $fix) {
2081 $fixed[$linenr - 1] =~ s/[\s\015]+$//;
2082 }
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002083 } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
2084 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Joe Perches3705ce52013-07-03 15:05:31 -07002085 if (ERROR("TRAILING_WHITESPACE",
2086 "trailing whitespace\n" . $herevet) &&
2087 $fix) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07002088 $fixed[$linenr - 1] =~ s/\s+$//;
Joe Perches3705ce52013-07-03 15:05:31 -07002089 }
2090
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07002091 $rpt_cleaners = 1;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002092 }
Andy Whitcroft5368df202008-10-15 22:02:27 -07002093
Josh Triplett4783f892013-11-12 15:10:12 -08002094# Check for FSF mailing addresses.
Alexander Duyck109d8cb22014-01-23 15:54:50 -08002095 if ($rawline =~ /\bwrite to the Free/i ||
Joe Perches3e2232f2014-01-23 15:54:48 -08002096 $rawline =~ /\b59\s+Temple\s+Pl/i ||
2097 $rawline =~ /\b51\s+Franklin\s+St/i) {
Josh Triplett4783f892013-11-12 15:10:12 -08002098 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
2099 my $msg_type = \&ERROR;
2100 $msg_type = \&CHK if ($file);
2101 &{$msg_type}("FSF_MAILING_ADDRESS",
Joe Perches3e2232f2014-01-23 15:54:48 -08002102 "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)
Josh Triplett4783f892013-11-12 15:10:12 -08002103 }
2104
Andi Kleen33549572010-05-24 14:33:29 -07002105# check for Kconfig help text having a real description
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002106# Only applies when adding the entry originally, after that we do not have
2107# sufficient context to determine whether it is indeed long enough.
Andi Kleen33549572010-05-24 14:33:29 -07002108 if ($realfile =~ /Kconfig/ &&
Joe Perches8d73e0e2014-08-06 16:10:46 -07002109 $line =~ /^\+\s*config\s+/) {
Andi Kleen33549572010-05-24 14:33:29 -07002110 my $length = 0;
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002111 my $cnt = $realcnt;
2112 my $ln = $linenr + 1;
2113 my $f;
Andy Whitcrofta1385802012-01-10 15:10:03 -08002114 my $is_start = 0;
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002115 my $is_end = 0;
Andy Whitcrofta1385802012-01-10 15:10:03 -08002116 for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002117 $f = $lines[$ln - 1];
2118 $cnt-- if ($lines[$ln - 1] !~ /^-/);
2119 $is_end = $lines[$ln - 1] =~ /^\+/;
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002120
2121 next if ($f =~ /^-/);
Joe Perches8d73e0e2014-08-06 16:10:46 -07002122 last if (!$file && $f =~ /^\@\@/);
Andy Whitcrofta1385802012-01-10 15:10:03 -08002123
Joe Perches8d73e0e2014-08-06 16:10:46 -07002124 if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate)\s*\"/) {
Andy Whitcrofta1385802012-01-10 15:10:03 -08002125 $is_start = 1;
Joe Perches8d73e0e2014-08-06 16:10:46 -07002126 } elsif ($lines[$ln - 1] =~ /^\+\s*(?:---)?help(?:---)?$/) {
Andy Whitcrofta1385802012-01-10 15:10:03 -08002127 $length = -1;
2128 }
2129
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002130 $f =~ s/^.//;
Andi Kleen33549572010-05-24 14:33:29 -07002131 $f =~ s/#.*//;
2132 $f =~ s/^\s+//;
2133 next if ($f =~ /^$/);
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002134 if ($f =~ /^\s*config\s/) {
2135 $is_end = 1;
2136 last;
2137 }
Andi Kleen33549572010-05-24 14:33:29 -07002138 $length++;
2139 }
Joe Perches000d1cc12011-07-25 17:13:25 -07002140 WARN("CONFIG_DESCRIPTION",
Andy Whitcrofta1385802012-01-10 15:10:03 -08002141 "please write a paragraph that describes the config symbol fully\n" . $herecurr) if ($is_start && $is_end && $length < 4);
2142 #print "is_start<$is_start> is_end<$is_end> length<$length>\n";
Andi Kleen33549572010-05-24 14:33:29 -07002143 }
2144
Kees Cook1ba8dfd2012-12-17 16:01:48 -08002145# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
2146 if ($realfile =~ /Kconfig/ &&
2147 $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
2148 WARN("CONFIG_EXPERIMENTAL",
2149 "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2150 }
2151
Arnaud Lacombec68e5872011-08-15 01:07:14 -04002152 if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
2153 ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
2154 my $flag = $1;
2155 my $replacement = {
2156 'EXTRA_AFLAGS' => 'asflags-y',
2157 'EXTRA_CFLAGS' => 'ccflags-y',
2158 'EXTRA_CPPFLAGS' => 'cppflags-y',
2159 'EXTRA_LDFLAGS' => 'ldflags-y',
2160 };
2161
2162 WARN("DEPRECATED_VARIABLE",
2163 "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
2164 }
2165
Rob Herringbff5da42014-01-23 15:54:51 -08002166# check for DT compatible documentation
Florian Vaussard7dd05b32014-04-03 14:49:26 -07002167 if (defined $root &&
2168 (($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
2169 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
2170
Rob Herringbff5da42014-01-23 15:54:51 -08002171 my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
2172
Florian Vaussardcc933192014-04-03 14:49:27 -07002173 my $dt_path = $root . "/Documentation/devicetree/bindings/";
2174 my $vp_file = $dt_path . "vendor-prefixes.txt";
2175
Rob Herringbff5da42014-01-23 15:54:51 -08002176 foreach my $compat (@compats) {
2177 my $compat2 = $compat;
Rob Herring185d5662014-06-04 16:12:03 -07002178 $compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;
2179 my $compat3 = $compat;
2180 $compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;
2181 `grep -Erq "$compat|$compat2|$compat3" $dt_path`;
Rob Herringbff5da42014-01-23 15:54:51 -08002182 if ( $? >> 8 ) {
2183 WARN("UNDOCUMENTED_DT_STRING",
2184 "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
2185 }
2186
Florian Vaussard4fbf32a2014-04-03 14:49:25 -07002187 next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
2188 my $vendor = $1;
Florian Vaussardcc933192014-04-03 14:49:27 -07002189 `grep -Eq "^$vendor\\b" $vp_file`;
Rob Herringbff5da42014-01-23 15:54:51 -08002190 if ( $? >> 8 ) {
2191 WARN("UNDOCUMENTED_DT_STRING",
Florian Vaussardcc933192014-04-03 14:49:27 -07002192 "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
Rob Herringbff5da42014-01-23 15:54:51 -08002193 }
2194 }
2195 }
2196
Andy Whitcroft5368df202008-10-15 22:02:27 -07002197# check we are in a valid source file if not then ignore this hunk
2198 next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
2199
Joe Perches6cd7f382012-12-17 16:01:54 -08002200#line length limit
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002201 if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
Andy Whitcroftf4c014c2008-07-23 21:29:01 -07002202 $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
Joe Perches0fccc622011-05-24 17:13:41 -07002203 !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||
Joe Perches8bbea962010-08-09 17:21:01 -07002204 $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
Joe Perches6cd7f382012-12-17 16:01:54 -08002205 $length > $max_line_length)
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002206 {
Joe Perches000d1cc12011-07-25 17:13:25 -07002207 WARN("LONG_LINE",
Joe Perches6cd7f382012-12-17 16:01:54 -08002208 "line over $max_line_length characters\n" . $herecurr);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002209 }
2210
Josh Triplettca56dc02012-03-23 15:02:21 -07002211# Check for user-visible strings broken across lines, which breaks the ability
Joe Perches8c5fcd22014-01-23 15:54:40 -08002212# to grep for the string. Make exceptions when the previous string ends in a
2213# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
2214# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
Josh Triplettca56dc02012-03-23 15:02:21 -07002215 if ($line =~ /^\+\s*"/ &&
2216 $prevline =~ /"\s*$/ &&
Joe Perches8c5fcd22014-01-23 15:54:40 -08002217 $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
Josh Triplettca56dc02012-03-23 15:02:21 -07002218 WARN("SPLIT_STRING",
2219 "quoted string split across lines\n" . $hereprev);
2220 }
2221
Joe Perches5e79d962010-03-05 13:43:55 -08002222# check for spaces before a quoted newline
2223 if ($rawline =~ /^.*\".*\s\\n/) {
Joe Perches3705ce52013-07-03 15:05:31 -07002224 if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
2225 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
2226 $fix) {
2227 $fixed[$linenr - 1] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
2228 }
2229
Joe Perches5e79d962010-03-05 13:43:55 -08002230 }
2231
Andy Whitcroft8905a672007-11-28 16:21:06 -08002232# check for adding lines without a newline.
2233 if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002234 WARN("MISSING_EOF_NEWLINE",
2235 "adding a line without newline at end of file\n" . $herecurr);
Andy Whitcroft8905a672007-11-28 16:21:06 -08002236 }
2237
Mike Frysinger42e41c52009-09-21 17:04:40 -07002238# Blackfin: use hi/lo macros
2239 if ($realfile =~ m@arch/blackfin/.*\.S$@) {
2240 if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
2241 my $herevet = "$here\n" . cat_vet($line) . "\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07002242 ERROR("LO_MACRO",
2243 "use the LO() macro, not (... & 0xFFFF)\n" . $herevet);
Mike Frysinger42e41c52009-09-21 17:04:40 -07002244 }
2245 if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
2246 my $herevet = "$here\n" . cat_vet($line) . "\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07002247 ERROR("HI_MACRO",
2248 "use the HI() macro, not (... >> 16)\n" . $herevet);
Mike Frysinger42e41c52009-09-21 17:04:40 -07002249 }
2250 }
2251
Andy Whitcroftb9ea10d2008-10-15 22:02:24 -07002252# check we are in a valid source file C or perl if not then ignore this hunk
2253 next if ($realfile !~ /\.(h|c|pl)$/);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002254
2255# at the beginning of a line any tabs must come first and anything
2256# more than 8 must use tabs.
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002257 if ($rawline =~ /^\+\s* \t\s*\S/ ||
2258 $rawline =~ /^\+\s* \s*/) {
2259 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07002260 $rpt_cleaners = 1;
Joe Perches3705ce52013-07-03 15:05:31 -07002261 if (ERROR("CODE_INDENT",
2262 "code indent should use tabs where possible\n" . $herevet) &&
2263 $fix) {
2264 $fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
2265 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002266 }
2267
Alberto Panizzo08e44362010-03-05 13:43:54 -08002268# check for space before tabs.
2269 if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
2270 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Joe Perches3705ce52013-07-03 15:05:31 -07002271 if (WARN("SPACE_BEFORE_TAB",
2272 "please, no space before tabs\n" . $herevet) &&
2273 $fix) {
Joe Perchesc76f4cb2014-01-23 15:54:46 -08002274 while ($fixed[$linenr - 1] =~
2275 s/(^\+.*) {8,8}+\t/$1\t\t/) {}
2276 while ($fixed[$linenr - 1] =~
2277 s/(^\+.*) +\t/$1\t/) {}
Joe Perches3705ce52013-07-03 15:05:31 -07002278 }
Alberto Panizzo08e44362010-03-05 13:43:54 -08002279 }
2280
Joe Perchesd1fe9c02012-03-23 15:02:16 -07002281# check for && or || at the start of a line
2282 if ($rawline =~ /^\+\s*(&&|\|\|)/) {
2283 CHK("LOGICAL_CONTINUATIONS",
2284 "Logical continuations should be on the previous line\n" . $hereprev);
2285 }
2286
2287# check multi-line statement indentation matches previous line
2288 if ($^V && $^V ge 5.10.0 &&
Joe Perches91cb5192014-04-03 14:49:32 -07002289 $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|$Ident\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
Joe Perchesd1fe9c02012-03-23 15:02:16 -07002290 $prevline =~ /^\+(\t*)(.*)$/;
2291 my $oldindent = $1;
2292 my $rest = $2;
2293
2294 my $pos = pos_last_openparen($rest);
2295 if ($pos >= 0) {
Joe Perchesb34a26f2012-07-30 14:41:16 -07002296 $line =~ /^(\+| )([ \t]*)/;
2297 my $newindent = $2;
Joe Perchesd1fe9c02012-03-23 15:02:16 -07002298
2299 my $goodtabindent = $oldindent .
2300 "\t" x ($pos / 8) .
2301 " " x ($pos % 8);
2302 my $goodspaceindent = $oldindent . " " x $pos;
2303
2304 if ($newindent ne $goodtabindent &&
2305 $newindent ne $goodspaceindent) {
Joe Perches3705ce52013-07-03 15:05:31 -07002306
2307 if (CHK("PARENTHESIS_ALIGNMENT",
2308 "Alignment should match open parenthesis\n" . $hereprev) &&
2309 $fix && $line =~ /^\+/) {
2310 $fixed[$linenr - 1] =~
2311 s/^\+[ \t]*/\+$goodtabindent/;
2312 }
Joe Perchesd1fe9c02012-03-23 15:02:16 -07002313 }
2314 }
2315 }
2316
Joe Perchesf27c95d2014-08-06 16:10:52 -07002317 if ($line =~ /^\+.*\(\s*$Type\s*\)[ \t]+(?!$Assignment|$Arithmetic)/) {
Joe Perches3705ce52013-07-03 15:05:31 -07002318 if (CHK("SPACING",
Joe Perchesf27c95d2014-08-06 16:10:52 -07002319 "No space is necessary after a cast\n" . $herecurr) &&
Joe Perches3705ce52013-07-03 15:05:31 -07002320 $fix) {
2321 $fixed[$linenr - 1] =~
Joe Perchesf27c95d2014-08-06 16:10:52 -07002322 s/(\(\s*$Type\s*\))[ \t]+/$1/;
Joe Perches3705ce52013-07-03 15:05:31 -07002323 }
Joe Perchesaad4f612012-03-23 15:02:19 -07002324 }
2325
Joe Perches05880602012-10-04 17:13:35 -07002326 if ($realfile =~ m@^(drivers/net/|net/)@ &&
Joe Perchesfdb4bcd2013-07-03 15:05:23 -07002327 $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
Joe Perches85ad9782014-04-03 14:49:20 -07002328 $rawline =~ /^\+[ \t]*\*/ &&
2329 $realline > 2) {
Joe Perches05880602012-10-04 17:13:35 -07002330 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2331 "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
2332 }
2333
2334 if ($realfile =~ m@^(drivers/net/|net/)@ &&
Joe Perchesa605e322013-07-03 15:05:24 -07002335 $prevrawline =~ /^\+[ \t]*\/\*/ && #starting /*
2336 $prevrawline !~ /\*\/[ \t]*$/ && #no trailing */
Joe Perches61135e92013-09-11 14:23:59 -07002337 $rawline =~ /^\+/ && #line is new
Joe Perchesa605e322013-07-03 15:05:24 -07002338 $rawline !~ /^\+[ \t]*\*/) { #no leading *
2339 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2340 "networking block comments start with * on subsequent lines\n" . $hereprev);
2341 }
2342
2343 if ($realfile =~ m@^(drivers/net/|net/)@ &&
Joe Perchesc24f9f12012-11-08 15:53:29 -08002344 $rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */
2345 $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/
2346 $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/
2347 $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */
Joe Perches05880602012-10-04 17:13:35 -07002348 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2349 "networking block comments put the trailing */ on a separate line\n" . $herecurr);
2350 }
2351
Joe Perches7f619192014-08-06 16:10:39 -07002352# check for missing blank lines after struct/union declarations
2353# with exceptions for various attributes and macros
2354 if ($prevline =~ /^[\+ ]};?\s*$/ &&
2355 $line =~ /^\+/ &&
2356 !($line =~ /^\+\s*$/ ||
2357 $line =~ /^\+\s*EXPORT_SYMBOL/ ||
2358 $line =~ /^\+\s*MODULE_/i ||
2359 $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||
2360 $line =~ /^\+[a-z_]*init/ ||
2361 $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||
2362 $line =~ /^\+\s*DECLARE/ ||
2363 $line =~ /^\+\s*__setup/)) {
2364 CHK("LINE_SPACING",
2365 "Please use a blank line after function/struct/union/enum declarations\n" . $hereprev);
2366 }
2367
Joe Perches365dd4e2014-08-06 16:10:42 -07002368# check for multiple consecutive blank lines
2369 if ($prevline =~ /^[\+ ]\s*$/ &&
2370 $line =~ /^\+\s*$/ &&
2371 $last_blank_line != ($linenr - 1)) {
2372 CHK("LINE_SPACING",
2373 "Please don't use multiple blank lines\n" . $hereprev);
2374 $last_blank_line = $linenr;
2375 }
2376
Joe Perches3b617e32014-04-03 14:49:28 -07002377# check for missing blank lines after declarations
Joe Perches3f7bac02014-06-04 16:12:04 -07002378 if ($sline =~ /^\+\s+\S/ && #Not at char 1
2379 # actual declarations
2380 ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
Joe Perches5a4e1fd2014-08-06 16:10:33 -07002381 # function pointer declarations
2382 $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
Joe Perches3f7bac02014-06-04 16:12:04 -07002383 # foo bar; where foo is some local typedef or #define
2384 $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
2385 # known declaration macros
2386 $prevline =~ /^\+\s+$declaration_macros/) &&
2387 # for "else if" which can look like "$Ident $Ident"
2388 !($prevline =~ /^\+\s+$c90_Keywords\b/ ||
2389 # other possible extensions of declaration lines
2390 $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||
2391 # not starting a section or a macro "\" extended line
2392 $prevline =~ /(?:\{\s*|\\)$/) &&
2393 # looks like a declaration
2394 !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
Joe Perches5a4e1fd2014-08-06 16:10:33 -07002395 # function pointer declarations
2396 $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
Joe Perches3f7bac02014-06-04 16:12:04 -07002397 # foo bar; where foo is some local typedef or #define
2398 $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
2399 # known declaration macros
2400 $sline =~ /^\+\s+$declaration_macros/ ||
2401 # start of struct or union or enum
Joe Perches3b617e32014-04-03 14:49:28 -07002402 $sline =~ /^\+\s+(?:union|struct|enum|typedef)\b/ ||
Joe Perches3f7bac02014-06-04 16:12:04 -07002403 # start or end of block or continuation of declaration
2404 $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||
2405 # bitfield continuation
2406 $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||
2407 # other possible extensions of declaration lines
2408 $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) &&
2409 # indentation of previous and current line are the same
2410 (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) {
Joe Perchesfee0aa82014-08-06 16:10:44 -07002411 WARN("LINE_SPACING",
Joe Perches3f7bac02014-06-04 16:12:04 -07002412 "Missing a blank line after declarations\n" . $hereprev);
Joe Perches3b617e32014-04-03 14:49:28 -07002413 }
2414
Raffaele Recalcati5f7ddae2010-08-09 17:20:59 -07002415# check for spaces at the beginning of a line.
Andy Whitcroft6b4c5be2010-10-26 14:23:11 -07002416# Exceptions:
2417# 1) within comments
2418# 2) indented preprocessor commands
2419# 3) hanging labels
Joe Perches3705ce52013-07-03 15:05:31 -07002420 if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/) {
Raffaele Recalcati5f7ddae2010-08-09 17:20:59 -07002421 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Joe Perches3705ce52013-07-03 15:05:31 -07002422 if (WARN("LEADING_SPACE",
2423 "please, no spaces at the start of a line\n" . $herevet) &&
2424 $fix) {
2425 $fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
2426 }
Raffaele Recalcati5f7ddae2010-08-09 17:20:59 -07002427 }
2428
Andy Whitcroftb9ea10d2008-10-15 22:02:24 -07002429# check we are in a valid C source file if not then ignore this hunk
2430 next if ($realfile !~ /\.(h|c)$/);
2431
Joe Perches032a4c02014-08-06 16:10:29 -07002432# check indentation of any line with a bare else
2433# if the previous line is a break or return and is indented 1 tab more...
2434 if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) {
2435 my $tabs = length($1) + 1;
2436 if ($prevline =~ /^\+\t{$tabs,$tabs}(?:break|return)\b/) {
2437 WARN("UNNECESSARY_ELSE",
2438 "else is not generally useful after a break or return\n" . $hereprev);
2439 }
2440 }
2441
Kees Cook1ba8dfd2012-12-17 16:01:48 -08002442# discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
2443 if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
2444 WARN("CONFIG_EXPERIMENTAL",
2445 "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2446 }
2447
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002448# check for RCS/CVS revision markers
Andy Whitcroftcf655042008-03-04 14:28:20 -08002449 if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002450 WARN("CVS_KEYWORD",
2451 "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002452 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07002453
Mike Frysinger42e41c52009-09-21 17:04:40 -07002454# Blackfin: don't use __builtin_bfin_[cs]sync
2455 if ($line =~ /__builtin_bfin_csync/) {
2456 my $herevet = "$here\n" . cat_vet($line) . "\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07002457 ERROR("CSYNC",
2458 "use the CSYNC() macro in asm/blackfin.h\n" . $herevet);
Mike Frysinger42e41c52009-09-21 17:04:40 -07002459 }
2460 if ($line =~ /__builtin_bfin_ssync/) {
2461 my $herevet = "$here\n" . cat_vet($line) . "\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07002462 ERROR("SSYNC",
2463 "use the SSYNC() macro in asm/blackfin.h\n" . $herevet);
Mike Frysinger42e41c52009-09-21 17:04:40 -07002464 }
2465
Joe Perches56e77d72013-02-21 16:44:14 -08002466# check for old HOTPLUG __dev<foo> section markings
2467 if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
2468 WARN("HOTPLUG_SECTION",
2469 "Using $1 is unnecessary\n" . $herecurr);
2470 }
2471
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002472# Check for potential 'bare' types
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002473 my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
2474 $realline_next);
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08002475#print "LINE<$line>\n";
2476 if ($linenr >= $suppress_statement &&
Joe Perches1b5539b2013-09-11 14:24:03 -07002477 $realcnt && $sline =~ /.\s*\S/) {
Andy Whitcroft170d3a22008-10-15 22:02:30 -07002478 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
Andy Whitcroftf5fe35d2008-07-23 21:29:03 -07002479 ctx_statement_block($linenr, $realcnt, 0);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002480 $stat =~ s/\n./\n /g;
2481 $cond =~ s/\n./\n /g;
2482
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08002483#print "linenr<$linenr> <$stat>\n";
2484 # If this statement has no statement boundaries within
2485 # it there is no point in retrying a statement scan
2486 # until we hit end of it.
2487 my $frag = $stat; $frag =~ s/;+\s*$//;
2488 if ($frag !~ /(?:{|;)/) {
2489#print "skip<$line_nr_next>\n";
2490 $suppress_statement = $line_nr_next;
2491 }
Andy Whitcroftf74bd192012-01-10 15:09:54 -08002492
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002493 # Find the real next line.
2494 $realline_next = $line_nr_next;
2495 if (defined $realline_next &&
2496 (!defined $lines[$realline_next - 1] ||
2497 substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
2498 $realline_next++;
2499 }
2500
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002501 my $s = $stat;
2502 $s =~ s/{.*$//s;
Andy Whitcroftcf655042008-03-04 14:28:20 -08002503
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002504 # Ignore goto labels.
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002505 if ($s =~ /$Ident:\*$/s) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002506
2507 # Ignore functions being called
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002508 } elsif ($s =~ /^.\s*$Ident\s*\(/s) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002509
Andy Whitcroft463f2862009-09-21 17:04:34 -07002510 } elsif ($s =~ /^.\s*else\b/s) {
2511
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002512 # declarations always start with types
Andy Whitcroftd2506582008-07-23 21:29:09 -07002513 } 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) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002514 my $type = $1;
2515 $type =~ s/\s+/ /g;
2516 possible($type, "A:" . $s);
2517
Andy Whitcroft8905a672007-11-28 16:21:06 -08002518 # definitions in global scope can only start with types
Andy Whitcrofta6a840622008-10-15 22:02:30 -07002519 } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002520 possible($1, "B:" . $s);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002521 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08002522
2523 # any (foo ... *) is a pointer cast, and foo is a type
Andy Whitcroft65863862009-01-06 14:41:21 -08002524 while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002525 possible($1, "C:" . $s);
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002526 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08002527
2528 # Check for any sort of function declaration.
2529 # int foo(something bar, other baz);
2530 # void (*store_gdt)(x86_descr_ptr *);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002531 if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
Andy Whitcroft8905a672007-11-28 16:21:06 -08002532 my ($name_len) = length($1);
Andy Whitcroft8905a672007-11-28 16:21:06 -08002533
Andy Whitcroftcf655042008-03-04 14:28:20 -08002534 my $ctx = $s;
Andy Whitcroft773647a2008-03-28 14:15:58 -07002535 substr($ctx, 0, $name_len + 1, '');
Andy Whitcroft8905a672007-11-28 16:21:06 -08002536 $ctx =~ s/\)[^\)]*$//;
Andy Whitcroftcf655042008-03-04 14:28:20 -08002537
Andy Whitcroft8905a672007-11-28 16:21:06 -08002538 for my $arg (split(/\s*,\s*/, $ctx)) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002539 if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
Andy Whitcroft8905a672007-11-28 16:21:06 -08002540
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002541 possible($1, "D:" . $s);
Andy Whitcroft8905a672007-11-28 16:21:06 -08002542 }
2543 }
2544 }
2545
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002546 }
2547
Andy Whitcroft653d4872007-06-23 17:16:34 -07002548#
2549# Checks which may be anchored in the context.
2550#
2551
2552# Check for switch () and associated case and default
2553# statements should be at the same indent.
Andy Whitcroft00df344f2007-06-08 13:47:06 -07002554 if ($line=~/\bswitch\s*\(.*\)/) {
2555 my $err = '';
2556 my $sep = '';
2557 my @ctx = ctx_block_outer($linenr, $realcnt);
2558 shift(@ctx);
2559 for my $ctx (@ctx) {
2560 my ($clen, $cindent) = line_stats($ctx);
2561 if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
2562 $indent != $cindent) {
2563 $err .= "$sep$ctx\n";
2564 $sep = '';
2565 } else {
2566 $sep = "[...]\n";
2567 }
2568 }
2569 if ($err ne '') {
Joe Perches000d1cc12011-07-25 17:13:25 -07002570 ERROR("SWITCH_CASE_INDENT_LEVEL",
2571 "switch and case should be at the same indent\n$hereline$err");
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07002572 }
2573 }
2574
2575# if/while/etc brace do not go on next line, unless defining a do while loop,
2576# or if that brace on the next line is for something else
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002577 if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07002578 my $pre_ctx = "$1$2";
2579
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002580 my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
Joe Perches8eef05d2012-02-03 15:20:39 -08002581
2582 if ($line =~ /^\+\t{6,}/) {
2583 WARN("DEEP_INDENTATION",
2584 "Too many leading tabs - consider code refactoring\n" . $herecurr);
2585 }
2586
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07002587 my $ctx_cnt = $realcnt - $#ctx - 1;
2588 my $ctx = join("\n", @ctx);
2589
Andy Whitcroft548596d2008-07-23 21:29:01 -07002590 my $ctx_ln = $linenr;
2591 my $ctx_skip = $realcnt;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07002592
Andy Whitcroft548596d2008-07-23 21:29:01 -07002593 while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
2594 defined $lines[$ctx_ln - 1] &&
2595 $lines[$ctx_ln - 1] =~ /^-/)) {
2596 ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
2597 $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
Andy Whitcroft773647a2008-03-28 14:15:58 -07002598 $ctx_ln++;
2599 }
Andy Whitcroft548596d2008-07-23 21:29:01 -07002600
Andy Whitcroft53210162008-07-23 21:29:03 -07002601 #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
2602 #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
Andy Whitcroft773647a2008-03-28 14:15:58 -07002603
2604 if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002605 ERROR("OPEN_BRACE",
2606 "that open brace { should be on the previous line\n" .
Andy Whitcroft01464f32010-10-26 14:23:19 -07002607 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
Andy Whitcroft00df344f2007-06-08 13:47:06 -07002608 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07002609 if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
2610 $ctx =~ /\)\s*\;\s*$/ &&
2611 defined $lines[$ctx_ln - 1])
2612 {
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002613 my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
2614 if ($nindent > $indent) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002615 WARN("TRAILING_SEMICOLON",
2616 "trailing semicolon indicates no statements, indent implies otherwise\n" .
Andy Whitcroft01464f32010-10-26 14:23:19 -07002617 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002618 }
2619 }
Andy Whitcroft00df344f2007-06-08 13:47:06 -07002620 }
2621
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002622# Check relative indent for conditionals and blocks.
2623 if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08002624 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
2625 ctx_statement_block($linenr, $realcnt, 0)
2626 if (!defined $stat);
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002627 my ($s, $c) = ($stat, $cond);
2628
2629 substr($s, 0, length($c), '');
2630
2631 # Make sure we remove the line prefixes as we have
2632 # none on the first line, and are going to readd them
2633 # where necessary.
2634 $s =~ s/\n./\n/gs;
2635
2636 # Find out how long the conditional actually is.
Andy Whitcroft6f779c12008-10-15 22:02:27 -07002637 my @newlines = ($c =~ /\n/gs);
2638 my $cond_lines = 1 + $#newlines;
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002639
2640 # We want to check the first line inside the block
2641 # starting at the end of the conditional, so remove:
2642 # 1) any blank line termination
2643 # 2) any opening brace { on end of the line
2644 # 3) any do (...) {
2645 my $continuation = 0;
2646 my $check = 0;
2647 $s =~ s/^.*\bdo\b//;
2648 $s =~ s/^\s*{//;
2649 if ($s =~ s/^\s*\\//) {
2650 $continuation = 1;
2651 }
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002652 if ($s =~ s/^\s*?\n//) {
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002653 $check = 1;
2654 $cond_lines++;
2655 }
2656
2657 # Also ignore a loop construct at the end of a
2658 # preprocessor statement.
2659 if (($prevline =~ /^.\s*#\s*define\s/ ||
2660 $prevline =~ /\\\s*$/) && $continuation == 0) {
2661 $check = 0;
2662 }
2663
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002664 my $cond_ptr = -1;
Andy Whitcroft740504c2008-10-15 22:02:35 -07002665 $continuation = 0;
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002666 while ($cond_ptr != $cond_lines) {
2667 $cond_ptr = $cond_lines;
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002668
Andy Whitcroftf16fa282008-10-15 22:02:32 -07002669 # If we see an #else/#elif then the code
2670 # is not linear.
2671 if ($s =~ /^\s*\#\s*(?:else|elif)/) {
2672 $check = 0;
2673 }
2674
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002675 # Ignore:
2676 # 1) blank lines, they should be at 0,
2677 # 2) preprocessor lines, and
2678 # 3) labels.
Andy Whitcroft740504c2008-10-15 22:02:35 -07002679 if ($continuation ||
2680 $s =~ /^\s*?\n/ ||
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002681 $s =~ /^\s*#\s*?/ ||
2682 $s =~ /^\s*$Ident\s*:/) {
Andy Whitcroft740504c2008-10-15 22:02:35 -07002683 $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
Andy Whitcroft30dad6e2009-09-21 17:04:36 -07002684 if ($s =~ s/^.*?\n//) {
2685 $cond_lines++;
2686 }
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002687 }
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002688 }
2689
2690 my (undef, $sindent) = line_stats("+" . $s);
2691 my $stat_real = raw_line($linenr, $cond_lines);
2692
2693 # Check if either of these lines are modified, else
2694 # this is not this patch's fault.
2695 if (!defined($stat_real) ||
2696 $stat !~ /^\+/ && $stat_real !~ /^\+/) {
2697 $check = 0;
2698 }
2699 if (defined($stat_real) && $cond_lines > 1) {
2700 $stat_real = "[...]\n$stat_real";
2701 }
2702
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002703 #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";
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002704
2705 if ($check && (($sindent % 8) != 0 ||
2706 ($sindent <= $indent && $s ne ''))) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002707 WARN("SUSPECT_CODE_INDENT",
2708 "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002709 }
2710 }
2711
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002712 # Track the 'values' across context and added lines.
2713 my $opline = $line; $opline =~ s/^./ /;
Andy Whitcroft1f65f942008-07-23 21:29:10 -07002714 my ($curr_values, $curr_vars) =
2715 annotate_values($opline . "\n", $prev_values);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002716 $curr_values = $prev_values . $curr_values;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002717 if ($dbg_values) {
2718 my $outline = $opline; $outline =~ s/\t/ /g;
Andy Whitcroftcf655042008-03-04 14:28:20 -08002719 print "$linenr > .$outline\n";
2720 print "$linenr > $curr_values\n";
Andy Whitcroft1f65f942008-07-23 21:29:10 -07002721 print "$linenr > $curr_vars\n";
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002722 }
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002723 $prev_values = substr($curr_values, -1);
2724
Andy Whitcroft00df344f2007-06-08 13:47:06 -07002725#ignore lines not being added
Joe Perches3705ce52013-07-03 15:05:31 -07002726 next if ($line =~ /^[^\+]/);
Andy Whitcroft00df344f2007-06-08 13:47:06 -07002727
Andy Whitcroft653d4872007-06-23 17:16:34 -07002728# TEST: allow direct testing of the type matcher.
Andy Whitcroft7429c692008-07-23 21:29:06 -07002729 if ($dbg_type) {
2730 if ($line =~ /^.\s*$Declare\s*$/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002731 ERROR("TEST_TYPE",
2732 "TEST: is type\n" . $herecurr);
Andy Whitcroft7429c692008-07-23 21:29:06 -07002733 } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002734 ERROR("TEST_NOT_TYPE",
2735 "TEST: is not type ($1 is)\n". $herecurr);
Andy Whitcroft7429c692008-07-23 21:29:06 -07002736 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07002737 next;
2738 }
Andy Whitcrofta1ef2772008-10-15 22:02:17 -07002739# TEST: allow direct testing of the attribute matcher.
2740 if ($dbg_attr) {
Andy Whitcroft9360b0e2009-02-27 14:03:08 -08002741 if ($line =~ /^.\s*$Modifier\s*$/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002742 ERROR("TEST_ATTR",
2743 "TEST: is attr\n" . $herecurr);
Andy Whitcroft9360b0e2009-02-27 14:03:08 -08002744 } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002745 ERROR("TEST_NOT_ATTR",
2746 "TEST: is not attr ($1 is)\n". $herecurr);
Andy Whitcrofta1ef2772008-10-15 22:02:17 -07002747 }
2748 next;
2749 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07002750
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07002751# check for initialisation to aggregates open brace on the next line
Andy Whitcroft99423c22009-10-26 16:50:15 -07002752 if ($line =~ /^.\s*{/ &&
2753 $prevline =~ /(?:^|[^=])=\s*$/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002754 ERROR("OPEN_BRACE",
2755 "that open brace { should be on the previous line\n" . $hereprev);
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07002756 }
2757
Andy Whitcroft653d4872007-06-23 17:16:34 -07002758#
2759# Checks which are anchored on the added line.
2760#
2761
2762# check for malformed paths in #include statements (uses RAW line)
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002763 if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
Andy Whitcroft653d4872007-06-23 17:16:34 -07002764 my $path = $1;
2765 if ($path =~ m{//}) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002766 ERROR("MALFORMED_INCLUDE",
Joe Perches495e9d82012-12-20 15:05:37 -08002767 "malformed #include filename\n" . $herecurr);
2768 }
2769 if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
2770 ERROR("UAPI_INCLUDE",
2771 "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
Andy Whitcroft653d4872007-06-23 17:16:34 -07002772 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07002773 }
Andy Whitcroft00df344f2007-06-08 13:47:06 -07002774
2775# no C99 // comments
2776 if ($line =~ m{//}) {
Joe Perches3705ce52013-07-03 15:05:31 -07002777 if (ERROR("C99_COMMENTS",
2778 "do not use C99 // comments\n" . $herecurr) &&
2779 $fix) {
2780 my $line = $fixed[$linenr - 1];
2781 if ($line =~ /\/\/(.*)$/) {
2782 my $comment = trim($1);
2783 $fixed[$linenr - 1] =~ s@\/\/(.*)$@/\* $comment \*/@;
2784 }
2785 }
Andy Whitcroft00df344f2007-06-08 13:47:06 -07002786 }
2787 # Remove C99 comments.
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002788 $line =~ s@//.*@@;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002789 $opline =~ s@//.*@@;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002790
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002791# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
2792# the whole statement.
2793#print "APW <$lines[$realline_next - 1]>\n";
2794 if (defined $realline_next &&
2795 exists $lines[$realline_next - 1] &&
2796 !defined $suppress_export{$realline_next} &&
2797 ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2798 $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
Andy Whitcroft3cbf62d2010-10-26 14:23:18 -07002799 # Handle definitions which produce identifiers with
2800 # a prefix:
2801 # XXX(foo);
2802 # EXPORT_SYMBOL(something_foo);
Andy Whitcroft653d4872007-06-23 17:16:34 -07002803 my $name = $1;
Andy Whitcroft87a53872012-01-10 15:10:04 -08002804 if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
Andy Whitcroft3cbf62d2010-10-26 14:23:18 -07002805 $name =~ /^${Ident}_$2/) {
2806#print "FOO C name<$name>\n";
2807 $suppress_export{$realline_next} = 1;
2808
2809 } elsif ($stat !~ /(?:
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002810 \n.}\s*$|
Andy Whitcroft48012052008-10-15 22:02:34 -07002811 ^.DEFINE_$Ident\(\Q$name\E\)|
2812 ^.DECLARE_$Ident\(\Q$name\E\)|
2813 ^.LIST_HEAD\(\Q$name\E\)|
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002814 ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
2815 \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
Andy Whitcroft48012052008-10-15 22:02:34 -07002816 )/x) {
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002817#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
2818 $suppress_export{$realline_next} = 2;
2819 } else {
2820 $suppress_export{$realline_next} = 1;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002821 }
2822 }
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002823 if (!defined $suppress_export{$linenr} &&
2824 $prevline =~ /^.\s*$/ &&
2825 ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2826 $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
2827#print "FOO B <$lines[$linenr - 1]>\n";
2828 $suppress_export{$linenr} = 2;
2829 }
2830 if (defined $suppress_export{$linenr} &&
2831 $suppress_export{$linenr} == 2) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002832 WARN("EXPORT_SYMBOL",
2833 "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002834 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002835
Joe Eloff5150bda2010-08-09 17:21:00 -07002836# check for global initialisers.
Joe Perchesd5e616f2013-09-11 14:23:54 -07002837 if ($line =~ /^\+(\s*$Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/) {
2838 if (ERROR("GLOBAL_INITIALISERS",
2839 "do not initialise globals to 0 or NULL\n" .
2840 $herecurr) &&
2841 $fix) {
2842 $fixed[$linenr - 1] =~ s/($Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/$1;/;
2843 }
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07002844 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07002845# check for static initialisers.
Joe Perchesd5e616f2013-09-11 14:23:54 -07002846 if ($line =~ /^\+.*\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
2847 if (ERROR("INITIALISED_STATIC",
2848 "do not initialise statics to 0 or NULL\n" .
2849 $herecurr) &&
2850 $fix) {
2851 $fixed[$linenr - 1] =~ s/(\bstatic\s.*?)\s*=\s*(0|NULL|false)\s*;/$1;/;
2852 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002853 }
2854
Joe Perchescb710ec2010-10-26 14:23:20 -07002855# check for static const char * arrays.
2856 if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002857 WARN("STATIC_CONST_CHAR_ARRAY",
2858 "static const char * array should probably be static const char * const\n" .
Joe Perchescb710ec2010-10-26 14:23:20 -07002859 $herecurr);
2860 }
2861
2862# check for static char foo[] = "bar" declarations.
2863 if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002864 WARN("STATIC_CONST_CHAR_ARRAY",
2865 "static char array declaration should probably be static const char\n" .
Joe Perchescb710ec2010-10-26 14:23:20 -07002866 $herecurr);
2867 }
2868
Joe Perches9b0fa602014-04-03 14:49:18 -07002869# check for non-global char *foo[] = {"bar", ...} declarations.
2870 if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
2871 WARN("STATIC_CONST_CHAR_ARRAY",
2872 "char * array declaration might be better as static const\n" .
2873 $herecurr);
2874 }
2875
Joe Perchesb36190c2014-01-27 17:07:18 -08002876# check for function declarations without arguments like "int foo()"
2877 if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
2878 if (ERROR("FUNCTION_WITHOUT_ARGS",
2879 "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
2880 $fix) {
2881 $fixed[$linenr - 1] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
2882 }
2883 }
2884
Joe Perches92e112f2013-12-13 11:36:22 -07002885# check for uses of DEFINE_PCI_DEVICE_TABLE
2886 if ($line =~ /\bDEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=/) {
2887 if (WARN("DEFINE_PCI_DEVICE_TABLE",
2888 "Prefer struct pci_device_id over deprecated DEFINE_PCI_DEVICE_TABLE\n" . $herecurr) &&
2889 $fix) {
2890 $fixed[$linenr - 1] =~ s/\b(?:static\s+|)DEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=\s*/static const struct pci_device_id $1\[\] = /;
2891 }
Joe Perches93ed0e22010-10-26 14:23:21 -07002892 }
2893
Andy Whitcroft653d4872007-06-23 17:16:34 -07002894# check for new typedefs, only function parameters and sparse annotations
2895# make sense.
2896 if ($line =~ /\btypedef\s/ &&
Andy Whitcroft80545762009-01-06 14:41:26 -08002897 $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002898 $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
Andy Whitcroft8ed22ca2008-10-15 22:02:32 -07002899 $line !~ /\b$typeTypedefs\b/ &&
Andy Whitcroft653d4872007-06-23 17:16:34 -07002900 $line !~ /\b__bitwise(?:__|)\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002901 WARN("NEW_TYPEDEFS",
2902 "do not add new typedefs\n" . $herecurr);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002903 }
2904
2905# * goes on variable not on type
Andy Whitcroft65863862009-01-06 14:41:21 -08002906 # (char*[ const])
Andy Whitcroftbfcb2cc2012-01-10 15:10:15 -08002907 while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
2908 #print "AA<$1>\n";
Joe Perches3705ce52013-07-03 15:05:31 -07002909 my ($ident, $from, $to) = ($1, $2, $2);
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07002910
Andy Whitcroft65863862009-01-06 14:41:21 -08002911 # Should start with a space.
2912 $to =~ s/^(\S)/ $1/;
2913 # Should not end with a space.
2914 $to =~ s/\s+$//;
2915 # '*'s should not have spaces between.
Andy Whitcroftf9a0b3d2009-01-15 13:51:05 -08002916 while ($to =~ s/\*\s+\*/\*\*/) {
Andy Whitcroft65863862009-01-06 14:41:21 -08002917 }
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07002918
Joe Perches3705ce52013-07-03 15:05:31 -07002919## print "1: from<$from> to<$to> ident<$ident>\n";
Andy Whitcroft65863862009-01-06 14:41:21 -08002920 if ($from ne $to) {
Joe Perches3705ce52013-07-03 15:05:31 -07002921 if (ERROR("POINTER_LOCATION",
2922 "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr) &&
2923 $fix) {
2924 my $sub_from = $ident;
2925 my $sub_to = $ident;
2926 $sub_to =~ s/\Q$from\E/$to/;
2927 $fixed[$linenr - 1] =~
2928 s@\Q$sub_from\E@$sub_to@;
2929 }
Andy Whitcroft65863862009-01-06 14:41:21 -08002930 }
Andy Whitcroftbfcb2cc2012-01-10 15:10:15 -08002931 }
2932 while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
2933 #print "BB<$1>\n";
Joe Perches3705ce52013-07-03 15:05:31 -07002934 my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07002935
Andy Whitcroft65863862009-01-06 14:41:21 -08002936 # Should start with a space.
2937 $to =~ s/^(\S)/ $1/;
2938 # Should not end with a space.
2939 $to =~ s/\s+$//;
2940 # '*'s should not have spaces between.
Andy Whitcroftf9a0b3d2009-01-15 13:51:05 -08002941 while ($to =~ s/\*\s+\*/\*\*/) {
Andy Whitcroft65863862009-01-06 14:41:21 -08002942 }
2943 # Modifiers should have spaces.
2944 $to =~ s/(\b$Modifier$)/$1 /;
2945
Joe Perches3705ce52013-07-03 15:05:31 -07002946## print "2: from<$from> to<$to> ident<$ident>\n";
Andy Whitcroft667026e2009-02-27 14:03:08 -08002947 if ($from ne $to && $ident !~ /^$Modifier$/) {
Joe Perches3705ce52013-07-03 15:05:31 -07002948 if (ERROR("POINTER_LOCATION",
2949 "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr) &&
2950 $fix) {
2951
2952 my $sub_from = $match;
2953 my $sub_to = $match;
2954 $sub_to =~ s/\Q$from\E/$to/;
2955 $fixed[$linenr - 1] =~
2956 s@\Q$sub_from\E@$sub_to@;
2957 }
Andy Whitcroft65863862009-01-06 14:41:21 -08002958 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002959 }
2960
2961# # no BUG() or BUG_ON()
2962# if ($line =~ /\b(BUG|BUG_ON)\b/) {
2963# print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n";
2964# print "$herecurr";
2965# $clean = 0;
2966# }
2967
Andy Whitcroft8905a672007-11-28 16:21:06 -08002968 if ($line =~ /\bLINUX_VERSION_CODE\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002969 WARN("LINUX_VERSION_CODE",
2970 "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
Andy Whitcroft8905a672007-11-28 16:21:06 -08002971 }
2972
Joe Perches17441222011-06-15 15:08:17 -07002973# check for uses of printk_ratelimit
2974 if ($line =~ /\bprintk_ratelimit\s*\(/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002975 WARN("PRINTK_RATELIMITED",
2976"Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
Joe Perches17441222011-06-15 15:08:17 -07002977 }
2978
Andy Whitcroft00df344f2007-06-08 13:47:06 -07002979# printk should use KERN_* levels. Note that follow on printk's on the
2980# same line do not need a level, so we use the current block context
2981# to try and find and validate the current printk. In summary the current
Lucas De Marchi25985ed2011-03-30 22:57:33 -03002982# printk includes all preceding printk's which have no newline on the end.
Andy Whitcroft00df344f2007-06-08 13:47:06 -07002983# we assume the first bad printk is the one to report.
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07002984 if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
Andy Whitcroft00df344f2007-06-08 13:47:06 -07002985 my $ok = 0;
2986 for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
2987 #print "CHECK<$lines[$ln - 1]\n";
Lucas De Marchi25985ed2011-03-30 22:57:33 -03002988 # we have a preceding printk if it ends
Andy Whitcroft00df344f2007-06-08 13:47:06 -07002989 # with "\n" ignore it, else it is to blame
2990 if ($lines[$ln - 1] =~ m{\bprintk\(}) {
2991 if ($rawlines[$ln - 1] !~ m{\\n"}) {
2992 $ok = 1;
2993 }
2994 last;
2995 }
2996 }
2997 if ($ok == 0) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002998 WARN("PRINTK_WITHOUT_KERN_LEVEL",
2999 "printk() should include KERN_ facility level\n" . $herecurr);
Andy Whitcroft00df344f2007-06-08 13:47:06 -07003000 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003001 }
3002
Joe Perches243f3802012-05-31 16:26:09 -07003003 if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
3004 my $orig = $1;
3005 my $level = lc($orig);
3006 $level = "warn" if ($level eq "warning");
Joe Perches8f26b832012-10-04 17:13:32 -07003007 my $level2 = $level;
3008 $level2 = "dbg" if ($level eq "debug");
Joe Perches243f3802012-05-31 16:26:09 -07003009 WARN("PREFER_PR_LEVEL",
Yogesh Chaudharidaa8b052014-04-03 14:49:23 -07003010 "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr);
Joe Perches243f3802012-05-31 16:26:09 -07003011 }
3012
3013 if ($line =~ /\bpr_warning\s*\(/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07003014 if (WARN("PREFER_PR_LEVEL",
3015 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
3016 $fix) {
3017 $fixed[$linenr - 1] =~
3018 s/\bpr_warning\b/pr_warn/;
3019 }
Joe Perches243f3802012-05-31 16:26:09 -07003020 }
3021
Joe Perchesdc139312013-02-21 16:44:13 -08003022 if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
3023 my $orig = $1;
3024 my $level = lc($orig);
3025 $level = "warn" if ($level eq "warning");
3026 $level = "dbg" if ($level eq "debug");
3027 WARN("PREFER_DEV_LEVEL",
3028 "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
3029 }
3030
Andy Whitcroft653d4872007-06-23 17:16:34 -07003031# function brace can't be on same line, except for #defines of do while,
3032# or if closed on same line
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003033 if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and
3034 !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003035 ERROR("OPEN_BRACE",
3036 "open brace '{' following function declarations go on the next line\n" . $herecurr);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003037 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07003038
Andy Whitcroft8905a672007-11-28 16:21:06 -08003039# open braces for enum, union and struct go on the same line.
3040 if ($line =~ /^.\s*{/ &&
3041 $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003042 ERROR("OPEN_BRACE",
3043 "open brace '{' following $1 go on the same line\n" . $hereprev);
Andy Whitcroft8905a672007-11-28 16:21:06 -08003044 }
3045
Andy Whitcroft0c73b4e2010-10-26 14:23:15 -07003046# missing space after union, struct or enum definition
Joe Perches3705ce52013-07-03 15:05:31 -07003047 if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
3048 if (WARN("SPACING",
3049 "missing space after $1 definition\n" . $herecurr) &&
3050 $fix) {
3051 $fixed[$linenr - 1] =~
3052 s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
3053 }
Andy Whitcroft0c73b4e2010-10-26 14:23:15 -07003054 }
3055
Joe Perches31070b52014-01-23 15:54:49 -08003056# Function pointer declarations
3057# check spacing between type, funcptr, and args
3058# canonical declaration is "type (*funcptr)(args...)"
Joe Perches91f72e92014-04-03 14:49:12 -07003059 if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
Joe Perches31070b52014-01-23 15:54:49 -08003060 my $declare = $1;
3061 my $pre_pointer_space = $2;
3062 my $post_pointer_space = $3;
3063 my $funcname = $4;
3064 my $post_funcname_space = $5;
3065 my $pre_args_space = $6;
3066
Joe Perches91f72e92014-04-03 14:49:12 -07003067# the $Declare variable will capture all spaces after the type
3068# so check it for a missing trailing missing space but pointer return types
3069# don't need a space so don't warn for those.
3070 my $post_declare_space = "";
3071 if ($declare =~ /(\s+)$/) {
3072 $post_declare_space = $1;
3073 $declare = rtrim($declare);
3074 }
3075 if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
Joe Perches31070b52014-01-23 15:54:49 -08003076 WARN("SPACING",
3077 "missing space after return type\n" . $herecurr);
Joe Perches91f72e92014-04-03 14:49:12 -07003078 $post_declare_space = " ";
Joe Perches31070b52014-01-23 15:54:49 -08003079 }
3080
3081# unnecessary space "type (*funcptr)(args...)"
Joe Perches91f72e92014-04-03 14:49:12 -07003082# This test is not currently implemented because these declarations are
3083# equivalent to
3084# int foo(int bar, ...)
3085# and this is form shouldn't/doesn't generate a checkpatch warning.
3086#
3087# elsif ($declare =~ /\s{2,}$/) {
3088# WARN("SPACING",
3089# "Multiple spaces after return type\n" . $herecurr);
3090# }
Joe Perches31070b52014-01-23 15:54:49 -08003091
3092# unnecessary space "type ( *funcptr)(args...)"
3093 if (defined $pre_pointer_space &&
3094 $pre_pointer_space =~ /^\s/) {
3095 WARN("SPACING",
3096 "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
3097 }
3098
3099# unnecessary space "type (* funcptr)(args...)"
3100 if (defined $post_pointer_space &&
3101 $post_pointer_space =~ /^\s/) {
3102 WARN("SPACING",
3103 "Unnecessary space before function pointer name\n" . $herecurr);
3104 }
3105
3106# unnecessary space "type (*funcptr )(args...)"
3107 if (defined $post_funcname_space &&
3108 $post_funcname_space =~ /^\s/) {
3109 WARN("SPACING",
3110 "Unnecessary space after function pointer name\n" . $herecurr);
3111 }
3112
3113# unnecessary space "type (*funcptr) (args...)"
3114 if (defined $pre_args_space &&
3115 $pre_args_space =~ /^\s/) {
3116 WARN("SPACING",
3117 "Unnecessary space before function pointer arguments\n" . $herecurr);
3118 }
3119
3120 if (show_type("SPACING") && $fix) {
3121 $fixed[$linenr - 1] =~
Joe Perches91f72e92014-04-03 14:49:12 -07003122 s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
Joe Perches31070b52014-01-23 15:54:49 -08003123 }
3124 }
3125
Andy Whitcroft8d31cfc2008-07-23 21:29:02 -07003126# check for spacing round square brackets; allowed:
3127# 1. with a type on the left -- int [] a;
Andy Whitcroftfe2a7db2008-10-15 22:02:15 -07003128# 2. at the beginning of a line for slice initialisers -- [0...10] = 5,
3129# 3. inside a curly brace -- = { [0...10] = 5 }
Andy Whitcroft8d31cfc2008-07-23 21:29:02 -07003130 while ($line =~ /(.*?\s)\[/g) {
3131 my ($where, $prefix) = ($-[1], $1);
3132 if ($prefix !~ /$Type\s+$/ &&
Andy Whitcroftfe2a7db2008-10-15 22:02:15 -07003133 ($where != 0 || $prefix !~ /^.\s+$/) &&
Andy Whitcroftdaebc532012-03-23 15:02:17 -07003134 $prefix !~ /[{,]\s+$/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003135 if (ERROR("BRACKET_SPACE",
3136 "space prohibited before open square bracket '['\n" . $herecurr) &&
3137 $fix) {
3138 $fixed[$linenr - 1] =~
3139 s/^(\+.*?)\s+\[/$1\[/;
3140 }
Andy Whitcroft8d31cfc2008-07-23 21:29:02 -07003141 }
3142 }
3143
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003144# check for spaces between functions and their parentheses.
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003145 while ($line =~ /($Ident)\s+\(/g) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003146 my $name = $1;
Andy Whitcroft773647a2008-03-28 14:15:58 -07003147 my $ctx_before = substr($line, 0, $-[1]);
3148 my $ctx = "$ctx_before$name";
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003149
3150 # Ignore those directives where spaces _are_ permitted.
Andy Whitcroft773647a2008-03-28 14:15:58 -07003151 if ($name =~ /^(?:
3152 if|for|while|switch|return|case|
3153 volatile|__volatile__|
3154 __attribute__|format|__extension__|
3155 asm|__asm__)$/x)
3156 {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003157 # cpp #define statements have non-optional spaces, ie
3158 # if there is a space between the name and the open
3159 # parenthesis it is simply not a parameter group.
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003160 } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07003161
3162 # cpp #elif statement condition may start with a (
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003163 } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003164
3165 # If this whole things ends with a type its most
3166 # likely a typedef for a function.
Andy Whitcroft773647a2008-03-28 14:15:58 -07003167 } elsif ($ctx =~ /$Type$/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003168
3169 } else {
Joe Perches3705ce52013-07-03 15:05:31 -07003170 if (WARN("SPACING",
3171 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
3172 $fix) {
3173 $fixed[$linenr - 1] =~
3174 s/\b$name\s+\(/$name\(/;
3175 }
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003176 }
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003177 }
Eric Nelson9a4cad42012-05-31 16:26:09 -07003178
Andy Whitcroft653d4872007-06-23 17:16:34 -07003179# Check operator spacing.
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003180 if (!($line=~/\#\s*include/)) {
Joe Perches3705ce52013-07-03 15:05:31 -07003181 my $fixed_line = "";
3182 my $line_fixed = 0;
3183
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003184 my $ops = qr{
3185 <<=|>>=|<=|>=|==|!=|
3186 \+=|-=|\*=|\/=|%=|\^=|\|=|&=|
3187 =>|->|<<|>>|<|>|=|!|~|
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003188 &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
Joe Perches84731622013-11-12 15:10:05 -08003189 \?:|\?|:
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003190 }x;
Andy Whitcroftcf655042008-03-04 14:28:20 -08003191 my @elements = split(/($ops|;)/, $opline);
Joe Perches3705ce52013-07-03 15:05:31 -07003192
3193## print("element count: <" . $#elements . ">\n");
3194## foreach my $el (@elements) {
3195## print("el: <$el>\n");
3196## }
3197
3198 my @fix_elements = ();
Andy Whitcroft00df344f2007-06-08 13:47:06 -07003199 my $off = 0;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003200
Joe Perches3705ce52013-07-03 15:05:31 -07003201 foreach my $el (@elements) {
3202 push(@fix_elements, substr($rawline, $off, length($el)));
3203 $off += length($el);
3204 }
3205
3206 $off = 0;
3207
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003208 my $blank = copy_spacing($opline);
Joe Perchesb34c6482013-09-11 14:24:01 -07003209 my $last_after = -1;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003210
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003211 for (my $n = 0; $n < $#elements; $n += 2) {
Joe Perches3705ce52013-07-03 15:05:31 -07003212
3213 my $good = $fix_elements[$n] . $fix_elements[$n + 1];
3214
3215## print("n: <$n> good: <$good>\n");
3216
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003217 $off += length($elements[$n]);
3218
Lucas De Marchi25985ed2011-03-30 22:57:33 -03003219 # Pick up the preceding and succeeding characters.
Andy Whitcroft773647a2008-03-28 14:15:58 -07003220 my $ca = substr($opline, 0, $off);
3221 my $cc = '';
3222 if (length($opline) >= ($off + length($elements[$n + 1]))) {
3223 $cc = substr($opline, $off + length($elements[$n + 1]));
3224 }
3225 my $cb = "$ca$;$cc";
3226
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003227 my $a = '';
3228 $a = 'V' if ($elements[$n] ne '');
3229 $a = 'W' if ($elements[$n] =~ /\s$/);
Andy Whitcroftcf655042008-03-04 14:28:20 -08003230 $a = 'C' if ($elements[$n] =~ /$;$/);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003231 $a = 'B' if ($elements[$n] =~ /(\[|\()$/);
3232 $a = 'O' if ($elements[$n] eq '');
Andy Whitcroft773647a2008-03-28 14:15:58 -07003233 $a = 'E' if ($ca =~ /^\s*$/);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003234
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003235 my $op = $elements[$n + 1];
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003236
3237 my $c = '';
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003238 if (defined $elements[$n + 2]) {
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003239 $c = 'V' if ($elements[$n + 2] ne '');
3240 $c = 'W' if ($elements[$n + 2] =~ /^\s/);
Andy Whitcroftcf655042008-03-04 14:28:20 -08003241 $c = 'C' if ($elements[$n + 2] =~ /^$;/);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003242 $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
3243 $c = 'O' if ($elements[$n + 2] eq '');
Andy Whitcroft8b1b3372009-01-06 14:41:27 -08003244 $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003245 } else {
3246 $c = 'E';
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003247 }
3248
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003249 my $ctx = "${a}x${c}";
3250
3251 my $at = "(ctx:$ctx)";
3252
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003253 my $ptr = substr($blank, 0, $off) . "^";
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07003254 my $hereptr = "$hereline$ptr\n";
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003255
Andy Whitcroft74048ed2008-07-23 21:29:10 -07003256 # Pull out the value of this operator.
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003257 my $op_type = substr($curr_values, $off + 1, 1);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003258
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003259 # Get the full operator variant.
3260 my $opv = $op . substr($curr_vars, $off, 1);
3261
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003262 # Ignore operators passed as parameters.
3263 if ($op_type ne 'V' &&
3264 $ca =~ /\s$/ && $cc =~ /^\s*,/) {
3265
Andy Whitcroftcf655042008-03-04 14:28:20 -08003266# # Ignore comments
3267# } elsif ($op =~ /^$;+$/) {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003268
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003269 # ; should have either the end of line or a space or \ after it
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003270 } elsif ($op eq ';') {
Andy Whitcroftcf655042008-03-04 14:28:20 -08003271 if ($ctx !~ /.x[WEBC]/ &&
3272 $cc !~ /^\\/ && $cc !~ /^;/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003273 if (ERROR("SPACING",
3274 "space required after that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003275 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
Joe Perches3705ce52013-07-03 15:05:31 -07003276 $line_fixed = 1;
3277 }
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003278 }
3279
3280 # // is a comment
3281 } elsif ($op eq '//') {
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003282
Joe Perchesb00e4812014-04-03 14:49:33 -07003283 # : when part of a bitfield
3284 } elsif ($opv eq ':B') {
3285 # skip the bitfield test for now
3286
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003287 # No spaces for:
3288 # ->
Joe Perchesb00e4812014-04-03 14:49:33 -07003289 } elsif ($op eq '->') {
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003290 if ($ctx =~ /Wx.|.xW/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003291 if (ERROR("SPACING",
3292 "spaces prohibited around that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003293 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003294 if (defined $fix_elements[$n + 2]) {
3295 $fix_elements[$n + 2] =~ s/^\s+//;
3296 }
Joe Perchesb34c6482013-09-11 14:24:01 -07003297 $line_fixed = 1;
Joe Perches3705ce52013-07-03 15:05:31 -07003298 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003299 }
3300
3301 # , must have a space on the right.
3302 } elsif ($op eq ',') {
Andy Whitcroftcf655042008-03-04 14:28:20 -08003303 if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003304 if (ERROR("SPACING",
3305 "space required after that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003306 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
Joe Perches3705ce52013-07-03 15:05:31 -07003307 $line_fixed = 1;
Joe Perchesb34c6482013-09-11 14:24:01 -07003308 $last_after = $n;
Joe Perches3705ce52013-07-03 15:05:31 -07003309 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003310 }
3311
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003312 # '*' as part of a type definition -- reported already.
Andy Whitcroft74048ed2008-07-23 21:29:10 -07003313 } elsif ($opv eq '*_') {
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003314 #warn "'*' is part of type\n";
3315
3316 # unary operators should have a space before and
3317 # none after. May be left adjacent to another
3318 # unary operator, or a cast
3319 } elsif ($op eq '!' || $op eq '~' ||
Andy Whitcroft74048ed2008-07-23 21:29:10 -07003320 $opv eq '*U' || $opv eq '-U' ||
Andy Whitcroft0d413862008-10-15 22:02:16 -07003321 $opv eq '&U' || $opv eq '&&U') {
Andy Whitcroftcf655042008-03-04 14:28:20 -08003322 if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003323 if (ERROR("SPACING",
3324 "space required before that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003325 if ($n != $last_after + 2) {
3326 $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
3327 $line_fixed = 1;
3328 }
Joe Perches3705ce52013-07-03 15:05:31 -07003329 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003330 }
Andy Whitcrofta3340b32009-02-27 14:03:07 -08003331 if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07003332 # A unary '*' may be const
3333
3334 } elsif ($ctx =~ /.xW/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003335 if (ERROR("SPACING",
3336 "space prohibited after that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003337 $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003338 if (defined $fix_elements[$n + 2]) {
3339 $fix_elements[$n + 2] =~ s/^\s+//;
3340 }
Joe Perchesb34c6482013-09-11 14:24:01 -07003341 $line_fixed = 1;
Joe Perches3705ce52013-07-03 15:05:31 -07003342 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003343 }
3344
3345 # unary ++ and unary -- are allowed no space on one side.
3346 } elsif ($op eq '++' or $op eq '--') {
Andy Whitcroft773647a2008-03-28 14:15:58 -07003347 if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003348 if (ERROR("SPACING",
3349 "space required one side of that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003350 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
Joe Perches3705ce52013-07-03 15:05:31 -07003351 $line_fixed = 1;
3352 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003353 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07003354 if ($ctx =~ /Wx[BE]/ ||
3355 ($ctx =~ /Wx./ && $cc =~ /^;/)) {
Joe Perches3705ce52013-07-03 15:05:31 -07003356 if (ERROR("SPACING",
3357 "space prohibited before that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003358 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003359 $line_fixed = 1;
3360 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07003361 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07003362 if ($ctx =~ /ExW/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003363 if (ERROR("SPACING",
3364 "space prohibited after that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003365 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003366 if (defined $fix_elements[$n + 2]) {
3367 $fix_elements[$n + 2] =~ s/^\s+//;
3368 }
Joe Perchesb34c6482013-09-11 14:24:01 -07003369 $line_fixed = 1;
Joe Perches3705ce52013-07-03 15:05:31 -07003370 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07003371 }
3372
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003373 # << and >> may either have or not have spaces both sides
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003374 } elsif ($op eq '<<' or $op eq '>>' or
3375 $op eq '&' or $op eq '^' or $op eq '|' or
3376 $op eq '+' or $op eq '-' or
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003377 $op eq '*' or $op eq '/' or
3378 $op eq '%')
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003379 {
Andy Whitcroft773647a2008-03-28 14:15:58 -07003380 if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003381 if (ERROR("SPACING",
3382 "need consistent spacing around '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003383 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
3384 if (defined $fix_elements[$n + 2]) {
3385 $fix_elements[$n + 2] =~ s/^\s+//;
3386 }
Joe Perches3705ce52013-07-03 15:05:31 -07003387 $line_fixed = 1;
3388 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003389 }
3390
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003391 # A colon needs no spaces before when it is
3392 # terminating a case value or a label.
3393 } elsif ($opv eq ':C' || $opv eq ':L') {
3394 if ($ctx =~ /Wx./) {
Joe Perches3705ce52013-07-03 15:05:31 -07003395 if (ERROR("SPACING",
3396 "space prohibited before that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003397 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003398 $line_fixed = 1;
3399 }
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003400 }
3401
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003402 # All the others need spaces both sides.
Andy Whitcroftcf655042008-03-04 14:28:20 -08003403 } elsif ($ctx !~ /[EWC]x[CWE]/) {
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003404 my $ok = 0;
3405
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003406 # Ignore email addresses <foo@bar>
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003407 if (($op eq '<' &&
3408 $cc =~ /^\S+\@\S+>/) ||
3409 ($op eq '>' &&
3410 $ca =~ /<\S+\@\S+$/))
3411 {
3412 $ok = 1;
3413 }
3414
Joe Perches84731622013-11-12 15:10:05 -08003415 # messages are ERROR, but ?: are CHK
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003416 if ($ok == 0) {
Joe Perches84731622013-11-12 15:10:05 -08003417 my $msg_type = \&ERROR;
3418 $msg_type = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
3419
3420 if (&{$msg_type}("SPACING",
3421 "spaces required around that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003422 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
3423 if (defined $fix_elements[$n + 2]) {
3424 $fix_elements[$n + 2] =~ s/^\s+//;
3425 }
Joe Perches3705ce52013-07-03 15:05:31 -07003426 $line_fixed = 1;
3427 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003428 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003429 }
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003430 $off += length($elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003431
3432## print("n: <$n> GOOD: <$good>\n");
3433
3434 $fixed_line = $fixed_line . $good;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003435 }
Joe Perches3705ce52013-07-03 15:05:31 -07003436
3437 if (($#elements % 2) == 0) {
3438 $fixed_line = $fixed_line . $fix_elements[$#elements];
3439 }
3440
3441 if ($fix && $line_fixed && $fixed_line ne $fixed[$linenr - 1]) {
3442 $fixed[$linenr - 1] = $fixed_line;
3443 }
3444
3445
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003446 }
3447
Joe Perches786b6322013-07-03 15:05:32 -07003448# check for whitespace before a non-naked semicolon
Joe Perchesd2e248e2014-01-23 15:54:41 -08003449 if ($line =~ /^\+.*\S\s+;\s*$/) {
Joe Perches786b6322013-07-03 15:05:32 -07003450 if (WARN("SPACING",
3451 "space prohibited before semicolon\n" . $herecurr) &&
3452 $fix) {
3453 1 while $fixed[$linenr - 1] =~
3454 s/^(\+.*\S)\s+;/$1;/;
3455 }
3456 }
3457
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003458# check for multiple assignments
3459 if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003460 CHK("MULTIPLE_ASSIGNMENTS",
3461 "multiple assignments should be avoided\n" . $herecurr);
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003462 }
3463
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003464## # check for multiple declarations, allowing for a function declaration
3465## # continuation.
3466## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
3467## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
3468##
3469## # Remove any bracketed sections to ensure we do not
3470## # falsly report the parameters of functions.
3471## my $ln = $line;
3472## while ($ln =~ s/\([^\(\)]*\)//g) {
3473## }
3474## if ($ln =~ /,/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003475## WARN("MULTIPLE_DECLARATION",
3476## "declaring multiple variables together should be avoided\n" . $herecurr);
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003477## }
3478## }
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003479
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003480#need space before brace following if, while, etc
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003481 if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) ||
3482 $line =~ /do{/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003483 if (ERROR("SPACING",
3484 "space required before the open brace '{'\n" . $herecurr) &&
3485 $fix) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07003486 $fixed[$linenr - 1] =~ s/^(\+.*(?:do|\))){/$1 {/;
Joe Perches3705ce52013-07-03 15:05:31 -07003487 }
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07003488 }
3489
Joe Perchesc4a62ef2013-07-03 15:05:28 -07003490## # check for blank lines before declarations
3491## if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
3492## $prevrawline =~ /^.\s*$/) {
3493## WARN("SPACING",
3494## "No blank lines before declarations\n" . $hereprev);
3495## }
3496##
3497
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07003498# closing brace should have a space following it when it has anything
3499# on the line
3500 if ($line =~ /}(?!(?:,|;|\)))\S/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07003501 if (ERROR("SPACING",
3502 "space required after that close brace '}'\n" . $herecurr) &&
3503 $fix) {
3504 $fixed[$linenr - 1] =~
3505 s/}((?!(?:,|;|\)))\S)/} $1/;
3506 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003507 }
3508
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003509# check spacing on square brackets
3510 if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003511 if (ERROR("SPACING",
3512 "space prohibited after that open square bracket '['\n" . $herecurr) &&
3513 $fix) {
3514 $fixed[$linenr - 1] =~
3515 s/\[\s+/\[/;
3516 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003517 }
3518 if ($line =~ /\s\]/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003519 if (ERROR("SPACING",
3520 "space prohibited before that close square bracket ']'\n" . $herecurr) &&
3521 $fix) {
3522 $fixed[$linenr - 1] =~
3523 s/\s+\]/\]/;
3524 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003525 }
3526
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003527# check spacing on parentheses
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003528 if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
3529 $line !~ /for\s*\(\s+;/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003530 if (ERROR("SPACING",
3531 "space prohibited after that open parenthesis '('\n" . $herecurr) &&
3532 $fix) {
3533 $fixed[$linenr - 1] =~
3534 s/\(\s+/\(/;
3535 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003536 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003537 if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003538 $line !~ /for\s*\(.*;\s+\)/ &&
3539 $line !~ /:\s+\)/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003540 if (ERROR("SPACING",
3541 "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
3542 $fix) {
3543 $fixed[$linenr - 1] =~
3544 s/\s+\)/\)/;
3545 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003546 }
3547
Joe Perchese2826fd2014-08-06 16:10:48 -07003548# check unnecessary parentheses around addressof/dereference single $Lvals
3549# ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar
3550
3551 while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) {
3552 CHK("UNNECESSARY_PARENTHESES",
3553 "Unnecessary parentheses around $1\n" . $herecurr);
3554 }
3555
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003556#goto labels aren't indented, allow a single space however
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003557 if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003558 !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
Joe Perches3705ce52013-07-03 15:05:31 -07003559 if (WARN("INDENTED_LABEL",
3560 "labels should not be indented\n" . $herecurr) &&
3561 $fix) {
3562 $fixed[$linenr - 1] =~
3563 s/^(.)\s+/$1/;
3564 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003565 }
3566
Joe Perches5b9553a2014-04-03 14:49:21 -07003567# return is not a function
Joe Perches507e5142013-11-12 15:10:13 -08003568 if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003569 my $spacing = $1;
Joe Perches507e5142013-11-12 15:10:13 -08003570 if ($^V && $^V ge 5.10.0 &&
Joe Perches5b9553a2014-04-03 14:49:21 -07003571 $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {
3572 my $value = $1;
3573 $value = deparenthesize($value);
3574 if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {
3575 ERROR("RETURN_PARENTHESES",
3576 "return is not a function, parentheses are not required\n" . $herecurr);
3577 }
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003578 } elsif ($spacing !~ /\s+/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003579 ERROR("SPACING",
3580 "space required before the open parenthesis '('\n" . $herecurr);
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003581 }
3582 }
Joe Perches507e5142013-11-12 15:10:13 -08003583
Joe Perchesb43ae212014-06-23 13:22:07 -07003584# unnecessary return in a void function
3585# at end-of-function, with the previous line a single leading tab, then return;
3586# and the line before that not a goto label target like "out:"
3587 if ($sline =~ /^[ \+]}\s*$/ &&
3588 $prevline =~ /^\+\treturn\s*;\s*$/ &&
3589 $linenr >= 3 &&
3590 $lines[$linenr - 3] =~ /^[ +]/ &&
3591 $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {
Joe Perches9819cf22014-06-04 16:12:09 -07003592 WARN("RETURN_VOID",
Joe Perchesb43ae212014-06-23 13:22:07 -07003593 "void function return statements are not generally useful\n" . $hereprev);
3594 }
Joe Perches9819cf22014-06-04 16:12:09 -07003595
Joe Perches189248d2014-01-23 15:54:47 -08003596# if statements using unnecessary parentheses - ie: if ((foo == bar))
3597 if ($^V && $^V ge 5.10.0 &&
3598 $line =~ /\bif\s*((?:\(\s*){2,})/) {
3599 my $openparens = $1;
3600 my $count = $openparens =~ tr@\(@\(@;
3601 my $msg = "";
3602 if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
3603 my $comp = $4; #Not $1 because of $LvalOrFunc
3604 $msg = " - maybe == should be = ?" if ($comp eq "==");
3605 WARN("UNNECESSARY_PARENTHESES",
3606 "Unnecessary parentheses$msg\n" . $herecurr);
3607 }
3608 }
3609
Andy Whitcroft53a3c442010-10-26 14:23:14 -07003610# Return of what appears to be an errno should normally be -'ve
3611 if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
3612 my $name = $1;
3613 if ($name ne 'EOF' && $name ne 'ERROR') {
Joe Perches000d1cc12011-07-25 17:13:25 -07003614 WARN("USE_NEGATIVE_ERRNO",
3615 "return of an errno should typically be -ve (return -$1)\n" . $herecurr);
Andy Whitcroft53a3c442010-10-26 14:23:14 -07003616 }
3617 }
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003618
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003619# Need a space before open parenthesis after if, while etc
Joe Perches3705ce52013-07-03 15:05:31 -07003620 if ($line =~ /\b(if|while|for|switch)\(/) {
3621 if (ERROR("SPACING",
3622 "space required before the open parenthesis '('\n" . $herecurr) &&
3623 $fix) {
3624 $fixed[$linenr - 1] =~
3625 s/\b(if|while|for|switch)\(/$1 \(/;
3626 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003627 }
3628
Andy Whitcroftf5fe35d2008-07-23 21:29:03 -07003629# Check for illegal assignment in if conditional -- and check for trailing
3630# statements after the conditional.
Andy Whitcroft170d3a22008-10-15 22:02:30 -07003631 if ($line =~ /do\s*(?!{)/) {
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08003632 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3633 ctx_statement_block($linenr, $realcnt, 0)
3634 if (!defined $stat);
Andy Whitcroft170d3a22008-10-15 22:02:30 -07003635 my ($stat_next) = ctx_statement_block($line_nr_next,
3636 $remain_next, $off_next);
3637 $stat_next =~ s/\n./\n /g;
3638 ##print "stat<$stat> stat_next<$stat_next>\n";
3639
3640 if ($stat_next =~ /^\s*while\b/) {
3641 # If the statement carries leading newlines,
3642 # then count those as offsets.
3643 my ($whitespace) =
3644 ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
3645 my $offset =
3646 statement_rawlines($whitespace) - 1;
3647
3648 $suppress_whiletrailers{$line_nr_next +
3649 $offset} = 1;
3650 }
3651 }
3652 if (!defined $suppress_whiletrailers{$linenr} &&
Joe Perchesc11230f2013-11-21 14:31:57 -08003653 defined($stat) && defined($cond) &&
Andy Whitcroft170d3a22008-10-15 22:02:30 -07003654 $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07003655 my ($s, $c) = ($stat, $cond);
Andy Whitcroft8905a672007-11-28 16:21:06 -08003656
Andy Whitcroftb53c8e12009-01-06 14:41:29 -08003657 if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003658 ERROR("ASSIGN_IN_IF",
3659 "do not use assignment in if condition\n" . $herecurr);
Andy Whitcroft8905a672007-11-28 16:21:06 -08003660 }
3661
3662 # Find out what is on the end of the line after the
3663 # conditional.
Andy Whitcroft773647a2008-03-28 14:15:58 -07003664 substr($s, 0, length($c), '');
Andy Whitcroft8905a672007-11-28 16:21:06 -08003665 $s =~ s/\n.*//g;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003666 $s =~ s/$;//g; # Remove any comments
Andy Whitcroft53210162008-07-23 21:29:03 -07003667 if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
3668 $c !~ /}\s*while\s*/)
Andy Whitcroft773647a2008-03-28 14:15:58 -07003669 {
Andy Whitcroftbb44ad32008-10-15 22:02:34 -07003670 # Find out how long the conditional actually is.
3671 my @newlines = ($c =~ /\n/gs);
3672 my $cond_lines = 1 + $#newlines;
Hidetoshi Seto42bdf742010-03-05 13:43:50 -08003673 my $stat_real = '';
Andy Whitcroftbb44ad32008-10-15 22:02:34 -07003674
Hidetoshi Seto42bdf742010-03-05 13:43:50 -08003675 $stat_real = raw_line($linenr, $cond_lines)
3676 . "\n" if ($cond_lines);
Andy Whitcroftbb44ad32008-10-15 22:02:34 -07003677 if (defined($stat_real) && $cond_lines > 1) {
3678 $stat_real = "[...]\n$stat_real";
3679 }
3680
Joe Perches000d1cc12011-07-25 17:13:25 -07003681 ERROR("TRAILING_STATEMENTS",
3682 "trailing statements should be on next line\n" . $herecurr . $stat_real);
Andy Whitcroft8905a672007-11-28 16:21:06 -08003683 }
3684 }
3685
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003686# Check for bitwise tests written as boolean
3687 if ($line =~ /
3688 (?:
3689 (?:\[|\(|\&\&|\|\|)
3690 \s*0[xX][0-9]+\s*
3691 (?:\&\&|\|\|)
3692 |
3693 (?:\&\&|\|\|)
3694 \s*0[xX][0-9]+\s*
3695 (?:\&\&|\|\||\)|\])
3696 )/x)
3697 {
Joe Perches000d1cc12011-07-25 17:13:25 -07003698 WARN("HEXADECIMAL_BOOLEAN_TEST",
3699 "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003700 }
3701
Andy Whitcroft8905a672007-11-28 16:21:06 -08003702# if and else should not have general statements after it
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003703 if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
3704 my $s = $1;
3705 $s =~ s/$;//g; # Remove any comments
3706 if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003707 ERROR("TRAILING_STATEMENTS",
3708 "trailing statements should be on next line\n" . $herecurr);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003709 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003710 }
Andy Whitcroft39667782009-01-15 13:51:06 -08003711# if should not continue a brace
3712 if ($line =~ /}\s*if\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003713 ERROR("TRAILING_STATEMENTS",
Rasmus Villemoes048b1232014-08-06 16:10:37 -07003714 "trailing statements should be on next line (or did you mean 'else if'?)\n" .
Andy Whitcroft39667782009-01-15 13:51:06 -08003715 $herecurr);
3716 }
Andy Whitcrofta1080bf2008-10-15 22:02:25 -07003717# case and default should not have general statements after them
3718 if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
3719 $line !~ /\G(?:
Andy Whitcroft3fef12d2008-10-15 22:02:36 -07003720 (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
Andy Whitcrofta1080bf2008-10-15 22:02:25 -07003721 \s*return\s+
3722 )/xg)
3723 {
Joe Perches000d1cc12011-07-25 17:13:25 -07003724 ERROR("TRAILING_STATEMENTS",
3725 "trailing statements should be on next line\n" . $herecurr);
Andy Whitcrofta1080bf2008-10-15 22:02:25 -07003726 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003727
3728 # Check for }<nl>else {, these must be at the same
3729 # indent level to be relevant to each other.
3730 if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
3731 $previndent == $indent) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003732 ERROR("ELSE_AFTER_BRACE",
3733 "else should follow close brace '}'\n" . $hereprev);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003734 }
3735
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003736 if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and
3737 $previndent == $indent) {
3738 my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
3739
3740 # Find out what is on the end of the line after the
3741 # conditional.
Andy Whitcroft773647a2008-03-28 14:15:58 -07003742 substr($s, 0, length($c), '');
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003743 $s =~ s/\n.*//g;
3744
3745 if ($s =~ /^\s*;/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003746 ERROR("WHILE_AFTER_BRACE",
3747 "while should follow close brace '}'\n" . $hereprev);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003748 }
3749 }
3750
Joe Perches95e2c602013-07-03 15:05:20 -07003751#Specific variable tests
Joe Perches323c1262012-12-17 16:02:07 -08003752 while ($line =~ m{($Constant|$Lval)}g) {
3753 my $var = $1;
Joe Perches95e2c602013-07-03 15:05:20 -07003754
3755#gcc binary extension
3756 if ($var =~ /^$Binary$/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07003757 if (WARN("GCC_BINARY_CONSTANT",
3758 "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) &&
3759 $fix) {
3760 my $hexval = sprintf("0x%x", oct($var));
3761 $fixed[$linenr - 1] =~
3762 s/\b$var\b/$hexval/;
3763 }
Joe Perches95e2c602013-07-03 15:05:20 -07003764 }
3765
3766#CamelCase
Joe Perches807bd262013-07-03 15:05:22 -07003767 if ($var !~ /^$Constant$/ &&
Joe Perchesbe797942013-07-03 15:05:20 -07003768 $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
Joe Perches22735ce2013-07-03 15:05:33 -07003769#Ignore Page<foo> variants
Joe Perches807bd262013-07-03 15:05:22 -07003770 $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
Joe Perches22735ce2013-07-03 15:05:33 -07003771#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
Joe Perches34456862013-07-03 15:05:34 -07003772 $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/) {
Joe Perches7e781f62013-09-11 14:23:55 -07003773 while ($var =~ m{($Ident)}g) {
3774 my $word = $1;
3775 next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
Joe Perchesd8b07712013-11-12 15:10:06 -08003776 if ($check) {
3777 seed_camelcase_includes();
3778 if (!$file && !$camelcase_file_seeded) {
3779 seed_camelcase_file($realfile);
3780 $camelcase_file_seeded = 1;
3781 }
3782 }
Joe Perches7e781f62013-09-11 14:23:55 -07003783 if (!defined $camelcase{$word}) {
3784 $camelcase{$word} = 1;
3785 CHK("CAMELCASE",
3786 "Avoid CamelCase: <$word>\n" . $herecurr);
3787 }
Joe Perches34456862013-07-03 15:05:34 -07003788 }
Joe Perches323c1262012-12-17 16:02:07 -08003789 }
3790 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003791
3792#no spaces allowed after \ in define
Joe Perchesd5e616f2013-09-11 14:23:54 -07003793 if ($line =~ /\#\s*define.*\\\s+$/) {
3794 if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
3795 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
3796 $fix) {
3797 $fixed[$linenr - 1] =~ s/\s+$//;
3798 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003799 }
3800
Andy Whitcroft653d4872007-06-23 17:16:34 -07003801#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003802 if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
Andy Whitcrofte09dec42008-10-15 22:02:20 -07003803 my $file = "$1.h";
3804 my $checkfile = "include/linux/$file";
3805 if (-f "$root/$checkfile" &&
3806 $realfile ne $checkfile &&
Wolfram Sang7840a942010-08-09 17:20:57 -07003807 $1 !~ /$allowed_asm_includes/)
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003808 {
Andy Whitcrofte09dec42008-10-15 22:02:20 -07003809 if ($realfile =~ m{^arch/}) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003810 CHK("ARCH_INCLUDE_LINUX",
3811 "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
Andy Whitcrofte09dec42008-10-15 22:02:20 -07003812 } else {
Joe Perches000d1cc12011-07-25 17:13:25 -07003813 WARN("INCLUDE_LINUX",
3814 "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
Andy Whitcrofte09dec42008-10-15 22:02:20 -07003815 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003816 }
3817 }
3818
Andy Whitcroft653d4872007-06-23 17:16:34 -07003819# multi-statement macros should be enclosed in a do while loop, grab the
3820# first statement and ensure its the whole macro if its not enclosed
Andy Whitcroftcf655042008-03-04 14:28:20 -08003821# in a known good container
Andy Whitcroftb8f96a312008-07-23 21:29:07 -07003822 if ($realfile !~ m@/vmlinux.lds.h$@ &&
3823 $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003824 my $ln = $linenr;
3825 my $cnt = $realcnt;
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003826 my ($off, $dstat, $dcond, $rest);
3827 my $ctx = '';
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003828 ($dstat, $dcond, $ln, $cnt, $off) =
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003829 ctx_statement_block($linenr, $realcnt, 0);
3830 $ctx = $dstat;
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003831 #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
Andy Whitcrofta3bb97a2008-07-23 21:29:00 -07003832 #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003833
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003834 $dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
Andy Whitcroft292f1a92008-07-23 21:29:11 -07003835 $dstat =~ s/$;//g;
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003836 $dstat =~ s/\\\n.//g;
3837 $dstat =~ s/^\s*//s;
3838 $dstat =~ s/\s*$//s;
3839
3840 # Flatten any parentheses and braces
Andy Whitcroftbf30d6e2008-10-15 22:02:33 -07003841 while ($dstat =~ s/\([^\(\)]*\)/1/ ||
3842 $dstat =~ s/\{[^\{\}]*\}/1/ ||
Andy Whitcroftc81769f2012-01-10 15:10:10 -08003843 $dstat =~ s/\[[^\[\]]*\]/1/)
Andy Whitcroftbf30d6e2008-10-15 22:02:33 -07003844 {
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07003845 }
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003846
Andy Whitcrofte45bab82012-03-23 15:02:18 -07003847 # Flatten any obvious string concatentation.
3848 while ($dstat =~ s/("X*")\s*$Ident/$1/ ||
3849 $dstat =~ s/$Ident\s*("X*")/$1/)
3850 {
3851 }
3852
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003853 my $exceptions = qr{
3854 $Declare|
3855 module_param_named|
Kees Cooka0a0a7a2012-10-04 17:13:38 -07003856 MODULE_PARM_DESC|
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003857 DECLARE_PER_CPU|
3858 DEFINE_PER_CPU|
Andy Whitcroft383099f2009-01-06 14:41:18 -08003859 __typeof__\(|
Stefani Seibold22fd2d32010-03-05 13:43:52 -08003860 union|
3861 struct|
Andy Whitcroftea71a0a2009-09-21 17:04:38 -07003862 \.$Ident\s*=\s*|
3863 ^\"|\"$
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003864 }x;
Andy Whitcroft5eaa20b2010-10-26 14:23:18 -07003865 #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003866 if ($dstat ne '' &&
3867 $dstat !~ /^(?:$Ident|-?$Constant),$/ && # 10, // foo(),
3868 $dstat !~ /^(?:$Ident|-?$Constant);$/ && # foo();
Joe Perches3cc4b1c2013-07-03 15:05:27 -07003869 $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ && # 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
Joe Perches356fd392014-08-06 16:10:31 -07003870 $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ && # character constants
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003871 $dstat !~ /$exceptions/ &&
3872 $dstat !~ /^\.$Ident\s*=/ && # .foo =
Joe Perchese942e2c2013-04-17 15:58:26 -07003873 $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo
Andy Whitcroft72f115f2012-01-10 15:10:06 -08003874 $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...)
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003875 $dstat !~ /^for\s*$Constant$/ && # for (...)
3876 $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ && # for (...) bar()
3877 $dstat !~ /^do\s*{/ && # do {...
Joe Perchesf95a7e62013-09-11 14:24:00 -07003878 $dstat !~ /^\({/ && # ({...
3879 $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003880 {
3881 $ctx =~ s/\n*$//;
3882 my $herectx = $here . "\n";
3883 my $cnt = statement_rawlines($ctx);
3884
3885 for (my $n = 0; $n < $cnt; $n++) {
3886 $herectx .= raw_line($linenr, $n) . "\n";
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003887 }
3888
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003889 if ($dstat =~ /;/) {
3890 ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
3891 "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
3892 } else {
Joe Perches000d1cc12011-07-25 17:13:25 -07003893 ERROR("COMPLEX_MACRO",
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003894 "Macros with complex values should be enclosed in parenthesis\n" . "$herectx");
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003895 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07003896 }
Joe Perches5023d342012-12-17 16:01:47 -08003897
Joe Perches481eb482012-12-17 16:01:56 -08003898# check for line continuations outside of #defines, preprocessor #, and asm
Joe Perches5023d342012-12-17 16:01:47 -08003899
3900 } else {
3901 if ($prevline !~ /^..*\\$/ &&
Joe Perches481eb482012-12-17 16:01:56 -08003902 $line !~ /^\+\s*\#.*\\$/ && # preprocessor
3903 $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm
Joe Perches5023d342012-12-17 16:01:47 -08003904 $line =~ /^\+.*\\$/) {
3905 WARN("LINE_CONTINUATIONS",
3906 "Avoid unnecessary line continuations\n" . $herecurr);
3907 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003908 }
3909
Joe Perchesb13edf72012-07-30 14:41:24 -07003910# do {} while (0) macro tests:
3911# single-statement macros do not need to be enclosed in do while (0) loop,
3912# macro should not end with a semicolon
3913 if ($^V && $^V ge 5.10.0 &&
3914 $realfile !~ m@/vmlinux.lds.h$@ &&
3915 $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
3916 my $ln = $linenr;
3917 my $cnt = $realcnt;
3918 my ($off, $dstat, $dcond, $rest);
3919 my $ctx = '';
3920 ($dstat, $dcond, $ln, $cnt, $off) =
3921 ctx_statement_block($linenr, $realcnt, 0);
3922 $ctx = $dstat;
3923
3924 $dstat =~ s/\\\n.//g;
3925
3926 if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
3927 my $stmts = $2;
3928 my $semis = $3;
3929
3930 $ctx =~ s/\n*$//;
3931 my $cnt = statement_rawlines($ctx);
3932 my $herectx = $here . "\n";
3933
3934 for (my $n = 0; $n < $cnt; $n++) {
3935 $herectx .= raw_line($linenr, $n) . "\n";
3936 }
3937
Joe Perchesac8e97f2012-08-21 16:15:53 -07003938 if (($stmts =~ tr/;/;/) == 1 &&
3939 $stmts !~ /^\s*(if|while|for|switch)\b/) {
Joe Perchesb13edf72012-07-30 14:41:24 -07003940 WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
3941 "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
3942 }
3943 if (defined $semis && $semis ne "") {
3944 WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
3945 "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
3946 }
Joe Perchesf5ef95b2014-06-04 16:12:06 -07003947 } elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
3948 $ctx =~ s/\n*$//;
3949 my $cnt = statement_rawlines($ctx);
3950 my $herectx = $here . "\n";
3951
3952 for (my $n = 0; $n < $cnt; $n++) {
3953 $herectx .= raw_line($linenr, $n) . "\n";
3954 }
3955
3956 WARN("TRAILING_SEMICOLON",
3957 "macros should not use a trailing semicolon\n" . "$herectx");
Joe Perchesb13edf72012-07-30 14:41:24 -07003958 }
3959 }
3960
Mike Frysinger080ba922009-01-06 14:41:25 -08003961# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
3962# all assignments may have only one of the following with an assignment:
3963# .
3964# ALIGN(...)
3965# VMLINUX_SYMBOL(...)
3966 if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003967 WARN("MISSING_VMLINUX_SYMBOL",
3968 "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
Mike Frysinger080ba922009-01-06 14:41:25 -08003969 }
3970
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003971# check for redundant bracing round if etc
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003972 if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
3973 my ($level, $endln, @chunks) =
Andy Whitcroftcf655042008-03-04 14:28:20 -08003974 ctx_statement_full($linenr, $realcnt, 1);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003975 #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08003976 #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
3977 if ($#chunks > 0 && $level == 0) {
Joe Perchesaad4f612012-03-23 15:02:19 -07003978 my @allowed = ();
3979 my $allow = 0;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003980 my $seen = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -07003981 my $herectx = $here . "\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08003982 my $ln = $linenr - 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003983 for my $chunk (@chunks) {
3984 my ($cond, $block) = @{$chunk};
3985
Andy Whitcroft773647a2008-03-28 14:15:58 -07003986 # If the condition carries leading newlines, then count those as offsets.
3987 my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
3988 my $offset = statement_rawlines($whitespace) - 1;
3989
Joe Perchesaad4f612012-03-23 15:02:19 -07003990 $allowed[$allow] = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -07003991 #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
3992
3993 # We have looked at and allowed this specific line.
3994 $suppress_ifbraces{$ln + $offset} = 1;
3995
3996 $herectx .= "$rawlines[$ln + $offset]\n[...]\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08003997 $ln += statement_rawlines($block) - 1;
3998
Andy Whitcroft773647a2008-03-28 14:15:58 -07003999 substr($block, 0, length($cond), '');
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004000
4001 $seen++ if ($block =~ /^\s*{/);
4002
Joe Perchesaad4f612012-03-23 15:02:19 -07004003 #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08004004 if (statement_lines($cond) > 1) {
4005 #print "APW: ALLOWED: cond<$cond>\n";
Joe Perchesaad4f612012-03-23 15:02:19 -07004006 $allowed[$allow] = 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004007 }
4008 if ($block =~/\b(?:if|for|while)\b/) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08004009 #print "APW: ALLOWED: block<$block>\n";
Joe Perchesaad4f612012-03-23 15:02:19 -07004010 $allowed[$allow] = 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004011 }
Andy Whitcroftcf655042008-03-04 14:28:20 -08004012 if (statement_block_size($block) > 1) {
4013 #print "APW: ALLOWED: lines block<$block>\n";
Joe Perchesaad4f612012-03-23 15:02:19 -07004014 $allowed[$allow] = 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004015 }
Joe Perchesaad4f612012-03-23 15:02:19 -07004016 $allow++;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004017 }
Joe Perchesaad4f612012-03-23 15:02:19 -07004018 if ($seen) {
4019 my $sum_allowed = 0;
4020 foreach (@allowed) {
4021 $sum_allowed += $_;
4022 }
4023 if ($sum_allowed == 0) {
4024 WARN("BRACES",
4025 "braces {} are not necessary for any arm of this statement\n" . $herectx);
4026 } elsif ($sum_allowed != $allow &&
4027 $seen != $allow) {
4028 CHK("BRACES",
4029 "braces {} should be used on all arms of this statement\n" . $herectx);
4030 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004031 }
4032 }
4033 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07004034 if (!defined $suppress_ifbraces{$linenr - 1} &&
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004035 $line =~ /\b(if|while|for|else)\b/) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08004036 my $allowed = 0;
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07004037
Andy Whitcroftcf655042008-03-04 14:28:20 -08004038 # Check the pre-context.
4039 if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
4040 #print "APW: ALLOWED: pre<$1>\n";
4041 $allowed = 1;
4042 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07004043
4044 my ($level, $endln, @chunks) =
4045 ctx_statement_full($linenr, $realcnt, $-[0]);
4046
Andy Whitcroftcf655042008-03-04 14:28:20 -08004047 # Check the condition.
4048 my ($cond, $block) = @{$chunks[0]};
Andy Whitcroft773647a2008-03-28 14:15:58 -07004049 #print "CHECKING<$linenr> cond<$cond> block<$block>\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08004050 if (defined $cond) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07004051 substr($block, 0, length($cond), '');
Andy Whitcroftcf655042008-03-04 14:28:20 -08004052 }
4053 if (statement_lines($cond) > 1) {
4054 #print "APW: ALLOWED: cond<$cond>\n";
4055 $allowed = 1;
4056 }
4057 if ($block =~/\b(?:if|for|while)\b/) {
4058 #print "APW: ALLOWED: block<$block>\n";
4059 $allowed = 1;
4060 }
4061 if (statement_block_size($block) > 1) {
4062 #print "APW: ALLOWED: lines block<$block>\n";
4063 $allowed = 1;
4064 }
4065 # Check the post-context.
4066 if (defined $chunks[1]) {
4067 my ($cond, $block) = @{$chunks[1]};
4068 if (defined $cond) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07004069 substr($block, 0, length($cond), '');
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07004070 }
Andy Whitcroftcf655042008-03-04 14:28:20 -08004071 if ($block =~ /^\s*\{/) {
4072 #print "APW: ALLOWED: chunk-1 block<$block>\n";
4073 $allowed = 1;
4074 }
4075 }
4076 if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
Justin P. Mattock69932482011-07-26 23:06:29 -07004077 my $herectx = $here . "\n";
Andy Whitcroftf0556632008-10-15 22:02:23 -07004078 my $cnt = statement_rawlines($block);
Andy Whitcroftcf655042008-03-04 14:28:20 -08004079
Andy Whitcroftf0556632008-10-15 22:02:23 -07004080 for (my $n = 0; $n < $cnt; $n++) {
Justin P. Mattock69932482011-07-26 23:06:29 -07004081 $herectx .= raw_line($linenr, $n) . "\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08004082 }
4083
Joe Perches000d1cc12011-07-25 17:13:25 -07004084 WARN("BRACES",
4085 "braces {} are not necessary for single statement blocks\n" . $herectx);
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07004086 }
4087 }
4088
Joe Perches0979ae62012-12-17 16:01:59 -08004089# check for unnecessary blank lines around braces
Joe Perches77b9a532013-07-03 15:05:29 -07004090 if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
Joe Perches0979ae62012-12-17 16:01:59 -08004091 CHK("BRACES",
4092 "Blank lines aren't necessary before a close brace '}'\n" . $hereprev);
4093 }
Joe Perches77b9a532013-07-03 15:05:29 -07004094 if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
Joe Perches0979ae62012-12-17 16:01:59 -08004095 CHK("BRACES",
4096 "Blank lines aren't necessary after an open brace '{'\n" . $hereprev);
4097 }
4098
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004099# no volatiles please
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07004100 my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
4101 if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004102 WARN("VOLATILE",
4103 "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004104 }
4105
Andy Whitcroft00df344f2007-06-08 13:47:06 -07004106# warn about #if 0
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004107 if ($line =~ /^.\s*\#\s*if\s+0\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004108 CHK("REDUNDANT_CODE",
4109 "if this code is redundant consider removing it\n" .
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004110 $herecurr);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004111 }
4112
Andy Whitcroft03df4b52012-12-17 16:01:52 -08004113# check for needless "if (<foo>) fn(<foo>)" uses
4114 if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
4115 my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;';
4116 if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {
4117 WARN('NEEDLESS_IF',
4118 "$1(NULL) is safe this check is probably not required\n" . $hereprev);
Greg Kroah-Hartman4c432a82008-07-23 21:29:04 -07004119 }
4120 }
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07004121
Joe Perchesebfdc402014-08-06 16:10:27 -07004122# check for unnecessary "Out of Memory" messages
4123 if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
4124 $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
4125 (defined $1 || defined $3) &&
4126 $linenr > 3) {
4127 my $testval = $2;
4128 my $testline = $lines[$linenr - 3];
4129
4130 my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
4131# print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n");
4132
4133 if ($c =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|(?:dev_)?alloc_skb)/) {
4134 WARN("OOM_MESSAGE",
4135 "Possible unnecessary 'out of memory' message\n" . $hereprev);
4136 }
4137 }
4138
Joe Perches8716de32013-09-11 14:24:05 -07004139# check for bad placement of section $InitAttribute (e.g.: __initdata)
4140 if ($line =~ /(\b$InitAttribute\b)/) {
4141 my $attr = $1;
4142 if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
4143 my $ptr = $1;
4144 my $var = $2;
4145 if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
4146 ERROR("MISPLACED_INIT",
4147 "$attr should be placed after $var\n" . $herecurr)) ||
4148 ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
4149 WARN("MISPLACED_INIT",
4150 "$attr should be placed after $var\n" . $herecurr))) &&
4151 $fix) {
4152 $fixed[$linenr - 1] =~ 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;
4153 }
4154 }
4155 }
4156
Joe Perchese970b8842013-11-12 15:10:10 -08004157# check for $InitAttributeData (ie: __initdata) with const
4158 if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
4159 my $attr = $1;
4160 $attr =~ /($InitAttributePrefix)(.*)/;
4161 my $attr_prefix = $1;
4162 my $attr_type = $2;
4163 if (ERROR("INIT_ATTRIBUTE",
4164 "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
4165 $fix) {
4166 $fixed[$linenr - 1] =~
4167 s/$InitAttributeData/${attr_prefix}initconst/;
4168 }
4169 }
4170
4171# check for $InitAttributeConst (ie: __initconst) without const
4172 if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
4173 my $attr = $1;
4174 if (ERROR("INIT_ATTRIBUTE",
4175 "Use of $attr requires a separate use of const\n" . $herecurr) &&
4176 $fix) {
4177 my $lead = $fixed[$linenr - 1] =~
4178 /(^\+\s*(?:static\s+))/;
4179 $lead = rtrim($1);
4180 $lead = "$lead " if ($lead !~ /^\+$/);
4181 $lead = "${lead}const ";
4182 $fixed[$linenr - 1] =~ s/(^\+\s*(?:static\s+))/$lead/;
4183 }
4184 }
4185
Joe Perchesfbdb8132014-04-03 14:49:14 -07004186# don't use __constant_<foo> functions outside of include/uapi/
4187 if ($realfile !~ m@^include/uapi/@ &&
4188 $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
4189 my $constant_func = $1;
4190 my $func = $constant_func;
4191 $func =~ s/^__constant_//;
4192 if (WARN("CONSTANT_CONVERSION",
4193 "$constant_func should be $func\n" . $herecurr) &&
4194 $fix) {
4195 $fixed[$linenr - 1] =~ s/\b$constant_func\b/$func/g;
4196 }
4197 }
4198
Patrick Pannuto1a15a252010-08-09 17:21:01 -07004199# prefer usleep_range over udelay
Bruce Allan37581c22013-02-21 16:44:19 -08004200 if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
Joe Perches43c1d772014-04-03 14:49:11 -07004201 my $delay = $1;
Patrick Pannuto1a15a252010-08-09 17:21:01 -07004202 # ignore udelay's < 10, however
Joe Perches43c1d772014-04-03 14:49:11 -07004203 if (! ($delay < 10) ) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004204 CHK("USLEEP_RANGE",
Joe Perches43c1d772014-04-03 14:49:11 -07004205 "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $herecurr);
4206 }
4207 if ($delay > 2000) {
4208 WARN("LONG_UDELAY",
4209 "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr);
Patrick Pannuto1a15a252010-08-09 17:21:01 -07004210 }
4211 }
4212
Patrick Pannuto09ef8722010-08-09 17:21:02 -07004213# warn about unexpectedly long msleep's
4214 if ($line =~ /\bmsleep\s*\((\d+)\);/) {
4215 if ($1 < 20) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004216 WARN("MSLEEP",
Joe Perches43c1d772014-04-03 14:49:11 -07004217 "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $herecurr);
Patrick Pannuto09ef8722010-08-09 17:21:02 -07004218 }
4219 }
4220
Joe Perches36ec1932013-07-03 15:05:25 -07004221# check for comparisons of jiffies
4222 if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
4223 WARN("JIFFIES_COMPARISON",
4224 "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
4225 }
4226
Joe Perches9d7a34a2013-07-03 15:05:26 -07004227# check for comparisons of get_jiffies_64()
4228 if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
4229 WARN("JIFFIES_COMPARISON",
4230 "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
4231 }
4232
Andy Whitcroft00df344f2007-06-08 13:47:06 -07004233# warn about #ifdefs in C files
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004234# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
Andy Whitcroft00df344f2007-06-08 13:47:06 -07004235# print "#ifdef in C files should be avoided\n";
4236# print "$herecurr";
4237# $clean = 0;
4238# }
4239
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07004240# warn about spacing in #ifdefs
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004241 if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
Joe Perches3705ce52013-07-03 15:05:31 -07004242 if (ERROR("SPACING",
4243 "exactly one space required after that #$1\n" . $herecurr) &&
4244 $fix) {
4245 $fixed[$linenr - 1] =~
4246 s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
4247 }
4248
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07004249 }
4250
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004251# check for spinlock_t definitions without a comment.
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004252 if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
4253 $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004254 my $which = $1;
4255 if (!ctx_has_comment($first_line, $linenr)) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004256 CHK("UNCOMMENTED_DEFINITION",
4257 "$1 definition without comment\n" . $herecurr);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004258 }
4259 }
4260# check for memory barriers without a comment.
4261 if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
4262 if (!ctx_has_comment($first_line, $linenr)) {
Joe Perchesc1fd7bb2013-11-12 15:10:11 -08004263 WARN("MEMORY_BARRIER",
4264 "memory barrier without comment\n" . $herecurr);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004265 }
4266 }
4267# check of hardware specific defines
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004268 if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004269 CHK("ARCH_DEFINES",
4270 "architecture specific defines should be avoided\n" . $herecurr);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07004271 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07004272
Tobias Klauserd4977c72010-05-24 14:33:30 -07004273# Check that the storage class is at the beginning of a declaration
4274 if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004275 WARN("STORAGE_CLASS",
4276 "storage class should be at the beginning of the declaration\n" . $herecurr)
Tobias Klauserd4977c72010-05-24 14:33:30 -07004277 }
4278
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004279# check the location of the inline attribute, that it is between
4280# storage class and type.
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07004281 if ($line =~ /\b$Type\s+$Inline\b/ ||
4282 $line =~ /\b$Inline\s+$Storage\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004283 ERROR("INLINE_LOCATION",
4284 "inline keyword should sit between storage class and type\n" . $herecurr);
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004285 }
4286
Andy Whitcroft8905a672007-11-28 16:21:06 -08004287# Check for __inline__ and __inline, prefer inline
Joe Perches2b7ab452013-11-12 15:10:14 -08004288 if ($realfile !~ m@\binclude/uapi/@ &&
4289 $line =~ /\b(__inline__|__inline)\b/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004290 if (WARN("INLINE",
4291 "plain inline is preferred over $1\n" . $herecurr) &&
4292 $fix) {
4293 $fixed[$linenr - 1] =~ s/\b(__inline__|__inline)\b/inline/;
4294
4295 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08004296 }
4297
Joe Perches3d130fd2011-01-12 17:00:00 -08004298# Check for __attribute__ packed, prefer __packed
Joe Perches2b7ab452013-11-12 15:10:14 -08004299 if ($realfile !~ m@\binclude/uapi/@ &&
4300 $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004301 WARN("PREFER_PACKED",
4302 "__packed is preferred over __attribute__((packed))\n" . $herecurr);
Joe Perches3d130fd2011-01-12 17:00:00 -08004303 }
4304
Joe Perches39b7e282011-07-25 17:13:24 -07004305# Check for __attribute__ aligned, prefer __aligned
Joe Perches2b7ab452013-11-12 15:10:14 -08004306 if ($realfile !~ m@\binclude/uapi/@ &&
4307 $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004308 WARN("PREFER_ALIGNED",
4309 "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
Joe Perches39b7e282011-07-25 17:13:24 -07004310 }
4311
Joe Perches5f14d3b2012-01-10 15:09:52 -08004312# Check for __attribute__ format(printf, prefer __printf
Joe Perches2b7ab452013-11-12 15:10:14 -08004313 if ($realfile !~ m@\binclude/uapi/@ &&
4314 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004315 if (WARN("PREFER_PRINTF",
4316 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
4317 $fix) {
4318 $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
4319
4320 }
Joe Perches5f14d3b2012-01-10 15:09:52 -08004321 }
4322
Joe Perches6061d942012-03-23 15:02:16 -07004323# Check for __attribute__ format(scanf, prefer __scanf
Joe Perches2b7ab452013-11-12 15:10:14 -08004324 if ($realfile !~ m@\binclude/uapi/@ &&
4325 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004326 if (WARN("PREFER_SCANF",
4327 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
4328 $fix) {
4329 $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
4330 }
Joe Perches6061d942012-03-23 15:02:16 -07004331 }
4332
Joe Perches8f53a9b2010-03-05 13:43:48 -08004333# check for sizeof(&)
4334 if ($line =~ /\bsizeof\s*\(\s*\&/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004335 WARN("SIZEOF_ADDRESS",
4336 "sizeof(& should be avoided\n" . $herecurr);
Joe Perches8f53a9b2010-03-05 13:43:48 -08004337 }
4338
Joe Perches66c80b62012-07-30 14:41:22 -07004339# check for sizeof without parenthesis
4340 if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004341 if (WARN("SIZEOF_PARENTHESIS",
4342 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
4343 $fix) {
4344 $fixed[$linenr - 1] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
4345 }
Joe Perches66c80b62012-07-30 14:41:22 -07004346 }
4347
Joe Perches428e2fd2011-05-24 17:13:39 -07004348# check for line continuations in quoted strings with odd counts of "
4349 if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004350 WARN("LINE_CONTINUATIONS",
4351 "Avoid line continuations in quoted strings\n" . $herecurr);
Joe Perches428e2fd2011-05-24 17:13:39 -07004352 }
4353
Joe Perches88982fe2012-12-17 16:02:00 -08004354# check for struct spinlock declarations
4355 if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
4356 WARN("USE_SPINLOCK_T",
4357 "struct spinlock should be spinlock_t\n" . $herecurr);
4358 }
4359
Joe Perchesa6962d72013-04-29 16:18:13 -07004360# check for seq_printf uses that could be seq_puts
Joe Perches06668722013-11-12 15:10:07 -08004361 if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
Joe Perchesa6962d72013-04-29 16:18:13 -07004362 my $fmt = get_quoted_string($line, $rawline);
Joe Perches06668722013-11-12 15:10:07 -08004363 if ($fmt ne "" && $fmt !~ /[^\\]\%/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004364 if (WARN("PREFER_SEQ_PUTS",
4365 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
4366 $fix) {
4367 $fixed[$linenr - 1] =~ s/\bseq_printf\b/seq_puts/;
4368 }
Joe Perchesa6962d72013-04-29 16:18:13 -07004369 }
4370 }
4371
Andy Whitcroft554e1652012-01-10 15:09:57 -08004372# Check for misused memsets
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004373 if ($^V && $^V ge 5.10.0 &&
4374 defined $stat &&
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004375 $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {
Andy Whitcroft554e1652012-01-10 15:09:57 -08004376
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004377 my $ms_addr = $2;
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004378 my $ms_val = $7;
4379 my $ms_size = $12;
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004380
Andy Whitcroft554e1652012-01-10 15:09:57 -08004381 if ($ms_size =~ /^(0x|)0$/i) {
4382 ERROR("MEMSET",
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004383 "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
Andy Whitcroft554e1652012-01-10 15:09:57 -08004384 } elsif ($ms_size =~ /^(0x|)1$/i) {
4385 WARN("MEMSET",
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004386 "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
4387 }
4388 }
4389
Joe Perches98a9bba2014-01-23 15:54:52 -08004390# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
4391 if ($^V && $^V ge 5.10.0 &&
4392 $line =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/s) {
4393 if (WARN("PREFER_ETHER_ADDR_COPY",
4394 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . $herecurr) &&
4395 $fix) {
4396 $fixed[$linenr - 1] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
4397 }
4398 }
4399
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004400# typecasts on min/max could be min_t/max_t
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004401 if ($^V && $^V ge 5.10.0 &&
4402 defined $stat &&
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004403 $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004404 if (defined $2 || defined $7) {
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004405 my $call = $1;
4406 my $cast1 = deparenthesize($2);
4407 my $arg1 = $3;
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004408 my $cast2 = deparenthesize($7);
4409 my $arg2 = $8;
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004410 my $cast;
4411
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004412 if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004413 $cast = "$cast1 or $cast2";
4414 } elsif ($cast1 ne "") {
4415 $cast = $cast1;
4416 } else {
4417 $cast = $cast2;
4418 }
4419 WARN("MINMAX",
4420 "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
Andy Whitcroft554e1652012-01-10 15:09:57 -08004421 }
4422 }
4423
Joe Perches4a273192012-07-30 14:41:20 -07004424# check usleep_range arguments
4425 if ($^V && $^V ge 5.10.0 &&
4426 defined $stat &&
4427 $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
4428 my $min = $1;
4429 my $max = $7;
4430 if ($min eq $max) {
4431 WARN("USLEEP_RANGE",
4432 "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
4433 } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
4434 $min > $max) {
4435 WARN("USLEEP_RANGE",
4436 "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
4437 }
4438 }
4439
Joe Perches823b7942013-11-12 15:10:15 -08004440# check for naked sscanf
4441 if ($^V && $^V ge 5.10.0 &&
4442 defined $stat &&
Joe Perches6c8bd702014-04-03 14:49:16 -07004443 $line =~ /\bsscanf\b/ &&
Joe Perches823b7942013-11-12 15:10:15 -08004444 ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
4445 $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
4446 $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
4447 my $lc = $stat =~ tr@\n@@;
4448 $lc = $lc + $linenr;
4449 my $stat_real = raw_line($linenr, 0);
4450 for (my $count = $linenr + 1; $count <= $lc; $count++) {
4451 $stat_real = $stat_real . "\n" . raw_line($count, 0);
4452 }
4453 WARN("NAKED_SSCANF",
4454 "unchecked sscanf return value\n" . "$here\n$stat_real\n");
4455 }
4456
Joe Perchesafc819a2014-06-04 16:12:08 -07004457# check for simple sscanf that should be kstrto<foo>
4458 if ($^V && $^V ge 5.10.0 &&
4459 defined $stat &&
4460 $line =~ /\bsscanf\b/) {
4461 my $lc = $stat =~ tr@\n@@;
4462 $lc = $lc + $linenr;
4463 my $stat_real = raw_line($linenr, 0);
4464 for (my $count = $linenr + 1; $count <= $lc; $count++) {
4465 $stat_real = $stat_real . "\n" . raw_line($count, 0);
4466 }
4467 if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {
4468 my $format = $6;
4469 my $count = $format =~ tr@%@%@;
4470 if ($count == 1 &&
4471 $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {
4472 WARN("SSCANF_TO_KSTRTO",
4473 "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n");
4474 }
4475 }
4476 }
4477
Joe Perches70dc8a42013-09-11 14:23:58 -07004478# check for new externs in .h files.
4479 if ($realfile =~ /\.h$/ &&
4480 $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
Joe Perchesd1d85782013-09-24 15:27:46 -07004481 if (CHK("AVOID_EXTERNS",
4482 "extern prototypes should be avoided in .h files\n" . $herecurr) &&
Joe Perches70dc8a42013-09-11 14:23:58 -07004483 $fix) {
4484 $fixed[$linenr - 1] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
4485 }
4486 }
4487
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004488# check for new externs in .c files.
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004489 if ($realfile =~ /\.c$/ && defined $stat &&
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004490 $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004491 {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004492 my $function_name = $1;
4493 my $paren_space = $2;
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004494
4495 my $s = $stat;
4496 if (defined $cond) {
4497 substr($s, 0, length($cond), '');
4498 }
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004499 if ($s =~ /^\s*;/ &&
4500 $function_name ne 'uninitialized_var')
4501 {
Joe Perches000d1cc12011-07-25 17:13:25 -07004502 WARN("AVOID_EXTERNS",
4503 "externs should be avoided in .c files\n" . $herecurr);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004504 }
4505
4506 if ($paren_space =~ /\n/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004507 WARN("FUNCTION_ARGUMENTS",
4508 "arguments for function declarations should follow identifier\n" . $herecurr);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004509 }
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004510
4511 } elsif ($realfile =~ /\.c$/ && defined $stat &&
4512 $stat =~ /^.\s*extern\s+/)
4513 {
Joe Perches000d1cc12011-07-25 17:13:25 -07004514 WARN("AVOID_EXTERNS",
4515 "externs should be avoided in .c files\n" . $herecurr);
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004516 }
4517
4518# checks for new __setup's
4519 if ($rawline =~ /\b__setup\("([^"]*)"/) {
4520 my $name = $1;
4521
4522 if (!grep(/$name/, @setup_docs)) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004523 CHK("UNDOCUMENTED_SETUP",
4524 "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004525 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07004526 }
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07004527
4528# check for pointless casting of kmalloc return
Joe Perchescaf2a542011-01-12 16:59:56 -08004529 if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004530 WARN("UNNECESSARY_CASTS",
4531 "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07004532 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004533
Joe Perchesa640d252013-07-03 15:05:21 -07004534# alloc style
4535# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
4536 if ($^V && $^V ge 5.10.0 &&
4537 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
4538 CHK("ALLOC_SIZEOF_STRUCT",
4539 "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
4540 }
4541
Joe Perches60a55362014-06-04 16:12:07 -07004542# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
4543 if ($^V && $^V ge 5.10.0 &&
Joe Perchese3674552014-08-06 16:10:55 -07004544 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
Joe Perches60a55362014-06-04 16:12:07 -07004545 my $oldfunc = $3;
4546 my $a1 = $4;
4547 my $a2 = $10;
4548 my $newfunc = "kmalloc_array";
4549 $newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
Joe Perchese3674552014-08-06 16:10:55 -07004550 my $r1 = $a1;
4551 my $r2 = $a2;
4552 if ($a1 =~ /^sizeof\s*\S/) {
4553 $r1 = $a2;
4554 $r2 = $a1;
4555 }
4556 if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
4557 !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
Joe Perches60a55362014-06-04 16:12:07 -07004558 if (WARN("ALLOC_WITH_MULTIPLY",
4559 "Prefer $newfunc over $oldfunc with multiply\n" . $herecurr) &&
4560 $fix) {
Joe Perches60a55362014-06-04 16:12:07 -07004561 $fixed[$linenr - 1] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e;
4562
4563 }
4564 }
4565 }
4566
Joe Perches972fdea2013-04-29 16:18:12 -07004567# check for krealloc arg reuse
4568 if ($^V && $^V ge 5.10.0 &&
4569 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
4570 WARN("KREALLOC_ARG_REUSE",
4571 "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
4572 }
4573
Joe Perches5ce59ae2013-02-21 16:44:18 -08004574# check for alloc argument mismatch
4575 if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
4576 WARN("ALLOC_ARRAY_ARGS",
4577 "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
4578 }
4579
Joe Perchescaf2a542011-01-12 16:59:56 -08004580# check for multiple semicolons
4581 if ($line =~ /;\s*;\s*$/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004582 if (WARN("ONE_SEMICOLON",
4583 "Statements terminations use 1 semicolon\n" . $herecurr) &&
4584 $fix) {
4585 $fixed[$linenr - 1] =~ s/(\s*;\s*){2,}$/;/g;
4586 }
Joe Perchesd1e2ad02012-12-17 16:02:01 -08004587 }
4588
Joe Perchesc34c09a2014-01-23 15:54:43 -08004589# check for case / default statements not preceeded by break/fallthrough/switch
4590 if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
4591 my $has_break = 0;
4592 my $has_statement = 0;
4593 my $count = 0;
4594 my $prevline = $linenr;
4595 while ($prevline > 1 && $count < 3 && !$has_break) {
4596 $prevline--;
4597 my $rline = $rawlines[$prevline - 1];
4598 my $fline = $lines[$prevline - 1];
4599 last if ($fline =~ /^\@\@/);
4600 next if ($fline =~ /^\-/);
4601 next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
4602 $has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
4603 next if ($fline =~ /^.[\s$;]*$/);
4604 $has_statement = 1;
4605 $count++;
4606 $has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/);
4607 }
4608 if (!$has_break && $has_statement) {
4609 WARN("MISSING_BREAK",
4610 "Possible switch case/default not preceeded by break or fallthrough comment\n" . $herecurr);
4611 }
4612 }
4613
Joe Perchesd1e2ad02012-12-17 16:02:01 -08004614# check for switch/default statements without a break;
4615 if ($^V && $^V ge 5.10.0 &&
4616 defined $stat &&
4617 $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
4618 my $ctx = '';
4619 my $herectx = $here . "\n";
4620 my $cnt = statement_rawlines($stat);
4621 for (my $n = 0; $n < $cnt; $n++) {
4622 $herectx .= raw_line($linenr, $n) . "\n";
4623 }
4624 WARN("DEFAULT_NO_BREAK",
4625 "switch default: should use break\n" . $herectx);
Joe Perchescaf2a542011-01-12 16:59:56 -08004626 }
4627
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004628# check for gcc specific __FUNCTION__
Joe Perchesd5e616f2013-09-11 14:23:54 -07004629 if ($line =~ /\b__FUNCTION__\b/) {
4630 if (WARN("USE_FUNC",
4631 "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr) &&
4632 $fix) {
4633 $fixed[$linenr - 1] =~ s/\b__FUNCTION__\b/__func__/g;
4634 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004635 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07004636
Joe Perches2c924882012-03-23 15:02:20 -07004637# check for use of yield()
4638 if ($line =~ /\byield\s*\(\s*\)/) {
4639 WARN("YIELD",
4640 "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr);
4641 }
4642
Joe Perches179f8f42013-07-03 15:05:30 -07004643# check for comparisons against true and false
4644 if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
4645 my $lead = $1;
4646 my $arg = $2;
4647 my $test = $3;
4648 my $otype = $4;
4649 my $trail = $5;
4650 my $op = "!";
4651
4652 ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
4653
4654 my $type = lc($otype);
4655 if ($type =~ /^(?:true|false)$/) {
4656 if (("$test" eq "==" && "$type" eq "true") ||
4657 ("$test" eq "!=" && "$type" eq "false")) {
4658 $op = "";
4659 }
4660
4661 CHK("BOOL_COMPARISON",
4662 "Using comparison to $otype is error prone\n" . $herecurr);
4663
4664## maybe suggesting a correct construct would better
4665## "Using comparison to $otype is error prone. Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
4666
4667 }
4668 }
4669
Thomas Gleixner4882720b2010-09-07 14:34:01 +00004670# check for semaphores initialized locked
4671 if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004672 WARN("CONSIDER_COMPLETION",
4673 "consider using a completion\n" . $herecurr);
Andy Whitcroft773647a2008-03-28 14:15:58 -07004674 }
Joe Perches6712d852012-03-23 15:02:20 -07004675
Joe Perches67d0a072011-10-31 17:13:10 -07004676# recommend kstrto* over simple_strto* and strict_strto*
4677 if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004678 WARN("CONSIDER_KSTRTO",
Joe Perches67d0a072011-10-31 17:13:10 -07004679 "$1 is obsolete, use k$3 instead\n" . $herecurr);
Andy Whitcroft773647a2008-03-28 14:15:58 -07004680 }
Joe Perches6712d852012-03-23 15:02:20 -07004681
Fabian Frederickae3ccc42014-06-04 16:12:10 -07004682# check for __initcall(), use device_initcall() explicitly or more appropriate function please
Michael Ellermanf3db6632008-07-23 21:28:57 -07004683 if ($line =~ /^.\s*__initcall\s*\(/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004684 WARN("USE_DEVICE_INITCALL",
Fabian Frederickae3ccc42014-06-04 16:12:10 -07004685 "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr);
Michael Ellermanf3db6632008-07-23 21:28:57 -07004686 }
Joe Perches6712d852012-03-23 15:02:20 -07004687
Emese Revfy79404842010-03-05 13:43:53 -08004688# check for various ops structs, ensure they are const.
4689 my $struct_ops = qr{acpi_dock_ops|
4690 address_space_operations|
4691 backlight_ops|
4692 block_device_operations|
4693 dentry_operations|
4694 dev_pm_ops|
4695 dma_map_ops|
4696 extent_io_ops|
4697 file_lock_operations|
4698 file_operations|
4699 hv_ops|
4700 ide_dma_ops|
4701 intel_dvo_dev_ops|
4702 item_operations|
4703 iwl_ops|
4704 kgdb_arch|
4705 kgdb_io|
4706 kset_uevent_ops|
4707 lock_manager_operations|
4708 microcode_ops|
4709 mtrr_ops|
4710 neigh_ops|
4711 nlmsvc_binding|
4712 pci_raw_ops|
4713 pipe_buf_operations|
4714 platform_hibernation_ops|
4715 platform_suspend_ops|
4716 proto_ops|
4717 rpc_pipe_ops|
4718 seq_operations|
4719 snd_ac97_build_ops|
4720 soc_pcmcia_socket_ops|
4721 stacktrace_ops|
4722 sysfs_ops|
4723 tty_operations|
4724 usb_mon_operations|
4725 wd_ops}x;
Andy Whitcroft6903ffb2009-01-15 13:51:07 -08004726 if ($line !~ /\bconst\b/ &&
Emese Revfy79404842010-03-05 13:43:53 -08004727 $line =~ /\bstruct\s+($struct_ops)\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004728 WARN("CONST_STRUCT",
4729 "struct $1 should normally be const\n" .
Andy Whitcroft6903ffb2009-01-15 13:51:07 -08004730 $herecurr);
Andy Whitcroft2b6db5c2009-01-06 14:41:29 -08004731 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07004732
4733# use of NR_CPUS is usually wrong
4734# ignore definitions of NR_CPUS and usage to define arrays as likely right
4735 if ($line =~ /\bNR_CPUS\b/ &&
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004736 $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
4737 $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004738 $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
4739 $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
4740 $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
Andy Whitcroft773647a2008-03-28 14:15:58 -07004741 {
Joe Perches000d1cc12011-07-25 17:13:25 -07004742 WARN("NR_CPUS",
4743 "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
Andy Whitcroft773647a2008-03-28 14:15:58 -07004744 }
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004745
Joe Perches52ea8502013-11-12 15:10:09 -08004746# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
4747 if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
4748 ERROR("DEFINE_ARCH_HAS",
4749 "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
4750 }
4751
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004752# check for %L{u,d,i} in strings
4753 my $string;
4754 while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
4755 $string = substr($rawline, $-[1], $+[1] - $-[1]);
Andy Whitcroft2a1bc5d2008-10-15 22:02:23 -07004756 $string =~ s/%%/__/g;
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004757 if ($string =~ /(?<!%)%L[udi]/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004758 WARN("PRINTF_L",
4759 "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004760 last;
4761 }
4762 }
Andy Whitcroft691d77b2009-01-06 14:41:16 -08004763
4764# whine mightly about in_atomic
4765 if ($line =~ /\bin_atomic\s*\(/) {
4766 if ($realfile =~ m@^drivers/@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004767 ERROR("IN_ATOMIC",
4768 "do not use in_atomic in drivers\n" . $herecurr);
Andy Whitcroftf4a87732009-02-27 14:03:05 -08004769 } elsif ($realfile !~ m@^kernel/@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004770 WARN("IN_ATOMIC",
4771 "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
Andy Whitcroft691d77b2009-01-06 14:41:16 -08004772 }
4773 }
Peter Zijlstra1704f472010-03-19 01:37:42 +01004774
4775# check for lockdep_set_novalidate_class
4776 if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
4777 $line =~ /__lockdep_no_validate__\s*\)/ ) {
4778 if ($realfile !~ m@^kernel/lockdep@ &&
4779 $realfile !~ m@^include/linux/lockdep@ &&
4780 $realfile !~ m@^drivers/base/core@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004781 ERROR("LOCKDEP",
4782 "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
Peter Zijlstra1704f472010-03-19 01:37:42 +01004783 }
4784 }
Dave Jones88f88312011-01-12 16:59:59 -08004785
4786 if ($line =~ /debugfs_create_file.*S_IWUGO/ ||
4787 $line =~ /DEVICE_ATTR.*S_IWUGO/ ) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004788 WARN("EXPORTED_WORLD_WRITABLE",
4789 "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
Dave Jones88f88312011-01-12 16:59:59 -08004790 }
Joe Perches24358802014-04-03 14:49:13 -07004791
Joe Perches515a2352014-04-03 14:49:24 -07004792# Mode permission misuses where it seems decimal should be octal
4793# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
4794 if ($^V && $^V ge 5.10.0 &&
4795 $line =~ /$mode_perms_search/) {
4796 foreach my $entry (@mode_permission_funcs) {
4797 my $func = $entry->[0];
4798 my $arg_pos = $entry->[1];
Joe Perches24358802014-04-03 14:49:13 -07004799
Joe Perches515a2352014-04-03 14:49:24 -07004800 my $skip_args = "";
4801 if ($arg_pos > 1) {
4802 $arg_pos--;
4803 $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
4804 }
4805 my $test = "\\b$func\\s*\\(${skip_args}([\\d]+)\\s*[,\\)]";
4806 if ($line =~ /$test/) {
4807 my $val = $1;
4808 $val = $6 if ($skip_args ne "");
Joe Perches24358802014-04-03 14:49:13 -07004809
Joe Perches515a2352014-04-03 14:49:24 -07004810 if ($val !~ /^0$/ &&
4811 (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
4812 length($val) ne 4)) {
4813 ERROR("NON_OCTAL_PERMISSIONS",
4814 "Use 4 digit octal (0777) not decimal permissions\n" . $herecurr);
4815 }
Joe Perches24358802014-04-03 14:49:13 -07004816 }
4817 }
4818 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004819 }
4820
4821 # If we have no input at all, then there is nothing to report on
4822 # so just keep quiet.
4823 if ($#rawlines == -1) {
4824 exit(0);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07004825 }
4826
Andy Whitcroft8905a672007-11-28 16:21:06 -08004827 # In mailback mode only produce a report in the negative, for
4828 # things that appear to be patches.
4829 if ($mailback && ($clean == 1 || !$is_patch)) {
4830 exit(0);
4831 }
4832
4833 # This is not a patch, and we are are in 'no-patch' mode so
4834 # just keep quiet.
4835 if (!$chk_patch && !$is_patch) {
4836 exit(0);
4837 }
4838
4839 if (!$is_patch) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004840 ERROR("NOT_UNIFIED_DIFF",
4841 "Does not appear to be a unified-diff format patch\n");
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07004842 }
4843 if ($is_patch && $chk_signoff && $signoff == 0) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004844 ERROR("MISSING_SIGN_OFF",
4845 "Missing Signed-off-by: line(s)\n");
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07004846 }
4847
Andy Whitcroft8905a672007-11-28 16:21:06 -08004848 print report_dump();
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004849 if ($summary && !($clean == 1 && $quiet == 1)) {
4850 print "$filename " if ($summary_file);
Andy Whitcroft8905a672007-11-28 16:21:06 -08004851 print "total: $cnt_error errors, $cnt_warn warnings, " .
4852 (($check)? "$cnt_chk checks, " : "") .
4853 "$cnt_lines lines checked\n";
4854 print "\n" if ($quiet == 0);
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07004855 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08004856
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07004857 if ($quiet == 0) {
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004858
4859 if ($^V lt 5.10.0) {
4860 print("NOTE: perl $^V is not modern enough to detect all possible issues.\n");
4861 print("An upgrade to at least perl v5.10.0 is suggested.\n\n");
4862 }
4863
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07004864 # If there were whitespace errors which cleanpatch can fix
4865 # then suggest that.
4866 if ($rpt_cleaners) {
4867 print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n";
4868 print " scripts/cleanfile\n\n";
Mike Frysingerb0781212011-03-22 16:34:43 -07004869 $rpt_cleaners = 0;
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07004870 }
4871 }
4872
Joe Perches91bfe482013-09-11 14:23:59 -07004873 hash_show_words(\%use_type, "Used");
4874 hash_show_words(\%ignore_type, "Ignored");
Joe Perches000d1cc12011-07-25 17:13:25 -07004875
Joe Perches3705ce52013-07-03 15:05:31 -07004876 if ($clean == 0 && $fix && "@rawlines" ne "@fixed") {
Joe Perches9624b8d2014-01-23 15:54:44 -08004877 my $newfile = $filename;
4878 $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
Joe Perches3705ce52013-07-03 15:05:31 -07004879 my $linecount = 0;
4880 my $f;
4881
4882 open($f, '>', $newfile)
4883 or die "$P: Can't open $newfile for write\n";
4884 foreach my $fixed_line (@fixed) {
4885 $linecount++;
4886 if ($file) {
4887 if ($linecount > 3) {
4888 $fixed_line =~ s/^\+//;
4889 print $f $fixed_line. "\n";
4890 }
4891 } else {
4892 print $f $fixed_line . "\n";
4893 }
4894 }
4895 close($f);
4896
4897 if (!$quiet) {
4898 print << "EOM";
4899Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
4900
4901Do _NOT_ trust the results written to this file.
4902Do _NOT_ submit these changes without inspecting them for correctness.
4903
4904This EXPERIMENTAL file is simply a convenience to help rewrite patches.
4905No warranties, expressed or implied...
4906
4907EOM
4908 }
4909 }
4910
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07004911 if ($clean == 1 && $quiet == 0) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08004912 print "$vname has no obvious style problems and is ready for submission.\n"
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07004913 }
4914 if ($clean == 0 && $quiet == 0) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004915 print << "EOM";
4916$vname has style problems, please review.
4917
4918If any of these errors are false positives, please report
4919them to the maintainer, see CHECKPATCH in MAINTAINERS.
4920EOM
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07004921 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004922
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07004923 return $clean;
4924}