blob: c624b04d0070d476bc74f49586e4b1e599ee8ba8 [file] [log] [blame]
Andy Whitcroft0a920b52007-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 Whitcroft00df3442007-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 Whitcroft015830b2010-10-26 14:23:17 -07005# (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
Andy Whitcroft0a920b52007-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 Whitcroft0a920b52007-06-01 00:46:48 -070010
11my $P = $0;
Andy Whitcroft00df3442007-06-08 13:47:06 -070012$P =~ s@.*/@@g;
Andy Whitcroft0a920b52007-06-01 00:46:48 -070013
Joe Perches000d1cc12011-07-25 17:13:25 -070014my $V = '0.32';
Andy Whitcroft0a920b52007-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;
Andy Whitcroft8905a672007-11-28 16:21:06 -080027my $summary = 1;
28my $mailback = 0;
Andy Whitcroft13214ad2008-02-08 04:22:03 -080029my $summary_file = 0;
Joe Perches000d1cc12011-07-25 17:13:25 -070030my $show_types = 0;
Joe Perches3705ce52013-07-03 15:05:31 -070031my $fix = 0;
Joe Perches9624b8d2014-01-23 15:54:44 -080032my $fix_inplace = 0;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -070033my $root;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -080034my %debug;
Joe Perches34456862013-07-03 15:05:34 -070035my %camelcase = ();
Joe Perches91bfe482013-09-11 14:23:59 -070036my %use_type = ();
37my @use = ();
38my %ignore_type = ();
Joe Perches000d1cc12011-07-25 17:13:25 -070039my @ignore = ();
Hannes Eder77f5b102009-09-21 17:04:37 -070040my $help = 0;
Joe Perches000d1cc12011-07-25 17:13:25 -070041my $configuration_file = ".checkpatch.conf";
Joe Perches6cd7f382012-12-17 16:01:54 -080042my $max_line_length = 80;
Dave Hansend62a2012013-09-11 14:23:56 -070043my $ignore_perl_version = 0;
44my $minimum_perl_version = 5.10.0;
Hannes Eder77f5b102009-09-21 17:04:37 -070045
46sub help {
47 my ($exitcode) = @_;
48
49 print << "EOM";
50Usage: $P [OPTION]... [FILE]...
51Version: $V
52
53Options:
54 -q, --quiet quiet
55 --no-tree run without a kernel tree
56 --no-signoff do not check for 'Signed-off-by' line
57 --patch treat FILE as patchfile (default)
58 --emacs emacs compile window format
59 --terse one line per report
60 -f, --file treat FILE as regular source file
61 --subjective, --strict enable more subjective tests
Joe Perches91bfe482013-09-11 14:23:59 -070062 --types TYPE(,TYPE2...) show only these comma separated message types
Joe Perches000d1cc12011-07-25 17:13:25 -070063 --ignore TYPE(,TYPE2...) ignore various comma separated message types
Joe Perches6cd7f382012-12-17 16:01:54 -080064 --max-line-length=n set the maximum line length, if exceeded, warn
Joe Perches000d1cc12011-07-25 17:13:25 -070065 --show-types show the message "types" in the output
Hannes Eder77f5b102009-09-21 17:04:37 -070066 --root=PATH PATH to the kernel tree root
67 --no-summary suppress the per-file summary
68 --mailback only produce a report in case of warnings/errors
69 --summary-file include the filename in summary
70 --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of
71 'values', 'possible', 'type', and 'attr' (default
72 is all off)
73 --test-only=WORD report only warnings/errors containing WORD
74 literally
Joe Perches3705ce52013-07-03 15:05:31 -070075 --fix EXPERIMENTAL - may create horrible results
76 If correctable single-line errors exist, create
77 "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
78 with potential errors corrected to the preferred
79 checkpatch style
Joe Perches9624b8d2014-01-23 15:54:44 -080080 --fix-inplace EXPERIMENTAL - may create horrible results
81 Is the same as --fix, but overwrites the input
82 file. It's your fault if there's no backup or git
Dave Hansend62a2012013-09-11 14:23:56 -070083 --ignore-perl-version override checking of perl version. expect
84 runtime errors.
Hannes Eder77f5b102009-09-21 17:04:37 -070085 -h, --help, --version display this help and exit
86
87When FILE is - read standard input.
88EOM
89
90 exit($exitcode);
91}
92
Joe Perches000d1cc12011-07-25 17:13:25 -070093my $conf = which_conf($configuration_file);
94if (-f $conf) {
95 my @conf_args;
96 open(my $conffile, '<', "$conf")
97 or warn "$P: Can't find a readable $configuration_file file $!\n";
98
99 while (<$conffile>) {
100 my $line = $_;
101
102 $line =~ s/\s*\n?$//g;
103 $line =~ s/^\s*//g;
104 $line =~ s/\s+/ /g;
105
106 next if ($line =~ m/^\s*#/);
107 next if ($line =~ m/^\s*$/);
108
109 my @words = split(" ", $line);
110 foreach my $word (@words) {
111 last if ($word =~ m/^#/);
112 push (@conf_args, $word);
113 }
114 }
115 close($conffile);
116 unshift(@ARGV, @conf_args) if @conf_args;
117}
118
Andy Whitcroft0a920b52007-06-01 00:46:48 -0700119GetOptions(
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700120 'q|quiet+' => \$quiet,
Andy Whitcroft0a920b52007-06-01 00:46:48 -0700121 'tree!' => \$tree,
122 'signoff!' => \$chk_signoff,
123 'patch!' => \$chk_patch,
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700124 'emacs!' => \$emacs,
Andy Whitcroft8905a672007-11-28 16:21:06 -0800125 'terse!' => \$terse,
Hannes Eder77f5b102009-09-21 17:04:37 -0700126 'f|file!' => \$file,
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700127 'subjective!' => \$check,
128 'strict!' => \$check,
Joe Perches000d1cc12011-07-25 17:13:25 -0700129 'ignore=s' => \@ignore,
Joe Perches91bfe482013-09-11 14:23:59 -0700130 'types=s' => \@use,
Joe Perches000d1cc12011-07-25 17:13:25 -0700131 'show-types!' => \$show_types,
Joe Perches6cd7f382012-12-17 16:01:54 -0800132 'max-line-length=i' => \$max_line_length,
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700133 'root=s' => \$root,
Andy Whitcroft8905a672007-11-28 16:21:06 -0800134 'summary!' => \$summary,
135 'mailback!' => \$mailback,
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800136 'summary-file!' => \$summary_file,
Joe Perches3705ce52013-07-03 15:05:31 -0700137 'fix!' => \$fix,
Joe Perches9624b8d2014-01-23 15:54:44 -0800138 'fix-inplace!' => \$fix_inplace,
Dave Hansend62a2012013-09-11 14:23:56 -0700139 'ignore-perl-version!' => \$ignore_perl_version,
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800140 'debug=s' => \%debug,
Andy Whitcroft773647a2008-03-28 14:15:58 -0700141 'test-only=s' => \$tst_only,
Hannes Eder77f5b102009-09-21 17:04:37 -0700142 'h|help' => \$help,
143 'version' => \$help
144) or help(1);
145
146help(0) if ($help);
Andy Whitcroft0a920b52007-06-01 00:46:48 -0700147
Joe Perches9624b8d2014-01-23 15:54:44 -0800148$fix = 1 if ($fix_inplace);
149
Andy Whitcroft0a920b52007-06-01 00:46:48 -0700150my $exit = 0;
151
Dave Hansend62a2012013-09-11 14:23:56 -0700152if ($^V && $^V lt $minimum_perl_version) {
153 printf "$P: requires at least perl version %vd\n", $minimum_perl_version;
154 if (!$ignore_perl_version) {
155 exit(1);
156 }
157}
158
Andy Whitcroft0a920b52007-06-01 00:46:48 -0700159if ($#ARGV < 0) {
Hannes Eder77f5b102009-09-21 17:04:37 -0700160 print "$P: no input files\n";
Andy Whitcroft0a920b52007-06-01 00:46:48 -0700161 exit(1);
162}
163
Joe Perches91bfe482013-09-11 14:23:59 -0700164sub hash_save_array_words {
165 my ($hashRef, $arrayRef) = @_;
Joe Perches000d1cc12011-07-25 17:13:25 -0700166
Joe Perches91bfe482013-09-11 14:23:59 -0700167 my @array = split(/,/, join(',', @$arrayRef));
168 foreach my $word (@array) {
169 $word =~ s/\s*\n?$//g;
170 $word =~ s/^\s*//g;
171 $word =~ s/\s+/ /g;
172 $word =~ tr/[a-z]/[A-Z]/;
Joe Perches000d1cc12011-07-25 17:13:25 -0700173
Joe Perches91bfe482013-09-11 14:23:59 -0700174 next if ($word =~ m/^\s*#/);
175 next if ($word =~ m/^\s*$/);
176
177 $hashRef->{$word}++;
178 }
Joe Perches000d1cc12011-07-25 17:13:25 -0700179}
180
Joe Perches91bfe482013-09-11 14:23:59 -0700181sub hash_show_words {
182 my ($hashRef, $prefix) = @_;
183
Joe Perches58cb3cf2013-09-11 14:24:04 -0700184 if ($quiet == 0 && keys %$hashRef) {
Joe Perches91bfe482013-09-11 14:23:59 -0700185 print "NOTE: $prefix message types:";
Joe Perches58cb3cf2013-09-11 14:24:04 -0700186 foreach my $word (sort keys %$hashRef) {
Joe Perches91bfe482013-09-11 14:23:59 -0700187 print " $word";
188 }
189 print "\n\n";
190 }
191}
192
193hash_save_array_words(\%ignore_type, \@ignore);
194hash_save_array_words(\%use_type, \@use);
195
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800196my $dbg_values = 0;
197my $dbg_possible = 0;
Andy Whitcroft7429c692008-07-23 21:29:06 -0700198my $dbg_type = 0;
Andy Whitcrofta1ef2772008-10-15 22:02:17 -0700199my $dbg_attr = 0;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800200for my $key (keys %debug) {
Andy Whitcroft21caa132009-01-06 14:41:30 -0800201 ## no critic
202 eval "\${dbg_$key} = '$debug{$key}';";
203 die "$@" if ($@);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800204}
205
Andy Whitcroftd2c0a232010-10-26 14:23:12 -0700206my $rpt_cleaners = 0;
207
Andy Whitcroft8905a672007-11-28 16:21:06 -0800208if ($terse) {
209 $emacs = 1;
210 $quiet++;
211}
212
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700213if ($tree) {
214 if (defined $root) {
215 if (!top_of_kernel_tree($root)) {
216 die "$P: $root: --root does not point at a valid tree\n";
217 }
218 } else {
219 if (top_of_kernel_tree('.')) {
220 $root = '.';
221 } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
222 top_of_kernel_tree($1)) {
223 $root = $1;
224 }
225 }
226
227 if (!defined $root) {
228 print "Must be run from the top-level dir. of a kernel tree\n";
229 exit(2);
230 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -0700231}
232
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700233my $emitted_corrupt = 0;
234
Andy Whitcroft2ceb5322009-10-26 16:50:14 -0700235our $Ident = qr{
236 [A-Za-z_][A-Za-z\d_]*
237 (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
238 }x;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700239our $Storage = qr{extern|static|asmlinkage};
240our $Sparse = qr{
241 __user|
242 __kernel|
243 __force|
244 __iomem|
245 __must_check|
246 __init_refok|
Andy Whitcroft417495e2009-02-27 14:03:08 -0800247 __kprobes|
Sven Eckelmann165e72a2011-07-25 17:13:23 -0700248 __ref|
249 __rcu
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700250 }x;
Joe Perchese970b882013-11-12 15:10:10 -0800251our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
252our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
253our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
254our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
255our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
Joe Perches8716de32013-09-11 14:24:05 -0700256
Wolfram Sang52131292010-03-05 13:43:51 -0800257# Notes to $Attribute:
258# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700259our $Attribute = qr{
260 const|
Joe Perches03f1df72010-10-26 14:23:16 -0700261 __percpu|
262 __nocast|
263 __safe|
264 __bitwise__|
265 __packed__|
266 __packed2__|
267 __naked|
268 __maybe_unused|
269 __always_unused|
270 __noreturn|
271 __used|
272 __cold|
273 __noclone|
274 __deprecated|
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700275 __read_mostly|
276 __kprobes|
Joe Perches8716de32013-09-11 14:24:05 -0700277 $InitAttribute|
Andy Whitcroft24e1d812008-10-15 22:02:18 -0700278 ____cacheline_aligned|
279 ____cacheline_aligned_in_smp|
Andy Whitcroft5fe3af12009-01-06 14:41:18 -0800280 ____cacheline_internodealigned_in_smp|
281 __weak
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700282 }x;
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700283our $Modifier;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700284our $Inline = qr{inline|__always_inline|noinline};
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700285our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]};
286our $Lval = qr{$Ident(?:$Member)*};
287
Joe Perches95e2c602013-07-03 15:05:20 -0700288our $Int_type = qr{(?i)llu|ull|ll|lu|ul|l|u};
289our $Binary = qr{(?i)0b[01]+$Int_type?};
290our $Hex = qr{(?i)0x[0-9a-f]+$Int_type?};
291our $Int = qr{[0-9]+$Int_type?};
Joe Perches24358802014-04-03 14:49:13 -0700292our $Octal = qr{0[0-7]+$Int_type?};
Joe Perches326b1ff2013-02-04 14:28:51 -0800293our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
294our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
295our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?};
Joe Perches74349bc2012-12-17 16:02:05 -0800296our $Float = qr{$Float_hex|$Float_dec|$Float_int};
Joe Perches24358802014-04-03 14:49:13 -0700297our $Constant = qr{$Float|$Binary|$Octal|$Hex|$Int};
Joe Perches326b1ff2013-02-04 14:28:51 -0800298our $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
Joe Perches447432f2014-04-03 14:49:17 -0700299our $Compare = qr{<=|>=|==|!=|<|(?<!-)>};
Joe Perches23f780c2013-07-03 15:05:31 -0700300our $Arithmetic = qr{\+|-|\*|\/|%};
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700301our $Operators = qr{
302 <=|>=|==|!=|
303 =>|->|<<|>>|<|>|!|~|
Joe Perches23f780c2013-07-03 15:05:31 -0700304 &&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700305 }x;
306
Andy Whitcroft8905a672007-11-28 16:21:06 -0800307our $NonptrType;
Joe Perches8716de32013-09-11 14:24:05 -0700308our $NonptrTypeWithAttr;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800309our $Type;
310our $Declare;
311
Joe Perches15662b32011-10-31 17:13:12 -0700312our $NON_ASCII_UTF8 = qr{
313 [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
Andy Whitcroft171ae1a2008-04-29 00:59:32 -0700314 | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
315 | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
316 | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
317 | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
318 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
319 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
320}x;
321
Joe Perches15662b32011-10-31 17:13:12 -0700322our $UTF8 = qr{
323 [\x09\x0A\x0D\x20-\x7E] # ASCII
324 | $NON_ASCII_UTF8
325}x;
326
Andy Whitcroft8ed22ca2008-10-15 22:02:32 -0700327our $typeTypedefs = qr{(?x:
Andy Whitcroftfb9e9092009-09-21 17:04:38 -0700328 (?:__)?(?:u|s|be|le)(?:8|16|32|64)|
Andy Whitcroft8ed22ca2008-10-15 22:02:32 -0700329 atomic_t
330)};
331
Joe Perches691e6692010-03-05 13:43:51 -0800332our $logFunctions = qr{(?x:
Joe Perches6e60c022011-07-25 17:13:27 -0700333 printk(?:_ratelimited|_once|)|
Jacob Keller7d0b6592013-07-03 15:05:35 -0700334 (?:[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 -0700335 WARN(?:_RATELIMIT|_ONCE|)|
Joe Perchesb0531722011-05-24 17:13:40 -0700336 panic|
Joe Perches06668722013-11-12 15:10:07 -0800337 MODULE_[A-Z_]+|
338 seq_vprintf|seq_printf|seq_puts
Joe Perches691e6692010-03-05 13:43:51 -0800339)};
340
Joe Perches20112472011-07-25 17:13:23 -0700341our $signature_tags = qr{(?xi:
342 Signed-off-by:|
343 Acked-by:|
344 Tested-by:|
345 Reviewed-by:|
346 Reported-by:|
Mugunthan V N8543ae12013-04-29 16:18:17 -0700347 Suggested-by:|
Joe Perches20112472011-07-25 17:13:23 -0700348 To:|
349 Cc:
350)};
351
Andy Whitcroft8905a672007-11-28 16:21:06 -0800352our @typeList = (
353 qr{void},
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700354 qr{(?:unsigned\s+)?char},
355 qr{(?:unsigned\s+)?short},
356 qr{(?:unsigned\s+)?int},
357 qr{(?:unsigned\s+)?long},
358 qr{(?:unsigned\s+)?long\s+int},
359 qr{(?:unsigned\s+)?long\s+long},
360 qr{(?:unsigned\s+)?long\s+long\s+int},
Andy Whitcroft8905a672007-11-28 16:21:06 -0800361 qr{unsigned},
362 qr{float},
363 qr{double},
364 qr{bool},
Andy Whitcroft8905a672007-11-28 16:21:06 -0800365 qr{struct\s+$Ident},
366 qr{union\s+$Ident},
367 qr{enum\s+$Ident},
368 qr{${Ident}_t},
369 qr{${Ident}_handler},
370 qr{${Ident}_handler_fn},
371);
Joe Perches8716de32013-09-11 14:24:05 -0700372our @typeListWithAttr = (
373 @typeList,
374 qr{struct\s+$InitAttribute\s+$Ident},
375 qr{union\s+$InitAttribute\s+$Ident},
376);
377
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700378our @modifierList = (
379 qr{fastcall},
380);
Andy Whitcroft8905a672007-11-28 16:21:06 -0800381
Joe Perches24358802014-04-03 14:49:13 -0700382our @mode_permission_funcs = (
383 ["module_param", 3],
384 ["module_param_(?:array|named|string)", 4],
385 ["module_param_array_named", 5],
386 ["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],
387 ["proc_create(?:_data|)", 2],
388 ["(?:CLASS|DEVICE|SENSOR)_ATTR", 2],
389);
390
Wolfram Sang7840a942010-08-09 17:20:57 -0700391our $allowed_asm_includes = qr{(?x:
392 irq|
393 memory
394)};
395# memory.h: ARM has a custom one
396
Andy Whitcroft8905a672007-11-28 16:21:06 -0800397sub build_types {
Andy Whitcroftd2172eb2008-07-23 21:29:07 -0700398 my $mods = "(?x: \n" . join("|\n ", @modifierList) . "\n)";
399 my $all = "(?x: \n" . join("|\n ", @typeList) . "\n)";
Joe Perches8716de32013-09-11 14:24:05 -0700400 my $allWithAttr = "(?x: \n" . join("|\n ", @typeListWithAttr) . "\n)";
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -0700401 $Modifier = qr{(?:$Attribute|$Sparse|$mods)};
Andy Whitcroft8905a672007-11-28 16:21:06 -0800402 $NonptrType = qr{
Andy Whitcroftd2172eb2008-07-23 21:29:07 -0700403 (?:$Modifier\s+|const\s+)*
Andy Whitcroftcf655042008-03-04 14:28:20 -0800404 (?:
Andy Whitcroft6b48db22012-01-10 15:10:13 -0800405 (?:typeof|__typeof__)\s*\([^\)]*\)|
Andy Whitcroft8ed22ca2008-10-15 22:02:32 -0700406 (?:$typeTypedefs\b)|
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700407 (?:${all}\b)
Andy Whitcroftcf655042008-03-04 14:28:20 -0800408 )
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -0700409 (?:\s+$Modifier|\s+const)*
Andy Whitcroft8905a672007-11-28 16:21:06 -0800410 }x;
Joe Perches8716de32013-09-11 14:24:05 -0700411 $NonptrTypeWithAttr = qr{
412 (?:$Modifier\s+|const\s+)*
413 (?:
414 (?:typeof|__typeof__)\s*\([^\)]*\)|
415 (?:$typeTypedefs\b)|
416 (?:${allWithAttr}\b)
417 )
418 (?:\s+$Modifier|\s+const)*
419 }x;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800420 $Type = qr{
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700421 $NonptrType
Andy Whitcroftb337d8b2012-03-23 15:02:18 -0700422 (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*|\[\])+|(?:\s*\[\s*\])+)?
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -0700423 (?:\s+$Inline|\s+$Modifier)*
Andy Whitcroft8905a672007-11-28 16:21:06 -0800424 }x;
425 $Declare = qr{(?:$Storage\s+)?$Type};
426}
427build_types();
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700428
Joe Perches7d2367a2011-07-25 17:13:22 -0700429our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
Joe Perchesd1fe9c02012-03-23 15:02:16 -0700430
431# Using $balanced_parens, $LvalOrFunc, or $FuncArg
432# requires at least perl version v5.10.0
433# Any use must be runtime checked with $^V
434
435our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
Joe Perches24358802014-04-03 14:49:13 -0700436our $LvalOrFunc = qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
Joe Perchesd7c76ba2012-01-10 15:09:58 -0800437our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};
Joe Perches7d2367a2011-07-25 17:13:22 -0700438
439sub deparenthesize {
440 my ($string) = @_;
441 return "" if (!defined($string));
442 $string =~ s@^\s*\(\s*@@g;
443 $string =~ s@\s*\)\s*$@@g;
444 $string =~ s@\s+@ @g;
445 return $string;
446}
447
Joe Perches34456862013-07-03 15:05:34 -0700448sub seed_camelcase_file {
449 my ($file) = @_;
450
451 return if (!(-f $file));
452
453 local $/;
454
455 open(my $include_file, '<', "$file")
456 or warn "$P: Can't read '$file' $!\n";
457 my $text = <$include_file>;
458 close($include_file);
459
460 my @lines = split('\n', $text);
461
462 foreach my $line (@lines) {
463 next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
464 if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
465 $camelcase{$1} = 1;
Joe Perches11ea5162013-11-12 15:10:08 -0800466 } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
467 $camelcase{$1} = 1;
468 } 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 -0700469 $camelcase{$1} = 1;
470 }
471 }
472}
473
474my $camelcase_seeded = 0;
475sub seed_camelcase_includes {
476 return if ($camelcase_seeded);
477
478 my $files;
Joe Perchesc707a812013-07-08 16:00:43 -0700479 my $camelcase_cache = "";
480 my @include_files = ();
481
482 $camelcase_seeded = 1;
Joe Perches351b2a12013-07-03 15:05:36 -0700483
Richard Genoud3645e322014-02-10 14:25:32 -0800484 if (-e ".git") {
Joe Perches351b2a12013-07-03 15:05:36 -0700485 my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
486 chomp $git_last_include_commit;
Joe Perchesc707a812013-07-08 16:00:43 -0700487 $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
Joe Perches34456862013-07-03 15:05:34 -0700488 } else {
Joe Perchesc707a812013-07-08 16:00:43 -0700489 my $last_mod_date = 0;
Joe Perches34456862013-07-03 15:05:34 -0700490 $files = `find $root/include -name "*.h"`;
Joe Perchesc707a812013-07-08 16:00:43 -0700491 @include_files = split('\n', $files);
492 foreach my $file (@include_files) {
493 my $date = POSIX::strftime("%Y%m%d%H%M",
494 localtime((stat $file)[9]));
495 $last_mod_date = $date if ($last_mod_date < $date);
496 }
497 $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
Joe Perches34456862013-07-03 15:05:34 -0700498 }
Joe Perchesc707a812013-07-08 16:00:43 -0700499
500 if ($camelcase_cache ne "" && -f $camelcase_cache) {
501 open(my $camelcase_file, '<', "$camelcase_cache")
502 or warn "$P: Can't read '$camelcase_cache' $!\n";
503 while (<$camelcase_file>) {
504 chomp;
505 $camelcase{$_} = 1;
506 }
507 close($camelcase_file);
508
509 return;
510 }
511
Richard Genoud3645e322014-02-10 14:25:32 -0800512 if (-e ".git") {
Joe Perchesc707a812013-07-08 16:00:43 -0700513 $files = `git ls-files "include/*.h"`;
514 @include_files = split('\n', $files);
515 }
516
Joe Perches34456862013-07-03 15:05:34 -0700517 foreach my $file (@include_files) {
518 seed_camelcase_file($file);
519 }
Joe Perches351b2a12013-07-03 15:05:36 -0700520
Joe Perchesc707a812013-07-08 16:00:43 -0700521 if ($camelcase_cache ne "") {
Joe Perches351b2a12013-07-03 15:05:36 -0700522 unlink glob ".checkpatch-camelcase.*";
Joe Perchesc707a812013-07-08 16:00:43 -0700523 open(my $camelcase_file, '>', "$camelcase_cache")
524 or warn "$P: Can't write '$camelcase_cache' $!\n";
Joe Perches351b2a12013-07-03 15:05:36 -0700525 foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
526 print $camelcase_file ("$_\n");
527 }
528 close($camelcase_file);
529 }
Joe Perches34456862013-07-03 15:05:34 -0700530}
531
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700532$chk_signoff = 0 if ($file);
533
Andy Whitcroft00df3442007-06-08 13:47:06 -0700534my @rawlines = ();
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800535my @lines = ();
Joe Perches3705ce52013-07-03 15:05:31 -0700536my @fixed = ();
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800537my $vname;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700538for my $filename (@ARGV) {
Andy Whitcroft21caa132009-01-06 14:41:30 -0800539 my $FILE;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700540 if ($file) {
Andy Whitcroft21caa132009-01-06 14:41:30 -0800541 open($FILE, '-|', "diff -u /dev/null $filename") ||
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700542 die "$P: $filename: diff failed - $!\n";
Andy Whitcroft21caa132009-01-06 14:41:30 -0800543 } elsif ($filename eq '-') {
544 open($FILE, '<&STDIN');
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700545 } else {
Andy Whitcroft21caa132009-01-06 14:41:30 -0800546 open($FILE, '<', "$filename") ||
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700547 die "$P: $filename: open failed - $!\n";
Andy Whitcroft0a920b52007-06-01 00:46:48 -0700548 }
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800549 if ($filename eq '-') {
550 $vname = 'Your patch';
551 } else {
552 $vname = $filename;
553 }
Andy Whitcroft21caa132009-01-06 14:41:30 -0800554 while (<$FILE>) {
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700555 chomp;
556 push(@rawlines, $_);
557 }
Andy Whitcroft21caa132009-01-06 14:41:30 -0800558 close($FILE);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800559 if (!process($filename)) {
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700560 $exit = 1;
561 }
562 @rawlines = ();
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800563 @lines = ();
Joe Perches3705ce52013-07-03 15:05:31 -0700564 @fixed = ();
Andy Whitcroft0a920b52007-06-01 00:46:48 -0700565}
566
567exit($exit);
568
569sub top_of_kernel_tree {
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700570 my ($root) = @_;
571
572 my @tree_check = (
573 "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
574 "README", "Documentation", "arch", "include", "drivers",
575 "fs", "init", "ipc", "kernel", "lib", "scripts",
576 );
577
578 foreach my $check (@tree_check) {
579 if (! -e $root . '/' . $check) {
580 return 0;
581 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -0700582 }
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700583 return 1;
Joe Perches8f26b832012-10-04 17:13:32 -0700584}
Andy Whitcroft0a920b52007-06-01 00:46:48 -0700585
Joe Perches20112472011-07-25 17:13:23 -0700586sub parse_email {
587 my ($formatted_email) = @_;
588
589 my $name = "";
590 my $address = "";
591 my $comment = "";
592
593 if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
594 $name = $1;
595 $address = $2;
596 $comment = $3 if defined $3;
597 } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
598 $address = $1;
599 $comment = $2 if defined $2;
600 } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
601 $address = $1;
602 $comment = $2 if defined $2;
603 $formatted_email =~ s/$address.*$//;
604 $name = $formatted_email;
Joe Perches3705ce52013-07-03 15:05:31 -0700605 $name = trim($name);
Joe Perches20112472011-07-25 17:13:23 -0700606 $name =~ s/^\"|\"$//g;
607 # If there's a name left after stripping spaces and
608 # leading quotes, and the address doesn't have both
609 # leading and trailing angle brackets, the address
610 # is invalid. ie:
611 # "joe smith joe@smith.com" bad
612 # "joe smith <joe@smith.com" bad
613 if ($name ne "" && $address !~ /^<[^>]+>$/) {
614 $name = "";
615 $address = "";
616 $comment = "";
617 }
618 }
619
Joe Perches3705ce52013-07-03 15:05:31 -0700620 $name = trim($name);
Joe Perches20112472011-07-25 17:13:23 -0700621 $name =~ s/^\"|\"$//g;
Joe Perches3705ce52013-07-03 15:05:31 -0700622 $address = trim($address);
Joe Perches20112472011-07-25 17:13:23 -0700623 $address =~ s/^\<|\>$//g;
624
625 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
626 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
627 $name = "\"$name\"";
628 }
629
630 return ($name, $address, $comment);
631}
632
633sub format_email {
634 my ($name, $address) = @_;
635
636 my $formatted_email;
637
Joe Perches3705ce52013-07-03 15:05:31 -0700638 $name = trim($name);
Joe Perches20112472011-07-25 17:13:23 -0700639 $name =~ s/^\"|\"$//g;
Joe Perches3705ce52013-07-03 15:05:31 -0700640 $address = trim($address);
Joe Perches20112472011-07-25 17:13:23 -0700641
642 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
643 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
644 $name = "\"$name\"";
645 }
646
647 if ("$name" eq "") {
648 $formatted_email = "$address";
649 } else {
650 $formatted_email = "$name <$address>";
651 }
652
653 return $formatted_email;
654}
655
Joe Perches000d1cc12011-07-25 17:13:25 -0700656sub which_conf {
657 my ($conf) = @_;
658
659 foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
660 if (-e "$path/$conf") {
661 return "$path/$conf";
662 }
663 }
664
665 return "";
666}
667
Andy Whitcroft0a920b52007-06-01 00:46:48 -0700668sub expand_tabs {
669 my ($str) = @_;
670
671 my $res = '';
672 my $n = 0;
673 for my $c (split(//, $str)) {
674 if ($c eq "\t") {
675 $res .= ' ';
676 $n++;
677 for (; ($n % 8) != 0; $n++) {
678 $res .= ' ';
679 }
680 next;
681 }
682 $res .= $c;
683 $n++;
684 }
685
686 return $res;
687}
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700688sub copy_spacing {
Andy Whitcroft773647a2008-03-28 14:15:58 -0700689 (my $res = shift) =~ tr/\t/ /c;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700690 return $res;
691}
Andy Whitcroft0a920b52007-06-01 00:46:48 -0700692
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -0700693sub line_stats {
694 my ($line) = @_;
695
696 # Drop the diff line leader and expand tabs
697 $line =~ s/^.//;
698 $line = expand_tabs($line);
699
700 # Pick the indent from the front of the line.
701 my ($white) = ($line =~ /^(\s*)/);
702
703 return (length($line), length($white));
704}
705
Andy Whitcroft773647a2008-03-28 14:15:58 -0700706my $sanitise_quote = '';
707
708sub sanitise_line_reset {
709 my ($in_comment) = @_;
710
711 if ($in_comment) {
712 $sanitise_quote = '*/';
713 } else {
714 $sanitise_quote = '';
715 }
716}
Andy Whitcroft00df3442007-06-08 13:47:06 -0700717sub sanitise_line {
718 my ($line) = @_;
719
720 my $res = '';
721 my $l = '';
722
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800723 my $qlen = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -0700724 my $off = 0;
725 my $c;
Andy Whitcroft00df3442007-06-08 13:47:06 -0700726
Andy Whitcroft773647a2008-03-28 14:15:58 -0700727 # Always copy over the diff marker.
728 $res = substr($line, 0, 1);
729
730 for ($off = 1; $off < length($line); $off++) {
731 $c = substr($line, $off, 1);
732
733 # Comments we are wacking completly including the begin
734 # and end, all to $;.
735 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
736 $sanitise_quote = '*/';
737
738 substr($res, $off, 2, "$;$;");
739 $off++;
740 next;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800741 }
Andy Whitcroft81bc0e02008-10-15 22:02:26 -0700742 if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
Andy Whitcroft773647a2008-03-28 14:15:58 -0700743 $sanitise_quote = '';
744 substr($res, $off, 2, "$;$;");
745 $off++;
746 next;
747 }
Daniel Walker113f04a2009-09-21 17:04:35 -0700748 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
749 $sanitise_quote = '//';
750
751 substr($res, $off, 2, $sanitise_quote);
752 $off++;
753 next;
754 }
Andy Whitcroft773647a2008-03-28 14:15:58 -0700755
756 # A \ in a string means ignore the next character.
757 if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
758 $c eq "\\") {
759 substr($res, $off, 2, 'XX');
760 $off++;
761 next;
762 }
763 # Regular quotes.
764 if ($c eq "'" || $c eq '"') {
765 if ($sanitise_quote eq '') {
766 $sanitise_quote = $c;
767
768 substr($res, $off, 1, $c);
Andy Whitcroft00df3442007-06-08 13:47:06 -0700769 next;
Andy Whitcroft773647a2008-03-28 14:15:58 -0700770 } elsif ($sanitise_quote eq $c) {
771 $sanitise_quote = '';
Andy Whitcroft00df3442007-06-08 13:47:06 -0700772 }
773 }
Andy Whitcroft773647a2008-03-28 14:15:58 -0700774
Andy Whitcroftfae17da2009-01-06 14:41:20 -0800775 #print "c<$c> SQ<$sanitise_quote>\n";
Andy Whitcroft773647a2008-03-28 14:15:58 -0700776 if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
777 substr($res, $off, 1, $;);
Daniel Walker113f04a2009-09-21 17:04:35 -0700778 } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
779 substr($res, $off, 1, $;);
Andy Whitcroft773647a2008-03-28 14:15:58 -0700780 } elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
781 substr($res, $off, 1, 'X');
Andy Whitcroft00df3442007-06-08 13:47:06 -0700782 } else {
Andy Whitcroft773647a2008-03-28 14:15:58 -0700783 substr($res, $off, 1, $c);
Andy Whitcroft00df3442007-06-08 13:47:06 -0700784 }
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800785 }
786
Daniel Walker113f04a2009-09-21 17:04:35 -0700787 if ($sanitise_quote eq '//') {
788 $sanitise_quote = '';
789 }
790
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800791 # The pathname on a #include may be surrounded by '<' and '>'.
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700792 if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800793 my $clean = 'X' x length($1);
794 $res =~ s@\<.*\>@<$clean>@;
795
796 # The whole of a #error is a string.
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700797 } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800798 my $clean = 'X' x length($1);
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700799 $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800800 }
801
Andy Whitcroft00df3442007-06-08 13:47:06 -0700802 return $res;
803}
804
Joe Perchesa6962d72013-04-29 16:18:13 -0700805sub get_quoted_string {
806 my ($line, $rawline) = @_;
807
808 return "" if ($line !~ m/(\"[X]+\")/g);
809 return substr($rawline, $-[0], $+[0] - $-[0]);
810}
811
Andy Whitcroft8905a672007-11-28 16:21:06 -0800812sub ctx_statement_block {
813 my ($linenr, $remain, $off) = @_;
814 my $line = $linenr - 1;
815 my $blk = '';
816 my $soff = $off;
817 my $coff = $off - 1;
Andy Whitcroft773647a2008-03-28 14:15:58 -0700818 my $coff_set = 0;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800819
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800820 my $loff = 0;
821
Andy Whitcroft8905a672007-11-28 16:21:06 -0800822 my $type = '';
823 my $level = 0;
Andy Whitcrofta2750642009-01-15 13:51:04 -0800824 my @stack = ();
Andy Whitcroftcf655042008-03-04 14:28:20 -0800825 my $p;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800826 my $c;
827 my $len = 0;
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800828
829 my $remainder;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800830 while (1) {
Andy Whitcrofta2750642009-01-15 13:51:04 -0800831 @stack = (['', 0]) if ($#stack == -1);
832
Andy Whitcroft773647a2008-03-28 14:15:58 -0700833 #warn "CSB: blk<$blk> remain<$remain>\n";
Andy Whitcroft8905a672007-11-28 16:21:06 -0800834 # If we are about to drop off the end, pull in more
835 # context.
836 if ($off >= $len) {
837 for (; $remain > 0; $line++) {
Andy Whitcroftdea33492008-10-15 22:02:25 -0700838 last if (!defined $lines[$line]);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800839 next if ($lines[$line] =~ /^-/);
Andy Whitcroft8905a672007-11-28 16:21:06 -0800840 $remain--;
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800841 $loff = $len;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800842 $blk .= $lines[$line] . "\n";
Andy Whitcroft8905a672007-11-28 16:21:06 -0800843 $len = length($blk);
844 $line++;
845 last;
846 }
847 # Bail if there is no further context.
848 #warn "CSB: blk<$blk> off<$off> len<$len>\n";
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800849 if ($off >= $len) {
Andy Whitcroft8905a672007-11-28 16:21:06 -0800850 last;
851 }
Andy Whitcroftf74bd192012-01-10 15:09:54 -0800852 if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
853 $level++;
854 $type = '#';
855 }
Andy Whitcroft8905a672007-11-28 16:21:06 -0800856 }
Andy Whitcroftcf655042008-03-04 14:28:20 -0800857 $p = $c;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800858 $c = substr($blk, $off, 1);
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800859 $remainder = substr($blk, $off);
Andy Whitcroft8905a672007-11-28 16:21:06 -0800860
Andy Whitcroft773647a2008-03-28 14:15:58 -0700861 #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
Andy Whitcroft4635f4f2009-01-06 14:41:27 -0800862
863 # Handle nested #if/#else.
864 if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
865 push(@stack, [ $type, $level ]);
866 } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
867 ($type, $level) = @{$stack[$#stack - 1]};
868 } elsif ($remainder =~ /^#\s*endif\b/) {
869 ($type, $level) = @{pop(@stack)};
870 }
871
Andy Whitcroft8905a672007-11-28 16:21:06 -0800872 # Statement ends at the ';' or a close '}' at the
873 # outermost level.
874 if ($level == 0 && $c eq ';') {
875 last;
876 }
877
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800878 # An else is really a conditional as long as its not else if
Andy Whitcroft773647a2008-03-28 14:15:58 -0700879 if ($level == 0 && $coff_set == 0 &&
880 (!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
881 $remainder =~ /^(else)(?:\s|{)/ &&
882 $remainder !~ /^else\s+if\b/) {
883 $coff = $off + length($1) - 1;
884 $coff_set = 1;
885 #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
886 #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800887 }
888
Andy Whitcroft8905a672007-11-28 16:21:06 -0800889 if (($type eq '' || $type eq '(') && $c eq '(') {
890 $level++;
891 $type = '(';
892 }
893 if ($type eq '(' && $c eq ')') {
894 $level--;
895 $type = ($level != 0)? '(' : '';
896
897 if ($level == 0 && $coff < $soff) {
898 $coff = $off;
Andy Whitcroft773647a2008-03-28 14:15:58 -0700899 $coff_set = 1;
900 #warn "CSB: mark coff<$coff>\n";
Andy Whitcroft8905a672007-11-28 16:21:06 -0800901 }
902 }
903 if (($type eq '' || $type eq '{') && $c eq '{') {
904 $level++;
905 $type = '{';
906 }
907 if ($type eq '{' && $c eq '}') {
908 $level--;
909 $type = ($level != 0)? '{' : '';
910
911 if ($level == 0) {
Patrick Pannutob998e002010-08-09 17:21:03 -0700912 if (substr($blk, $off + 1, 1) eq ';') {
913 $off++;
914 }
Andy Whitcroft8905a672007-11-28 16:21:06 -0800915 last;
916 }
917 }
Andy Whitcroftf74bd192012-01-10 15:09:54 -0800918 # Preprocessor commands end at the newline unless escaped.
919 if ($type eq '#' && $c eq "\n" && $p ne "\\") {
920 $level--;
921 $type = '';
922 $off++;
923 last;
924 }
Andy Whitcroft8905a672007-11-28 16:21:06 -0800925 $off++;
926 }
Andy Whitcrofta3bb97a2008-07-23 21:29:00 -0700927 # We are truly at the end, so shuffle to the next line.
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800928 if ($off == $len) {
Andy Whitcrofta3bb97a2008-07-23 21:29:00 -0700929 $loff = $len + 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800930 $line++;
931 $remain--;
932 }
Andy Whitcroft8905a672007-11-28 16:21:06 -0800933
934 my $statement = substr($blk, $soff, $off - $soff + 1);
935 my $condition = substr($blk, $soff, $coff - $soff + 1);
936
937 #warn "STATEMENT<$statement>\n";
938 #warn "CONDITION<$condition>\n";
939
Andy Whitcroft773647a2008-03-28 14:15:58 -0700940 #print "coff<$coff> soff<$off> loff<$loff>\n";
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800941
942 return ($statement, $condition,
943 $line, $remain + 1, $off - $loff + 1, $level);
944}
945
Andy Whitcroftcf655042008-03-04 14:28:20 -0800946sub statement_lines {
947 my ($stmt) = @_;
948
949 # Strip the diff line prefixes and rip blank lines at start and end.
950 $stmt =~ s/(^|\n)./$1/g;
951 $stmt =~ s/^\s*//;
952 $stmt =~ s/\s*$//;
953
954 my @stmt_lines = ($stmt =~ /\n/g);
955
956 return $#stmt_lines + 2;
957}
958
959sub statement_rawlines {
960 my ($stmt) = @_;
961
962 my @stmt_lines = ($stmt =~ /\n/g);
963
964 return $#stmt_lines + 2;
965}
966
967sub statement_block_size {
968 my ($stmt) = @_;
969
970 $stmt =~ s/(^|\n)./$1/g;
971 $stmt =~ s/^\s*{//;
972 $stmt =~ s/}\s*$//;
973 $stmt =~ s/^\s*//;
974 $stmt =~ s/\s*$//;
975
976 my @stmt_lines = ($stmt =~ /\n/g);
977 my @stmt_statements = ($stmt =~ /;/g);
978
979 my $stmt_lines = $#stmt_lines + 2;
980 my $stmt_statements = $#stmt_statements + 1;
981
982 if ($stmt_lines > $stmt_statements) {
983 return $stmt_lines;
984 } else {
985 return $stmt_statements;
986 }
987}
988
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800989sub ctx_statement_full {
990 my ($linenr, $remain, $off) = @_;
991 my ($statement, $condition, $level);
992
993 my (@chunks);
994
Andy Whitcroftcf655042008-03-04 14:28:20 -0800995 # Grab the first conditional/block pair.
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800996 ($statement, $condition, $linenr, $remain, $off, $level) =
997 ctx_statement_block($linenr, $remain, $off);
Andy Whitcroft773647a2008-03-28 14:15:58 -0700998 #print "F: c<$condition> s<$statement> remain<$remain>\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -0800999 push(@chunks, [ $condition, $statement ]);
1000 if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
1001 return ($level, $linenr, @chunks);
1002 }
1003
1004 # Pull in the following conditional/block pairs and see if they
1005 # could continue the statement.
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001006 for (;;) {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001007 ($statement, $condition, $linenr, $remain, $off, $level) =
1008 ctx_statement_block($linenr, $remain, $off);
Andy Whitcroftcf655042008-03-04 14:28:20 -08001009 #print "C: c<$condition> s<$statement> remain<$remain>\n";
Andy Whitcroft773647a2008-03-28 14:15:58 -07001010 last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
Andy Whitcroftcf655042008-03-04 14:28:20 -08001011 #print "C: push\n";
1012 push(@chunks, [ $condition, $statement ]);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001013 }
1014
1015 return ($level, $linenr, @chunks);
Andy Whitcroft8905a672007-11-28 16:21:06 -08001016}
1017
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001018sub ctx_block_get {
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001019 my ($linenr, $remain, $outer, $open, $close, $off) = @_;
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001020 my $line;
1021 my $start = $linenr - 1;
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001022 my $blk = '';
1023 my @o;
1024 my @c;
1025 my @res = ();
1026
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001027 my $level = 0;
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001028 my @stack = ($level);
Andy Whitcroft00df3442007-06-08 13:47:06 -07001029 for ($line = $start; $remain > 0; $line++) {
1030 next if ($rawlines[$line] =~ /^-/);
1031 $remain--;
1032
1033 $blk .= $rawlines[$line];
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001034
1035 # Handle nested #if/#else.
Andy Whitcroft01464f32010-10-26 14:23:19 -07001036 if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001037 push(@stack, $level);
Andy Whitcroft01464f32010-10-26 14:23:19 -07001038 } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001039 $level = $stack[$#stack - 1];
Andy Whitcroft01464f32010-10-26 14:23:19 -07001040 } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001041 $level = pop(@stack);
1042 }
1043
Andy Whitcroft01464f32010-10-26 14:23:19 -07001044 foreach my $c (split(//, $lines[$line])) {
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001045 ##print "C<$c>L<$level><$open$close>O<$off>\n";
1046 if ($off > 0) {
1047 $off--;
1048 next;
1049 }
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001050
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001051 if ($c eq $close && $level > 0) {
1052 $level--;
1053 last if ($level == 0);
1054 } elsif ($c eq $open) {
1055 $level++;
1056 }
1057 }
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001058
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001059 if (!$outer || $level <= 1) {
Andy Whitcroft00df3442007-06-08 13:47:06 -07001060 push(@res, $rawlines[$line]);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001061 }
1062
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001063 last if ($level == 0);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001064 }
1065
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001066 return ($level, @res);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001067}
1068sub ctx_block_outer {
1069 my ($linenr, $remain) = @_;
1070
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001071 my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
1072 return @r;
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001073}
1074sub ctx_block {
1075 my ($linenr, $remain) = @_;
1076
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001077 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1078 return @r;
Andy Whitcroft653d4872007-06-23 17:16:34 -07001079}
1080sub ctx_statement {
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001081 my ($linenr, $remain, $off) = @_;
1082
1083 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1084 return @r;
1085}
1086sub ctx_block_level {
Andy Whitcroft653d4872007-06-23 17:16:34 -07001087 my ($linenr, $remain) = @_;
1088
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001089 return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001090}
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001091sub ctx_statement_level {
1092 my ($linenr, $remain, $off) = @_;
1093
1094 return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1095}
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001096
1097sub ctx_locate_comment {
1098 my ($first_line, $end_line) = @_;
1099
1100 # Catch a comment on the end of the line itself.
Andy Whitcroftbeae6332008-07-23 21:28:59 -07001101 my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001102 return $current_comment if (defined $current_comment);
1103
1104 # Look through the context and try and figure out if there is a
1105 # comment.
1106 my $in_comment = 0;
1107 $current_comment = '';
1108 for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
Andy Whitcroft00df3442007-06-08 13:47:06 -07001109 my $line = $rawlines[$linenr - 1];
1110 #warn " $line\n";
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001111 if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
1112 $in_comment = 1;
1113 }
1114 if ($line =~ m@/\*@) {
1115 $in_comment = 1;
1116 }
1117 if (!$in_comment && $current_comment ne '') {
1118 $current_comment = '';
1119 }
1120 $current_comment .= $line . "\n" if ($in_comment);
1121 if ($line =~ m@\*/@) {
1122 $in_comment = 0;
1123 }
1124 }
1125
1126 chomp($current_comment);
1127 return($current_comment);
1128}
1129sub ctx_has_comment {
1130 my ($first_line, $end_line) = @_;
1131 my $cmt = ctx_locate_comment($first_line, $end_line);
1132
Andy Whitcroft00df3442007-06-08 13:47:06 -07001133 ##print "LINE: $rawlines[$end_line - 1 ]\n";
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001134 ##print "CMMT: $cmt\n";
1135
1136 return ($cmt ne '');
1137}
1138
Andy Whitcroft4d001e42008-10-15 22:02:21 -07001139sub raw_line {
1140 my ($linenr, $cnt) = @_;
1141
1142 my $offset = $linenr - 1;
1143 $cnt++;
1144
1145 my $line;
1146 while ($cnt) {
1147 $line = $rawlines[$offset++];
1148 next if (defined($line) && $line =~ /^-/);
1149 $cnt--;
1150 }
1151
1152 return $line;
1153}
1154
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001155sub cat_vet {
1156 my ($vet) = @_;
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001157 my ($res, $coded);
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001158
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001159 $res = '';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001160 while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
1161 $res .= $1;
1162 if ($2 ne '') {
1163 $coded = sprintf("^%c", unpack('C', $2) + 64);
1164 $res .= $coded;
1165 }
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001166 }
1167 $res =~ s/$/\$/;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001168
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001169 return $res;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001170}
1171
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001172my $av_preprocessor = 0;
Andy Whitcroftcf655042008-03-04 14:28:20 -08001173my $av_pending;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001174my @av_paren_type;
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001175my $av_pend_colon;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001176
1177sub annotate_reset {
1178 $av_preprocessor = 0;
Andy Whitcroftcf655042008-03-04 14:28:20 -08001179 $av_pending = '_';
1180 @av_paren_type = ('E');
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001181 $av_pend_colon = 'O';
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001182}
1183
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001184sub annotate_values {
1185 my ($stream, $type) = @_;
1186
1187 my $res;
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001188 my $var = '_' x length($stream);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001189 my $cur = $stream;
1190
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001191 print "$stream\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001192
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001193 while (length($cur)) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001194 @av_paren_type = ('E') if ($#av_paren_type < 0);
Andy Whitcroftcf655042008-03-04 14:28:20 -08001195 print " <" . join('', @av_paren_type) .
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001196 "> <$type> <$av_pending>" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001197 if ($cur =~ /^(\s+)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001198 print "WS($1)\n" if ($dbg_values > 1);
1199 if ($1 =~ /\n/ && $av_preprocessor) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001200 $type = pop(@av_paren_type);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001201 $av_preprocessor = 0;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001202 }
1203
Florian Micklerc023e4732011-01-12 16:59:58 -08001204 } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
Andy Whitcroft9446ef52010-10-26 14:23:13 -07001205 print "CAST($1)\n" if ($dbg_values > 1);
1206 push(@av_paren_type, $type);
Andy Whitcroftaddcdce2012-01-10 15:10:11 -08001207 $type = 'c';
Andy Whitcroft9446ef52010-10-26 14:23:13 -07001208
Andy Whitcrofte91b6e22010-10-26 14:23:11 -07001209 } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001210 print "DECLARE($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001211 $type = 'T';
1212
Andy Whitcroft389a2fe2008-07-23 21:29:05 -07001213 } elsif ($cur =~ /^($Modifier)\s*/) {
1214 print "MODIFIER($1)\n" if ($dbg_values > 1);
1215 $type = 'T';
1216
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001217 } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001218 print "DEFINE($1,$2)\n" if ($dbg_values > 1);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001219 $av_preprocessor = 1;
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001220 push(@av_paren_type, $type);
1221 if ($2 ne '') {
1222 $av_pending = 'N';
1223 }
1224 $type = 'E';
1225
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001226 } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001227 print "UNDEF($1)\n" if ($dbg_values > 1);
1228 $av_preprocessor = 1;
1229 push(@av_paren_type, $type);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001230
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001231 } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001232 print "PRE_START($1)\n" if ($dbg_values > 1);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001233 $av_preprocessor = 1;
Andy Whitcroftcf655042008-03-04 14:28:20 -08001234
1235 push(@av_paren_type, $type);
1236 push(@av_paren_type, $type);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001237 $type = 'E';
Andy Whitcroftcf655042008-03-04 14:28:20 -08001238
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001239 } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001240 print "PRE_RESTART($1)\n" if ($dbg_values > 1);
1241 $av_preprocessor = 1;
1242
1243 push(@av_paren_type, $av_paren_type[$#av_paren_type]);
1244
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001245 $type = 'E';
Andy Whitcroftcf655042008-03-04 14:28:20 -08001246
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001247 } elsif ($cur =~ /^(\#\s*(?:endif))/o) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001248 print "PRE_END($1)\n" if ($dbg_values > 1);
1249
1250 $av_preprocessor = 1;
1251
1252 # Assume all arms of the conditional end as this
1253 # one does, and continue as if the #endif was not here.
1254 pop(@av_paren_type);
1255 push(@av_paren_type, $type);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001256 $type = 'E';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001257
1258 } elsif ($cur =~ /^(\\\n)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001259 print "PRECONT($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001260
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001261 } elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
1262 print "ATTR($1)\n" if ($dbg_values > 1);
1263 $av_pending = $type;
1264 $type = 'N';
1265
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001266 } elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001267 print "SIZEOF($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001268 if (defined $2) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001269 $av_pending = 'V';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001270 }
1271 $type = 'N';
1272
Andy Whitcroft14b111c2008-10-15 22:02:16 -07001273 } elsif ($cur =~ /^(if|while|for)\b/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001274 print "COND($1)\n" if ($dbg_values > 1);
Andy Whitcroft14b111c2008-10-15 22:02:16 -07001275 $av_pending = 'E';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001276 $type = 'N';
1277
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001278 } elsif ($cur =~/^(case)/o) {
1279 print "CASE($1)\n" if ($dbg_values > 1);
1280 $av_pend_colon = 'C';
1281 $type = 'N';
1282
Andy Whitcroft14b111c2008-10-15 22:02:16 -07001283 } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001284 print "KEYWORD($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001285 $type = 'N';
1286
1287 } elsif ($cur =~ /^(\()/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001288 print "PAREN('$1')\n" if ($dbg_values > 1);
Andy Whitcroftcf655042008-03-04 14:28:20 -08001289 push(@av_paren_type, $av_pending);
1290 $av_pending = '_';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001291 $type = 'N';
1292
1293 } elsif ($cur =~ /^(\))/o) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001294 my $new_type = pop(@av_paren_type);
1295 if ($new_type ne '_') {
1296 $type = $new_type;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001297 print "PAREN('$1') -> $type\n"
1298 if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001299 } else {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001300 print "PAREN('$1')\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001301 }
1302
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -07001303 } elsif ($cur =~ /^($Ident)\s*\(/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001304 print "FUNC($1)\n" if ($dbg_values > 1);
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -07001305 $type = 'V';
Andy Whitcroftcf655042008-03-04 14:28:20 -08001306 $av_pending = 'V';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001307
Andy Whitcroft8e761b02009-01-06 14:41:19 -08001308 } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
1309 if (defined $2 && $type eq 'C' || $type eq 'T') {
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001310 $av_pend_colon = 'B';
Andy Whitcroft8e761b02009-01-06 14:41:19 -08001311 } elsif ($type eq 'E') {
1312 $av_pend_colon = 'L';
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001313 }
1314 print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
1315 $type = 'V';
1316
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001317 } elsif ($cur =~ /^($Ident|$Constant)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001318 print "IDENT($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001319 $type = 'V';
1320
1321 } elsif ($cur =~ /^($Assignment)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001322 print "ASSIGN($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001323 $type = 'N';
1324
Andy Whitcroftcf655042008-03-04 14:28:20 -08001325 } elsif ($cur =~/^(;|{|})/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001326 print "END($1)\n" if ($dbg_values > 1);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001327 $type = 'E';
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001328 $av_pend_colon = 'O';
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001329
Andy Whitcroft8e761b02009-01-06 14:41:19 -08001330 } elsif ($cur =~/^(,)/) {
1331 print "COMMA($1)\n" if ($dbg_values > 1);
1332 $type = 'C';
1333
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001334 } elsif ($cur =~ /^(\?)/o) {
1335 print "QUESTION($1)\n" if ($dbg_values > 1);
1336 $type = 'N';
1337
1338 } elsif ($cur =~ /^(:)/o) {
1339 print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
1340
1341 substr($var, length($res), 1, $av_pend_colon);
1342 if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
1343 $type = 'E';
1344 } else {
1345 $type = 'N';
1346 }
1347 $av_pend_colon = 'O';
1348
Andy Whitcroft8e761b02009-01-06 14:41:19 -08001349 } elsif ($cur =~ /^(\[)/o) {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001350 print "CLOSE($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001351 $type = 'N';
1352
Andy Whitcroft0d413862008-10-15 22:02:16 -07001353 } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
Andy Whitcroft74048ed2008-07-23 21:29:10 -07001354 my $variant;
1355
1356 print "OPV($1)\n" if ($dbg_values > 1);
1357 if ($type eq 'V') {
1358 $variant = 'B';
1359 } else {
1360 $variant = 'U';
1361 }
1362
1363 substr($var, length($res), 1, $variant);
1364 $type = 'N';
1365
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001366 } elsif ($cur =~ /^($Operators)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001367 print "OP($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001368 if ($1 ne '++' && $1 ne '--') {
1369 $type = 'N';
1370 }
1371
1372 } elsif ($cur =~ /(^.)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001373 print "C($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001374 }
1375 if (defined $1) {
1376 $cur = substr($cur, length($1));
1377 $res .= $type x length($1);
1378 }
1379 }
1380
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001381 return ($res, $var);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001382}
1383
Andy Whitcroft8905a672007-11-28 16:21:06 -08001384sub possible {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001385 my ($possible, $line) = @_;
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001386 my $notPermitted = qr{(?:
Andy Whitcroft0776e592008-10-15 22:02:29 -07001387 ^(?:
1388 $Modifier|
1389 $Storage|
1390 $Type|
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001391 DEFINE_\S+
1392 )$|
1393 ^(?:
Andy Whitcroft0776e592008-10-15 22:02:29 -07001394 goto|
1395 return|
1396 case|
1397 else|
1398 asm|__asm__|
Andy Whitcroft89a88352012-01-10 15:10:00 -08001399 do|
1400 \#|
1401 \#\#|
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001402 )(?:\s|$)|
Andy Whitcroft0776e592008-10-15 22:02:29 -07001403 ^(?:typedef|struct|enum)\b
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001404 )}x;
1405 warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
1406 if ($possible !~ $notPermitted) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001407 # Check for modifiers.
1408 $possible =~ s/\s*$Storage\s*//g;
1409 $possible =~ s/\s*$Sparse\s*//g;
1410 if ($possible =~ /^\s*$/) {
1411
1412 } elsif ($possible =~ /\s/) {
1413 $possible =~ s/\s*$Type\s*//g;
Andy Whitcroftd2506582008-07-23 21:29:09 -07001414 for my $modifier (split(' ', $possible)) {
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001415 if ($modifier !~ $notPermitted) {
1416 warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
1417 push(@modifierList, $modifier);
1418 }
Andy Whitcroftd2506582008-07-23 21:29:09 -07001419 }
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001420
1421 } else {
1422 warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
1423 push(@typeList, $possible);
1424 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08001425 build_types();
Andy Whitcroft0776e592008-10-15 22:02:29 -07001426 } else {
1427 warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
Andy Whitcroft8905a672007-11-28 16:21:06 -08001428 }
1429}
1430
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001431my $prefix = '';
1432
Joe Perches000d1cc12011-07-25 17:13:25 -07001433sub show_type {
Joe Perchescbec18a2014-04-03 14:49:19 -07001434 my ($type) = @_;
Joe Perches91bfe482013-09-11 14:23:59 -07001435
Joe Perchescbec18a2014-04-03 14:49:19 -07001436 return defined $use_type{$type} if (scalar keys %use_type > 0);
1437
1438 return !defined $ignore_type{$type};
Joe Perches000d1cc12011-07-25 17:13:25 -07001439}
1440
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001441sub report {
Joe Perchescbec18a2014-04-03 14:49:19 -07001442 my ($level, $type, $msg) = @_;
1443
1444 if (!show_type($type) ||
1445 (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001446 return 0;
1447 }
Joe Perches000d1cc12011-07-25 17:13:25 -07001448 my $line;
1449 if ($show_types) {
Joe Perchescbec18a2014-04-03 14:49:19 -07001450 $line = "$prefix$level:$type: $msg\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07001451 } else {
Joe Perchescbec18a2014-04-03 14:49:19 -07001452 $line = "$prefix$level: $msg\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07001453 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08001454 $line = (split('\n', $line))[0] . "\n" if ($terse);
1455
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001456 push(our @report, $line);
Andy Whitcroft773647a2008-03-28 14:15:58 -07001457
1458 return 1;
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001459}
Joe Perchescbec18a2014-04-03 14:49:19 -07001460
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001461sub report_dump {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001462 our @report;
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001463}
Joe Perches000d1cc12011-07-25 17:13:25 -07001464
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001465sub ERROR {
Joe Perchescbec18a2014-04-03 14:49:19 -07001466 my ($type, $msg) = @_;
1467
1468 if (report("ERROR", $type, $msg)) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001469 our $clean = 0;
1470 our $cnt_error++;
Joe Perches3705ce52013-07-03 15:05:31 -07001471 return 1;
Andy Whitcroft773647a2008-03-28 14:15:58 -07001472 }
Joe Perches3705ce52013-07-03 15:05:31 -07001473 return 0;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001474}
1475sub WARN {
Joe Perchescbec18a2014-04-03 14:49:19 -07001476 my ($type, $msg) = @_;
1477
1478 if (report("WARNING", $type, $msg)) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001479 our $clean = 0;
1480 our $cnt_warn++;
Joe Perches3705ce52013-07-03 15:05:31 -07001481 return 1;
Andy Whitcroft773647a2008-03-28 14:15:58 -07001482 }
Joe Perches3705ce52013-07-03 15:05:31 -07001483 return 0;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001484}
1485sub CHK {
Joe Perchescbec18a2014-04-03 14:49:19 -07001486 my ($type, $msg) = @_;
1487
1488 if ($check && report("CHECK", $type, $msg)) {
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001489 our $clean = 0;
1490 our $cnt_chk++;
Joe Perches3705ce52013-07-03 15:05:31 -07001491 return 1;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001492 }
Joe Perches3705ce52013-07-03 15:05:31 -07001493 return 0;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001494}
1495
Andy Whitcroft6ecd9672008-10-15 22:02:21 -07001496sub check_absolute_file {
1497 my ($absolute, $herecurr) = @_;
1498 my $file = $absolute;
1499
1500 ##print "absolute<$absolute>\n";
1501
1502 # See if any suffix of this path is a path within the tree.
1503 while ($file =~ s@^[^/]*/@@) {
1504 if (-f "$root/$file") {
1505 ##print "file<$file>\n";
1506 last;
1507 }
1508 }
1509 if (! -f _) {
1510 return 0;
1511 }
1512
1513 # It is, so see if the prefix is acceptable.
1514 my $prefix = $absolute;
1515 substr($prefix, -length($file)) = '';
1516
1517 ##print "prefix<$prefix>\n";
1518 if ($prefix ne ".../") {
Joe Perches000d1cc12011-07-25 17:13:25 -07001519 WARN("USE_RELATIVE_PATH",
1520 "use relative pathname instead of absolute in changelog text\n" . $herecurr);
Andy Whitcroft6ecd9672008-10-15 22:02:21 -07001521 }
1522}
1523
Joe Perches3705ce52013-07-03 15:05:31 -07001524sub trim {
1525 my ($string) = @_;
1526
Joe Perchesb34c6482013-09-11 14:24:01 -07001527 $string =~ s/^\s+|\s+$//g;
1528
1529 return $string;
1530}
1531
1532sub ltrim {
1533 my ($string) = @_;
1534
1535 $string =~ s/^\s+//;
1536
1537 return $string;
1538}
1539
1540sub rtrim {
1541 my ($string) = @_;
1542
1543 $string =~ s/\s+$//;
Joe Perches3705ce52013-07-03 15:05:31 -07001544
1545 return $string;
1546}
1547
Joe Perches52ea8502013-11-12 15:10:09 -08001548sub string_find_replace {
1549 my ($string, $find, $replace) = @_;
1550
1551 $string =~ s/$find/$replace/g;
1552
1553 return $string;
1554}
1555
Joe Perches3705ce52013-07-03 15:05:31 -07001556sub tabify {
1557 my ($leading) = @_;
1558
1559 my $source_indent = 8;
1560 my $max_spaces_before_tab = $source_indent - 1;
1561 my $spaces_to_tab = " " x $source_indent;
1562
1563 #convert leading spaces to tabs
1564 1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
1565 #Remove spaces before a tab
1566 1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
1567
1568 return "$leading";
1569}
1570
Joe Perchesd1fe9c02012-03-23 15:02:16 -07001571sub pos_last_openparen {
1572 my ($line) = @_;
1573
1574 my $pos = 0;
1575
1576 my $opens = $line =~ tr/\(/\(/;
1577 my $closes = $line =~ tr/\)/\)/;
1578
1579 my $last_openparen = 0;
1580
1581 if (($opens == 0) || ($closes >= $opens)) {
1582 return -1;
1583 }
1584
1585 my $len = length($line);
1586
1587 for ($pos = 0; $pos < $len; $pos++) {
1588 my $string = substr($line, $pos);
1589 if ($string =~ /^($FuncArg|$balanced_parens)/) {
1590 $pos += length($1) - 1;
1591 } elsif (substr($line, $pos, 1) eq '(') {
1592 $last_openparen = $pos;
1593 } elsif (index($string, '(') == -1) {
1594 last;
1595 }
1596 }
1597
1598 return $last_openparen + 1;
1599}
1600
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001601sub process {
1602 my $filename = shift;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001603
1604 my $linenr=0;
1605 my $prevline="";
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001606 my $prevrawline="";
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001607 my $stashline="";
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001608 my $stashrawline="";
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001609
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001610 my $length;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001611 my $indent;
1612 my $previndent=0;
1613 my $stashindent=0;
1614
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001615 our $clean = 1;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001616 my $signoff = 0;
1617 my $is_patch = 0;
1618
Joe Perches15662b32011-10-31 17:13:12 -07001619 my $in_header_lines = 1;
1620 my $in_commit_log = 0; #Scanning lines before patch
1621
Pasi Savanainenfa64205d2012-10-04 17:13:29 -07001622 my $non_utf8_charset = 0;
1623
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001624 our @report = ();
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001625 our $cnt_lines = 0;
1626 our $cnt_error = 0;
1627 our $cnt_warn = 0;
1628 our $cnt_chk = 0;
1629
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001630 # Trace the real file/line as we go.
1631 my $realfile = '';
1632 my $realline = 0;
1633 my $realcnt = 0;
1634 my $here = '';
1635 my $in_comment = 0;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001636 my $comment_edge = 0;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001637 my $first_line = 0;
Wolfram Sang1e855722009-01-06 14:41:24 -08001638 my $p1_prefix = '';
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001639
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001640 my $prev_values = 'E';
1641
1642 # suppression flags
Andy Whitcroft773647a2008-03-28 14:15:58 -07001643 my %suppress_ifbraces;
Andy Whitcroft170d3a22008-10-15 22:02:30 -07001644 my %suppress_whiletrailers;
Andy Whitcroft2b474a12009-10-26 16:50:16 -07001645 my %suppress_export;
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08001646 my $suppress_statement = 0;
Andy Whitcroft653d4872007-06-23 17:16:34 -07001647
Joe Perches7e51f192013-09-11 14:23:57 -07001648 my %signatures = ();
Joe Perches323c1262012-12-17 16:02:07 -08001649
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001650 # Pre-scan the patch sanitizing the lines.
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001651 # Pre-scan the patch looking for any __setup documentation.
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001652 #
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001653 my @setup_docs = ();
1654 my $setup_docs = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -07001655
Joe Perchesd8b07712013-11-12 15:10:06 -08001656 my $camelcase_file_seeded = 0;
1657
Andy Whitcroft773647a2008-03-28 14:15:58 -07001658 sanitise_line_reset();
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001659 my $line;
1660 foreach my $rawline (@rawlines) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001661 $linenr++;
1662 $line = $rawline;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001663
Joe Perches3705ce52013-07-03 15:05:31 -07001664 push(@fixed, $rawline) if ($fix);
1665
Andy Whitcroft773647a2008-03-28 14:15:58 -07001666 if ($rawline=~/^\+\+\+\s+(\S+)/) {
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001667 $setup_docs = 0;
1668 if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
1669 $setup_docs = 1;
1670 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07001671 #next;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001672 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07001673 if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
1674 $realline=$1-1;
1675 if (defined $2) {
1676 $realcnt=$3+1;
1677 } else {
1678 $realcnt=1+1;
1679 }
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001680 $in_comment = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -07001681
1682 # Guestimate if this is a continuing comment. Run
1683 # the context looking for a comment "edge". If this
1684 # edge is a close comment then we must be in a comment
1685 # at context start.
1686 my $edge;
Andy Whitcroft01fa9142008-10-15 22:02:19 -07001687 my $cnt = $realcnt;
1688 for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
1689 next if (defined $rawlines[$ln - 1] &&
1690 $rawlines[$ln - 1] =~ /^-/);
1691 $cnt--;
1692 #print "RAW<$rawlines[$ln - 1]>\n";
Andy Whitcroft721c1cb2009-01-06 14:41:16 -08001693 last if (!defined $rawlines[$ln - 1]);
Andy Whitcroftfae17da2009-01-06 14:41:20 -08001694 if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
1695 $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
1696 ($edge) = $1;
1697 last;
1698 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07001699 }
1700 if (defined $edge && $edge eq '*/') {
1701 $in_comment = 1;
1702 }
1703
1704 # Guestimate if this is a continuing comment. If this
1705 # is the start of a diff block and this line starts
1706 # ' *' then it is very likely a comment.
1707 if (!defined $edge &&
Andy Whitcroft83242e02009-01-06 14:41:17 -08001708 $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
Andy Whitcroft773647a2008-03-28 14:15:58 -07001709 {
1710 $in_comment = 1;
1711 }
1712
1713 ##print "COMMENT:$in_comment edge<$edge> $rawline\n";
1714 sanitise_line_reset($in_comment);
1715
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001716 } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001717 # Standardise the strings and chars within the input to
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001718 # simplify matching -- only bother with positive lines.
Andy Whitcroft773647a2008-03-28 14:15:58 -07001719 $line = sanitise_line($rawline);
1720 }
1721 push(@lines, $line);
1722
1723 if ($realcnt > 1) {
1724 $realcnt-- if ($line =~ /^(?:\+| |$)/);
1725 } else {
1726 $realcnt = 0;
1727 }
1728
1729 #print "==>$rawline\n";
1730 #print "-->$line\n";
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001731
1732 if ($setup_docs && $line =~ /^\+/) {
1733 push(@setup_docs, $line);
1734 }
1735 }
1736
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001737 $prefix = '';
1738
Andy Whitcroft773647a2008-03-28 14:15:58 -07001739 $realcnt = 0;
1740 $linenr = 0;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001741 foreach my $line (@lines) {
1742 $linenr++;
Joe Perches1b5539b2013-09-11 14:24:03 -07001743 my $sline = $line; #copy of $line
1744 $sline =~ s/$;/ /g; #with comments as spaces
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001745
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001746 my $rawline = $rawlines[$linenr - 1];
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001747
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001748#extract the line range in the file after the patch is applied
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001749 if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001750 $is_patch = 1;
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001751 $first_line = $linenr + 1;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001752 $realline=$1-1;
1753 if (defined $2) {
1754 $realcnt=$3+1;
1755 } else {
1756 $realcnt=1+1;
1757 }
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001758 annotate_reset();
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001759 $prev_values = 'E';
1760
Andy Whitcroft773647a2008-03-28 14:15:58 -07001761 %suppress_ifbraces = ();
Andy Whitcroft170d3a22008-10-15 22:02:30 -07001762 %suppress_whiletrailers = ();
Andy Whitcroft2b474a12009-10-26 16:50:16 -07001763 %suppress_export = ();
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08001764 $suppress_statement = 0;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001765 next;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001766
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001767# track the line number as we move through the hunk, note that
1768# new versions of GNU diff omit the leading space on completely
1769# blank context lines so we need to count that too.
Andy Whitcroft773647a2008-03-28 14:15:58 -07001770 } elsif ($line =~ /^( |\+|$)/) {
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001771 $realline++;
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07001772 $realcnt-- if ($realcnt != 0);
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001773
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001774 # Measure the line length and indent.
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001775 ($length, $indent) = line_stats($rawline);
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001776
1777 # Track the previous line.
1778 ($prevline, $stashline) = ($stashline, $line);
1779 ($previndent, $stashindent) = ($stashindent, $indent);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001780 ($prevrawline, $stashrawline) = ($stashrawline, $rawline);
1781
Andy Whitcroft773647a2008-03-28 14:15:58 -07001782 #warn "line<$line>\n";
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001783
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07001784 } elsif ($realcnt == 1) {
1785 $realcnt--;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001786 }
1787
Andy Whitcroftcc77cdc2009-10-26 16:50:13 -07001788 my $hunk_line = ($realcnt != 0);
1789
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001790#make up the handle for any error we report on this line
Andy Whitcroft773647a2008-03-28 14:15:58 -07001791 $prefix = "$filename:$realline: " if ($emacs && $file);
1792 $prefix = "$filename:$linenr: " if ($emacs && !$file);
1793
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001794 $here = "#$linenr: " if (!$file);
1795 $here = "#$realline: " if ($file);
Andy Whitcroft773647a2008-03-28 14:15:58 -07001796
1797 # extract the filename as it passes
Rabin Vincent3bf9a002010-10-26 14:23:16 -07001798 if ($line =~ /^diff --git.*?(\S+)$/) {
1799 $realfile = $1;
Joe Perches2b7ab452013-11-12 15:10:14 -08001800 $realfile =~ s@^([^/]*)/@@ if (!$file);
Joe Perches270c49a2012-01-10 15:09:50 -08001801 $in_commit_log = 0;
Rabin Vincent3bf9a002010-10-26 14:23:16 -07001802 } elsif ($line =~ /^\+\+\+\s+(\S+)/) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001803 $realfile = $1;
Joe Perches2b7ab452013-11-12 15:10:14 -08001804 $realfile =~ s@^([^/]*)/@@ if (!$file);
Joe Perches270c49a2012-01-10 15:09:50 -08001805 $in_commit_log = 0;
Wolfram Sang1e855722009-01-06 14:41:24 -08001806
1807 $p1_prefix = $1;
Andy Whitcrofte2f7aa42009-02-27 14:03:06 -08001808 if (!$file && $tree && $p1_prefix ne '' &&
1809 -e "$root/$p1_prefix") {
Joe Perches000d1cc12011-07-25 17:13:25 -07001810 WARN("PATCH_PREFIX",
1811 "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
Wolfram Sang1e855722009-01-06 14:41:24 -08001812 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07001813
Andy Whitcroftc1ab3322008-10-15 22:02:20 -07001814 if ($realfile =~ m@^include/asm/@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07001815 ERROR("MODIFIED_INCLUDE_ASM",
1816 "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 -07001817 }
1818 next;
1819 }
1820
Randy Dunlap389834b2007-06-08 13:47:03 -07001821 $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001822
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001823 my $hereline = "$here\n$rawline\n";
1824 my $herecurr = "$here\n$rawline\n";
1825 my $hereprev = "$here\n$prevrawline\n$rawline\n";
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001826
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001827 $cnt_lines++ if ($realcnt != 0);
1828
Rabin Vincent3bf9a002010-10-26 14:23:16 -07001829# Check for incorrect file permissions
1830 if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
1831 my $permhere = $here . "FILE: $realfile\n";
Joe Perches04db4d22013-04-29 16:18:14 -07001832 if ($realfile !~ m@scripts/@ &&
1833 $realfile !~ /\.(py|pl|awk|sh)$/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07001834 ERROR("EXECUTE_PERMISSIONS",
1835 "do not set execute permissions for source files\n" . $permhere);
Rabin Vincent3bf9a002010-10-26 14:23:16 -07001836 }
1837 }
1838
Joe Perches20112472011-07-25 17:13:23 -07001839# Check the patch for a signoff:
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07001840 if ($line =~ /^\s*signed-off-by:/i) {
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001841 $signoff++;
Joe Perches15662b32011-10-31 17:13:12 -07001842 $in_commit_log = 0;
Joe Perches20112472011-07-25 17:13:23 -07001843 }
1844
1845# Check signature styles
Joe Perches270c49a2012-01-10 15:09:50 -08001846 if (!$in_header_lines &&
Joe Perchesce0338df3c2012-07-30 14:41:18 -07001847 $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
Joe Perches20112472011-07-25 17:13:23 -07001848 my $space_before = $1;
1849 my $sign_off = $2;
1850 my $space_after = $3;
1851 my $email = $4;
1852 my $ucfirst_sign_off = ucfirst(lc($sign_off));
1853
Joe Perchesce0338df3c2012-07-30 14:41:18 -07001854 if ($sign_off !~ /$signature_tags/) {
1855 WARN("BAD_SIGN_OFF",
1856 "Non-standard signature: $sign_off\n" . $herecurr);
1857 }
Joe Perches20112472011-07-25 17:13:23 -07001858 if (defined $space_before && $space_before ne "") {
Joe Perches3705ce52013-07-03 15:05:31 -07001859 if (WARN("BAD_SIGN_OFF",
1860 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
1861 $fix) {
1862 $fixed[$linenr - 1] =
1863 "$ucfirst_sign_off $email";
1864 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001865 }
Joe Perches20112472011-07-25 17:13:23 -07001866 if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
Joe Perches3705ce52013-07-03 15:05:31 -07001867 if (WARN("BAD_SIGN_OFF",
1868 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
1869 $fix) {
1870 $fixed[$linenr - 1] =
1871 "$ucfirst_sign_off $email";
1872 }
1873
Joe Perches20112472011-07-25 17:13:23 -07001874 }
1875 if (!defined $space_after || $space_after ne " ") {
Joe Perches3705ce52013-07-03 15:05:31 -07001876 if (WARN("BAD_SIGN_OFF",
1877 "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
1878 $fix) {
1879 $fixed[$linenr - 1] =
1880 "$ucfirst_sign_off $email";
1881 }
Joe Perches20112472011-07-25 17:13:23 -07001882 }
1883
1884 my ($email_name, $email_address, $comment) = parse_email($email);
1885 my $suggested_email = format_email(($email_name, $email_address));
1886 if ($suggested_email eq "") {
Joe Perches000d1cc12011-07-25 17:13:25 -07001887 ERROR("BAD_SIGN_OFF",
1888 "Unrecognized email address: '$email'\n" . $herecurr);
Joe Perches20112472011-07-25 17:13:23 -07001889 } else {
1890 my $dequoted = $suggested_email;
1891 $dequoted =~ s/^"//;
1892 $dequoted =~ s/" </ </;
1893 # Don't force email to have quotes
1894 # Allow just an angle bracketed address
1895 if ("$dequoted$comment" ne $email &&
1896 "<$email_address>$comment" ne $email &&
1897 "$suggested_email$comment" ne $email) {
Joe Perches000d1cc12011-07-25 17:13:25 -07001898 WARN("BAD_SIGN_OFF",
1899 "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
Joe Perches20112472011-07-25 17:13:23 -07001900 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001901 }
Joe Perches7e51f192013-09-11 14:23:57 -07001902
1903# Check for duplicate signatures
1904 my $sig_nospace = $line;
1905 $sig_nospace =~ s/\s//g;
1906 $sig_nospace = lc($sig_nospace);
1907 if (defined $signatures{$sig_nospace}) {
1908 WARN("BAD_SIGN_OFF",
1909 "Duplicate signature\n" . $herecurr);
1910 } else {
1911 $signatures{$sig_nospace} = 1;
1912 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001913 }
1914
Andy Whitcroft00df3442007-06-08 13:47:06 -07001915# Check for wrappage within a valid hunk of the file
Andy Whitcroft8905a672007-11-28 16:21:06 -08001916 if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
Joe Perches000d1cc12011-07-25 17:13:25 -07001917 ERROR("CORRUPTED_PATCH",
1918 "patch seems to be corrupt (line wrapped?)\n" .
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001919 $herecurr) if (!$emitted_corrupt++);
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001920 }
1921
Andy Whitcroft6ecd9672008-10-15 22:02:21 -07001922# Check for absolute kernel paths.
1923 if ($tree) {
1924 while ($line =~ m{(?:^|\s)(/\S*)}g) {
1925 my $file = $1;
1926
1927 if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
1928 check_absolute_file($1, $herecurr)) {
1929 #
1930 } else {
1931 check_absolute_file($file, $herecurr);
1932 }
1933 }
1934 }
1935
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001936# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
1937 if (($realfile =~ /^$/ || $line =~ /^\+/) &&
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001938 $rawline !~ m/^$UTF8*$/) {
1939 my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
1940
1941 my $blank = copy_spacing($rawline);
1942 my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
1943 my $hereptr = "$hereline$ptr\n";
1944
Joe Perches34d99212011-07-25 17:13:26 -07001945 CHK("INVALID_UTF8",
1946 "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
Andy Whitcroft00df3442007-06-08 13:47:06 -07001947 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001948
Joe Perches15662b32011-10-31 17:13:12 -07001949# Check if it's the start of a commit log
1950# (not a header line and we haven't seen the patch filename)
1951 if ($in_header_lines && $realfile =~ /^$/ &&
Joe Perches270c49a2012-01-10 15:09:50 -08001952 $rawline !~ /^(commit\b|from\b|[\w-]+:).+$/i) {
Joe Perches15662b32011-10-31 17:13:12 -07001953 $in_header_lines = 0;
1954 $in_commit_log = 1;
1955 }
1956
Pasi Savanainenfa64205d2012-10-04 17:13:29 -07001957# Check if there is UTF-8 in a commit log when a mail header has explicitly
1958# declined it, i.e defined some charset where it is missing.
1959 if ($in_header_lines &&
1960 $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
1961 $1 !~ /utf-8/i) {
1962 $non_utf8_charset = 1;
1963 }
1964
1965 if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
Joe Perches15662b32011-10-31 17:13:12 -07001966 $rawline =~ /$NON_ASCII_UTF8/) {
Pasi Savanainenfa64205d2012-10-04 17:13:29 -07001967 WARN("UTF8_BEFORE_PATCH",
Joe Perches15662b32011-10-31 17:13:12 -07001968 "8-bit UTF-8 used in possible commit log\n" . $herecurr);
1969 }
1970
Andy Whitcroft306708542008-10-15 22:02:28 -07001971# ignore non-hunk lines and lines being removed
1972 next if (!$hunk_line || $line =~ /^-/);
Andy Whitcroft00df3442007-06-08 13:47:06 -07001973
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001974#trailing whitespace
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001975 if ($line =~ /^\+.*\015/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001976 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Joe Perchesd5e616f2013-09-11 14:23:54 -07001977 if (ERROR("DOS_LINE_ENDINGS",
1978 "DOS line endings\n" . $herevet) &&
1979 $fix) {
1980 $fixed[$linenr - 1] =~ s/[\s\015]+$//;
1981 }
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001982 } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
1983 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Joe Perches3705ce52013-07-03 15:05:31 -07001984 if (ERROR("TRAILING_WHITESPACE",
1985 "trailing whitespace\n" . $herevet) &&
1986 $fix) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07001987 $fixed[$linenr - 1] =~ s/\s+$//;
Joe Perches3705ce52013-07-03 15:05:31 -07001988 }
1989
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07001990 $rpt_cleaners = 1;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07001991 }
Andy Whitcroft5368df22008-10-15 22:02:27 -07001992
Josh Triplett4783f892013-11-12 15:10:12 -08001993# Check for FSF mailing addresses.
Alexander Duyck109d8cb2014-01-23 15:54:50 -08001994 if ($rawline =~ /\bwrite to the Free/i ||
Joe Perches3e2232f2014-01-23 15:54:48 -08001995 $rawline =~ /\b59\s+Temple\s+Pl/i ||
1996 $rawline =~ /\b51\s+Franklin\s+St/i) {
Josh Triplett4783f892013-11-12 15:10:12 -08001997 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
1998 my $msg_type = \&ERROR;
1999 $msg_type = \&CHK if ($file);
2000 &{$msg_type}("FSF_MAILING_ADDRESS",
Joe Perches3e2232f2014-01-23 15:54:48 -08002001 "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 -08002002 }
2003
Andi Kleen33549572010-05-24 14:33:29 -07002004# check for Kconfig help text having a real description
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002005# Only applies when adding the entry originally, after that we do not have
2006# sufficient context to determine whether it is indeed long enough.
Andi Kleen33549572010-05-24 14:33:29 -07002007 if ($realfile =~ /Kconfig/ &&
Andy Whitcrofta1385802012-01-10 15:10:03 -08002008 $line =~ /.\s*config\s+/) {
Andi Kleen33549572010-05-24 14:33:29 -07002009 my $length = 0;
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002010 my $cnt = $realcnt;
2011 my $ln = $linenr + 1;
2012 my $f;
Andy Whitcrofta1385802012-01-10 15:10:03 -08002013 my $is_start = 0;
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002014 my $is_end = 0;
Andy Whitcrofta1385802012-01-10 15:10:03 -08002015 for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002016 $f = $lines[$ln - 1];
2017 $cnt-- if ($lines[$ln - 1] !~ /^-/);
2018 $is_end = $lines[$ln - 1] =~ /^\+/;
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002019
2020 next if ($f =~ /^-/);
Andy Whitcrofta1385802012-01-10 15:10:03 -08002021
2022 if ($lines[$ln - 1] =~ /.\s*(?:bool|tristate)\s*\"/) {
2023 $is_start = 1;
2024 } elsif ($lines[$ln - 1] =~ /.\s*(?:---)?help(?:---)?$/) {
2025 $length = -1;
2026 }
2027
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002028 $f =~ s/^.//;
Andi Kleen33549572010-05-24 14:33:29 -07002029 $f =~ s/#.*//;
2030 $f =~ s/^\s+//;
2031 next if ($f =~ /^$/);
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002032 if ($f =~ /^\s*config\s/) {
2033 $is_end = 1;
2034 last;
2035 }
Andi Kleen33549572010-05-24 14:33:29 -07002036 $length++;
2037 }
Joe Perches000d1cc12011-07-25 17:13:25 -07002038 WARN("CONFIG_DESCRIPTION",
Andy Whitcrofta1385802012-01-10 15:10:03 -08002039 "please write a paragraph that describes the config symbol fully\n" . $herecurr) if ($is_start && $is_end && $length < 4);
2040 #print "is_start<$is_start> is_end<$is_end> length<$length>\n";
Andi Kleen33549572010-05-24 14:33:29 -07002041 }
2042
Kees Cook1ba8dfd2012-12-17 16:01:48 -08002043# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
2044 if ($realfile =~ /Kconfig/ &&
2045 $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
2046 WARN("CONFIG_EXPERIMENTAL",
2047 "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2048 }
2049
Arnaud Lacombec68e5872011-08-15 01:07:14 -04002050 if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
2051 ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
2052 my $flag = $1;
2053 my $replacement = {
2054 'EXTRA_AFLAGS' => 'asflags-y',
2055 'EXTRA_CFLAGS' => 'ccflags-y',
2056 'EXTRA_CPPFLAGS' => 'cppflags-y',
2057 'EXTRA_LDFLAGS' => 'ldflags-y',
2058 };
2059
2060 WARN("DEPRECATED_VARIABLE",
2061 "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
2062 }
2063
Rob Herringbff5da42014-01-23 15:54:51 -08002064# check for DT compatible documentation
2065 if (defined $root && $realfile =~ /\.dts/ &&
2066 $rawline =~ /^\+\s*compatible\s*=/) {
2067 my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
2068
2069 foreach my $compat (@compats) {
2070 my $compat2 = $compat;
2071 my $dt_path = $root . "/Documentation/devicetree/bindings/";
2072 $compat2 =~ s/\,[a-z]*\-/\,<\.\*>\-/;
2073 `grep -Erq "$compat|$compat2" $dt_path`;
2074 if ( $? >> 8 ) {
2075 WARN("UNDOCUMENTED_DT_STRING",
2076 "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
2077 }
2078
2079 my $vendor = $compat;
2080 my $vendor_path = $dt_path . "vendor-prefixes.txt";
2081 next if (! -f $vendor_path);
2082 $vendor =~ s/^([a-zA-Z0-9]+)\,.*/$1/;
2083 `grep -Eq "$vendor" $vendor_path`;
2084 if ( $? >> 8 ) {
2085 WARN("UNDOCUMENTED_DT_STRING",
2086 "DT compatible string vendor \"$vendor\" appears un-documented -- check $vendor_path\n" . $herecurr);
2087 }
2088 }
2089 }
2090
Andy Whitcroft5368df22008-10-15 22:02:27 -07002091# check we are in a valid source file if not then ignore this hunk
2092 next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
2093
Joe Perches6cd7f382012-12-17 16:01:54 -08002094#line length limit
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002095 if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
Andy Whitcroftf4c014c2008-07-23 21:29:01 -07002096 $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
Joe Perches0fccc622011-05-24 17:13:41 -07002097 !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||
Joe Perches8bbea962010-08-09 17:21:01 -07002098 $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
Joe Perches6cd7f382012-12-17 16:01:54 -08002099 $length > $max_line_length)
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002100 {
Joe Perches000d1cc12011-07-25 17:13:25 -07002101 WARN("LONG_LINE",
Joe Perches6cd7f382012-12-17 16:01:54 -08002102 "line over $max_line_length characters\n" . $herecurr);
Andy Whitcroft0a920b52007-06-01 00:46:48 -07002103 }
2104
Josh Triplettca56dc02012-03-23 15:02:21 -07002105# Check for user-visible strings broken across lines, which breaks the ability
Joe Perches8c5fcd22014-01-23 15:54:40 -08002106# to grep for the string. Make exceptions when the previous string ends in a
2107# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
2108# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
Josh Triplettca56dc02012-03-23 15:02:21 -07002109 if ($line =~ /^\+\s*"/ &&
2110 $prevline =~ /"\s*$/ &&
Joe Perches8c5fcd22014-01-23 15:54:40 -08002111 $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
Josh Triplettca56dc02012-03-23 15:02:21 -07002112 WARN("SPLIT_STRING",
2113 "quoted string split across lines\n" . $hereprev);
2114 }
2115
Joe Perches5e79d962010-03-05 13:43:55 -08002116# check for spaces before a quoted newline
2117 if ($rawline =~ /^.*\".*\s\\n/) {
Joe Perches3705ce52013-07-03 15:05:31 -07002118 if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
2119 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
2120 $fix) {
2121 $fixed[$linenr - 1] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
2122 }
2123
Joe Perches5e79d962010-03-05 13:43:55 -08002124 }
2125
Andy Whitcroft8905a672007-11-28 16:21:06 -08002126# check for adding lines without a newline.
2127 if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002128 WARN("MISSING_EOF_NEWLINE",
2129 "adding a line without newline at end of file\n" . $herecurr);
Andy Whitcroft8905a672007-11-28 16:21:06 -08002130 }
2131
Mike Frysinger42e41c52009-09-21 17:04:40 -07002132# Blackfin: use hi/lo macros
2133 if ($realfile =~ m@arch/blackfin/.*\.S$@) {
2134 if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
2135 my $herevet = "$here\n" . cat_vet($line) . "\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07002136 ERROR("LO_MACRO",
2137 "use the LO() macro, not (... & 0xFFFF)\n" . $herevet);
Mike Frysinger42e41c52009-09-21 17:04:40 -07002138 }
2139 if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
2140 my $herevet = "$here\n" . cat_vet($line) . "\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07002141 ERROR("HI_MACRO",
2142 "use the HI() macro, not (... >> 16)\n" . $herevet);
Mike Frysinger42e41c52009-09-21 17:04:40 -07002143 }
2144 }
2145
Andy Whitcroftb9ea10d2008-10-15 22:02:24 -07002146# check we are in a valid source file C or perl if not then ignore this hunk
2147 next if ($realfile !~ /\.(h|c|pl)$/);
Andy Whitcroft0a920b52007-06-01 00:46:48 -07002148
2149# at the beginning of a line any tabs must come first and anything
2150# more than 8 must use tabs.
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002151 if ($rawline =~ /^\+\s* \t\s*\S/ ||
2152 $rawline =~ /^\+\s* \s*/) {
2153 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07002154 $rpt_cleaners = 1;
Joe Perches3705ce52013-07-03 15:05:31 -07002155 if (ERROR("CODE_INDENT",
2156 "code indent should use tabs where possible\n" . $herevet) &&
2157 $fix) {
2158 $fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
2159 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07002160 }
2161
Alberto Panizzo08e44362010-03-05 13:43:54 -08002162# check for space before tabs.
2163 if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
2164 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Joe Perches3705ce52013-07-03 15:05:31 -07002165 if (WARN("SPACE_BEFORE_TAB",
2166 "please, no space before tabs\n" . $herevet) &&
2167 $fix) {
Joe Perchesc76f4cb2014-01-23 15:54:46 -08002168 while ($fixed[$linenr - 1] =~
2169 s/(^\+.*) {8,8}+\t/$1\t\t/) {}
2170 while ($fixed[$linenr - 1] =~
2171 s/(^\+.*) +\t/$1\t/) {}
Joe Perches3705ce52013-07-03 15:05:31 -07002172 }
Alberto Panizzo08e44362010-03-05 13:43:54 -08002173 }
2174
Joe Perchesd1fe9c02012-03-23 15:02:16 -07002175# check for && or || at the start of a line
2176 if ($rawline =~ /^\+\s*(&&|\|\|)/) {
2177 CHK("LOGICAL_CONTINUATIONS",
2178 "Logical continuations should be on the previous line\n" . $hereprev);
2179 }
2180
2181# check multi-line statement indentation matches previous line
2182 if ($^V && $^V ge 5.10.0 &&
2183 $prevline =~ /^\+(\t*)(if \(|$Ident\().*(\&\&|\|\||,)\s*$/) {
2184 $prevline =~ /^\+(\t*)(.*)$/;
2185 my $oldindent = $1;
2186 my $rest = $2;
2187
2188 my $pos = pos_last_openparen($rest);
2189 if ($pos >= 0) {
Joe Perchesb34a26f2012-07-30 14:41:16 -07002190 $line =~ /^(\+| )([ \t]*)/;
2191 my $newindent = $2;
Joe Perchesd1fe9c02012-03-23 15:02:16 -07002192
2193 my $goodtabindent = $oldindent .
2194 "\t" x ($pos / 8) .
2195 " " x ($pos % 8);
2196 my $goodspaceindent = $oldindent . " " x $pos;
2197
2198 if ($newindent ne $goodtabindent &&
2199 $newindent ne $goodspaceindent) {
Joe Perches3705ce52013-07-03 15:05:31 -07002200
2201 if (CHK("PARENTHESIS_ALIGNMENT",
2202 "Alignment should match open parenthesis\n" . $hereprev) &&
2203 $fix && $line =~ /^\+/) {
2204 $fixed[$linenr - 1] =~
2205 s/^\+[ \t]*/\+$goodtabindent/;
2206 }
Joe Perchesd1fe9c02012-03-23 15:02:16 -07002207 }
2208 }
2209 }
2210
Joe Perches23f780c2013-07-03 15:05:31 -07002211 if ($line =~ /^\+.*\*[ \t]*\)[ \t]+(?!$Assignment|$Arithmetic)/) {
Joe Perches3705ce52013-07-03 15:05:31 -07002212 if (CHK("SPACING",
2213 "No space is necessary after a cast\n" . $hereprev) &&
2214 $fix) {
2215 $fixed[$linenr - 1] =~
2216 s/^(\+.*\*[ \t]*\))[ \t]+/$1/;
2217 }
Joe Perchesaad4f612012-03-23 15:02:19 -07002218 }
2219
Joe Perches05880602012-10-04 17:13:35 -07002220 if ($realfile =~ m@^(drivers/net/|net/)@ &&
Joe Perchesfdb4bcd2013-07-03 15:05:23 -07002221 $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
Joe Perches85ad9782014-04-03 14:49:20 -07002222 $rawline =~ /^\+[ \t]*\*/ &&
2223 $realline > 2) {
Joe Perches05880602012-10-04 17:13:35 -07002224 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2225 "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
2226 }
2227
2228 if ($realfile =~ m@^(drivers/net/|net/)@ &&
Joe Perchesa605e322013-07-03 15:05:24 -07002229 $prevrawline =~ /^\+[ \t]*\/\*/ && #starting /*
2230 $prevrawline !~ /\*\/[ \t]*$/ && #no trailing */
Joe Perches61135e92013-09-11 14:23:59 -07002231 $rawline =~ /^\+/ && #line is new
Joe Perchesa605e322013-07-03 15:05:24 -07002232 $rawline !~ /^\+[ \t]*\*/) { #no leading *
2233 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2234 "networking block comments start with * on subsequent lines\n" . $hereprev);
2235 }
2236
2237 if ($realfile =~ m@^(drivers/net/|net/)@ &&
Joe Perchesc24f9f12012-11-08 15:53:29 -08002238 $rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */
2239 $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/
2240 $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/
2241 $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */
Joe Perches05880602012-10-04 17:13:35 -07002242 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2243 "networking block comments put the trailing */ on a separate line\n" . $herecurr);
2244 }
2245
Raffaele Recalcati5f7ddae2010-08-09 17:20:59 -07002246# check for spaces at the beginning of a line.
Andy Whitcroft6b4c5be2010-10-26 14:23:11 -07002247# Exceptions:
2248# 1) within comments
2249# 2) indented preprocessor commands
2250# 3) hanging labels
Joe Perches3705ce52013-07-03 15:05:31 -07002251 if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/) {
Raffaele Recalcati5f7ddae2010-08-09 17:20:59 -07002252 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Joe Perches3705ce52013-07-03 15:05:31 -07002253 if (WARN("LEADING_SPACE",
2254 "please, no spaces at the start of a line\n" . $herevet) &&
2255 $fix) {
2256 $fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
2257 }
Raffaele Recalcati5f7ddae2010-08-09 17:20:59 -07002258 }
2259
Andy Whitcroftb9ea10d2008-10-15 22:02:24 -07002260# check we are in a valid C source file if not then ignore this hunk
2261 next if ($realfile !~ /\.(h|c)$/);
2262
Kees Cook1ba8dfd2012-12-17 16:01:48 -08002263# discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
2264 if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
2265 WARN("CONFIG_EXPERIMENTAL",
2266 "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2267 }
2268
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002269# check for RCS/CVS revision markers
Andy Whitcroftcf655042008-03-04 14:28:20 -08002270 if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002271 WARN("CVS_KEYWORD",
2272 "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002273 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07002274
Mike Frysinger42e41c52009-09-21 17:04:40 -07002275# Blackfin: don't use __builtin_bfin_[cs]sync
2276 if ($line =~ /__builtin_bfin_csync/) {
2277 my $herevet = "$here\n" . cat_vet($line) . "\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07002278 ERROR("CSYNC",
2279 "use the CSYNC() macro in asm/blackfin.h\n" . $herevet);
Mike Frysinger42e41c52009-09-21 17:04:40 -07002280 }
2281 if ($line =~ /__builtin_bfin_ssync/) {
2282 my $herevet = "$here\n" . cat_vet($line) . "\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07002283 ERROR("SSYNC",
2284 "use the SSYNC() macro in asm/blackfin.h\n" . $herevet);
Mike Frysinger42e41c52009-09-21 17:04:40 -07002285 }
2286
Joe Perches56e77d72013-02-21 16:44:14 -08002287# check for old HOTPLUG __dev<foo> section markings
2288 if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
2289 WARN("HOTPLUG_SECTION",
2290 "Using $1 is unnecessary\n" . $herecurr);
2291 }
2292
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002293# Check for potential 'bare' types
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002294 my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
2295 $realline_next);
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08002296#print "LINE<$line>\n";
2297 if ($linenr >= $suppress_statement &&
Joe Perches1b5539b2013-09-11 14:24:03 -07002298 $realcnt && $sline =~ /.\s*\S/) {
Andy Whitcroft170d3a22008-10-15 22:02:30 -07002299 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
Andy Whitcroftf5fe35d2008-07-23 21:29:03 -07002300 ctx_statement_block($linenr, $realcnt, 0);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002301 $stat =~ s/\n./\n /g;
2302 $cond =~ s/\n./\n /g;
2303
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08002304#print "linenr<$linenr> <$stat>\n";
2305 # If this statement has no statement boundaries within
2306 # it there is no point in retrying a statement scan
2307 # until we hit end of it.
2308 my $frag = $stat; $frag =~ s/;+\s*$//;
2309 if ($frag !~ /(?:{|;)/) {
2310#print "skip<$line_nr_next>\n";
2311 $suppress_statement = $line_nr_next;
2312 }
Andy Whitcroftf74bd192012-01-10 15:09:54 -08002313
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002314 # Find the real next line.
2315 $realline_next = $line_nr_next;
2316 if (defined $realline_next &&
2317 (!defined $lines[$realline_next - 1] ||
2318 substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
2319 $realline_next++;
2320 }
2321
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002322 my $s = $stat;
2323 $s =~ s/{.*$//s;
Andy Whitcroftcf655042008-03-04 14:28:20 -08002324
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002325 # Ignore goto labels.
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002326 if ($s =~ /$Ident:\*$/s) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002327
2328 # Ignore functions being called
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002329 } elsif ($s =~ /^.\s*$Ident\s*\(/s) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002330
Andy Whitcroft463f2862009-09-21 17:04:34 -07002331 } elsif ($s =~ /^.\s*else\b/s) {
2332
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002333 # declarations always start with types
Andy Whitcroftd2506582008-07-23 21:29:09 -07002334 } 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 -07002335 my $type = $1;
2336 $type =~ s/\s+/ /g;
2337 possible($type, "A:" . $s);
2338
Andy Whitcroft8905a672007-11-28 16:21:06 -08002339 # definitions in global scope can only start with types
Andy Whitcrofta6a840622008-10-15 22:02:30 -07002340 } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002341 possible($1, "B:" . $s);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002342 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08002343
2344 # any (foo ... *) is a pointer cast, and foo is a type
Andy Whitcroft65863862009-01-06 14:41:21 -08002345 while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002346 possible($1, "C:" . $s);
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002347 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08002348
2349 # Check for any sort of function declaration.
2350 # int foo(something bar, other baz);
2351 # void (*store_gdt)(x86_descr_ptr *);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002352 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 -08002353 my ($name_len) = length($1);
Andy Whitcroft8905a672007-11-28 16:21:06 -08002354
Andy Whitcroftcf655042008-03-04 14:28:20 -08002355 my $ctx = $s;
Andy Whitcroft773647a2008-03-28 14:15:58 -07002356 substr($ctx, 0, $name_len + 1, '');
Andy Whitcroft8905a672007-11-28 16:21:06 -08002357 $ctx =~ s/\)[^\)]*$//;
Andy Whitcroftcf655042008-03-04 14:28:20 -08002358
Andy Whitcroft8905a672007-11-28 16:21:06 -08002359 for my $arg (split(/\s*,\s*/, $ctx)) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002360 if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
Andy Whitcroft8905a672007-11-28 16:21:06 -08002361
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002362 possible($1, "D:" . $s);
Andy Whitcroft8905a672007-11-28 16:21:06 -08002363 }
2364 }
2365 }
2366
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002367 }
2368
Andy Whitcroft653d4872007-06-23 17:16:34 -07002369#
2370# Checks which may be anchored in the context.
2371#
2372
2373# Check for switch () and associated case and default
2374# statements should be at the same indent.
Andy Whitcroft00df3442007-06-08 13:47:06 -07002375 if ($line=~/\bswitch\s*\(.*\)/) {
2376 my $err = '';
2377 my $sep = '';
2378 my @ctx = ctx_block_outer($linenr, $realcnt);
2379 shift(@ctx);
2380 for my $ctx (@ctx) {
2381 my ($clen, $cindent) = line_stats($ctx);
2382 if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
2383 $indent != $cindent) {
2384 $err .= "$sep$ctx\n";
2385 $sep = '';
2386 } else {
2387 $sep = "[...]\n";
2388 }
2389 }
2390 if ($err ne '') {
Joe Perches000d1cc12011-07-25 17:13:25 -07002391 ERROR("SWITCH_CASE_INDENT_LEVEL",
2392 "switch and case should be at the same indent\n$hereline$err");
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07002393 }
2394 }
2395
2396# if/while/etc brace do not go on next line, unless defining a do while loop,
2397# or if that brace on the next line is for something else
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002398 if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07002399 my $pre_ctx = "$1$2";
2400
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002401 my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
Joe Perches8eef05d2012-02-03 15:20:39 -08002402
2403 if ($line =~ /^\+\t{6,}/) {
2404 WARN("DEEP_INDENTATION",
2405 "Too many leading tabs - consider code refactoring\n" . $herecurr);
2406 }
2407
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07002408 my $ctx_cnt = $realcnt - $#ctx - 1;
2409 my $ctx = join("\n", @ctx);
2410
Andy Whitcroft548596d2008-07-23 21:29:01 -07002411 my $ctx_ln = $linenr;
2412 my $ctx_skip = $realcnt;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07002413
Andy Whitcroft548596d2008-07-23 21:29:01 -07002414 while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
2415 defined $lines[$ctx_ln - 1] &&
2416 $lines[$ctx_ln - 1] =~ /^-/)) {
2417 ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
2418 $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
Andy Whitcroft773647a2008-03-28 14:15:58 -07002419 $ctx_ln++;
2420 }
Andy Whitcroft548596d2008-07-23 21:29:01 -07002421
Andy Whitcroft53210162008-07-23 21:29:03 -07002422 #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
2423 #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
Andy Whitcroft773647a2008-03-28 14:15:58 -07002424
2425 if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002426 ERROR("OPEN_BRACE",
2427 "that open brace { should be on the previous line\n" .
Andy Whitcroft01464f32010-10-26 14:23:19 -07002428 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
Andy Whitcroft00df3442007-06-08 13:47:06 -07002429 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07002430 if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
2431 $ctx =~ /\)\s*\;\s*$/ &&
2432 defined $lines[$ctx_ln - 1])
2433 {
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002434 my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
2435 if ($nindent > $indent) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002436 WARN("TRAILING_SEMICOLON",
2437 "trailing semicolon indicates no statements, indent implies otherwise\n" .
Andy Whitcroft01464f32010-10-26 14:23:19 -07002438 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002439 }
2440 }
Andy Whitcroft00df3442007-06-08 13:47:06 -07002441 }
2442
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002443# Check relative indent for conditionals and blocks.
2444 if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08002445 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
2446 ctx_statement_block($linenr, $realcnt, 0)
2447 if (!defined $stat);
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002448 my ($s, $c) = ($stat, $cond);
2449
2450 substr($s, 0, length($c), '');
2451
2452 # Make sure we remove the line prefixes as we have
2453 # none on the first line, and are going to readd them
2454 # where necessary.
2455 $s =~ s/\n./\n/gs;
2456
2457 # Find out how long the conditional actually is.
Andy Whitcroft6f779c12008-10-15 22:02:27 -07002458 my @newlines = ($c =~ /\n/gs);
2459 my $cond_lines = 1 + $#newlines;
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002460
2461 # We want to check the first line inside the block
2462 # starting at the end of the conditional, so remove:
2463 # 1) any blank line termination
2464 # 2) any opening brace { on end of the line
2465 # 3) any do (...) {
2466 my $continuation = 0;
2467 my $check = 0;
2468 $s =~ s/^.*\bdo\b//;
2469 $s =~ s/^\s*{//;
2470 if ($s =~ s/^\s*\\//) {
2471 $continuation = 1;
2472 }
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002473 if ($s =~ s/^\s*?\n//) {
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002474 $check = 1;
2475 $cond_lines++;
2476 }
2477
2478 # Also ignore a loop construct at the end of a
2479 # preprocessor statement.
2480 if (($prevline =~ /^.\s*#\s*define\s/ ||
2481 $prevline =~ /\\\s*$/) && $continuation == 0) {
2482 $check = 0;
2483 }
2484
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002485 my $cond_ptr = -1;
Andy Whitcroft740504c2008-10-15 22:02:35 -07002486 $continuation = 0;
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002487 while ($cond_ptr != $cond_lines) {
2488 $cond_ptr = $cond_lines;
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002489
Andy Whitcroftf16fa282008-10-15 22:02:32 -07002490 # If we see an #else/#elif then the code
2491 # is not linear.
2492 if ($s =~ /^\s*\#\s*(?:else|elif)/) {
2493 $check = 0;
2494 }
2495
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002496 # Ignore:
2497 # 1) blank lines, they should be at 0,
2498 # 2) preprocessor lines, and
2499 # 3) labels.
Andy Whitcroft740504c2008-10-15 22:02:35 -07002500 if ($continuation ||
2501 $s =~ /^\s*?\n/ ||
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002502 $s =~ /^\s*#\s*?/ ||
2503 $s =~ /^\s*$Ident\s*:/) {
Andy Whitcroft740504c2008-10-15 22:02:35 -07002504 $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
Andy Whitcroft30dad6e2009-09-21 17:04:36 -07002505 if ($s =~ s/^.*?\n//) {
2506 $cond_lines++;
2507 }
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002508 }
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002509 }
2510
2511 my (undef, $sindent) = line_stats("+" . $s);
2512 my $stat_real = raw_line($linenr, $cond_lines);
2513
2514 # Check if either of these lines are modified, else
2515 # this is not this patch's fault.
2516 if (!defined($stat_real) ||
2517 $stat !~ /^\+/ && $stat_real !~ /^\+/) {
2518 $check = 0;
2519 }
2520 if (defined($stat_real) && $cond_lines > 1) {
2521 $stat_real = "[...]\n$stat_real";
2522 }
2523
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002524 #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 -07002525
2526 if ($check && (($sindent % 8) != 0 ||
2527 ($sindent <= $indent && $s ne ''))) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002528 WARN("SUSPECT_CODE_INDENT",
2529 "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002530 }
2531 }
2532
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002533 # Track the 'values' across context and added lines.
2534 my $opline = $line; $opline =~ s/^./ /;
Andy Whitcroft1f65f942008-07-23 21:29:10 -07002535 my ($curr_values, $curr_vars) =
2536 annotate_values($opline . "\n", $prev_values);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002537 $curr_values = $prev_values . $curr_values;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002538 if ($dbg_values) {
2539 my $outline = $opline; $outline =~ s/\t/ /g;
Andy Whitcroftcf655042008-03-04 14:28:20 -08002540 print "$linenr > .$outline\n";
2541 print "$linenr > $curr_values\n";
Andy Whitcroft1f65f942008-07-23 21:29:10 -07002542 print "$linenr > $curr_vars\n";
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002543 }
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002544 $prev_values = substr($curr_values, -1);
2545
Andy Whitcroft00df3442007-06-08 13:47:06 -07002546#ignore lines not being added
Joe Perches3705ce52013-07-03 15:05:31 -07002547 next if ($line =~ /^[^\+]/);
Andy Whitcroft00df3442007-06-08 13:47:06 -07002548
Andy Whitcroft653d4872007-06-23 17:16:34 -07002549# TEST: allow direct testing of the type matcher.
Andy Whitcroft7429c692008-07-23 21:29:06 -07002550 if ($dbg_type) {
2551 if ($line =~ /^.\s*$Declare\s*$/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002552 ERROR("TEST_TYPE",
2553 "TEST: is type\n" . $herecurr);
Andy Whitcroft7429c692008-07-23 21:29:06 -07002554 } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002555 ERROR("TEST_NOT_TYPE",
2556 "TEST: is not type ($1 is)\n". $herecurr);
Andy Whitcroft7429c692008-07-23 21:29:06 -07002557 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07002558 next;
2559 }
Andy Whitcrofta1ef2772008-10-15 22:02:17 -07002560# TEST: allow direct testing of the attribute matcher.
2561 if ($dbg_attr) {
Andy Whitcroft9360b0e2009-02-27 14:03:08 -08002562 if ($line =~ /^.\s*$Modifier\s*$/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002563 ERROR("TEST_ATTR",
2564 "TEST: is attr\n" . $herecurr);
Andy Whitcroft9360b0e2009-02-27 14:03:08 -08002565 } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002566 ERROR("TEST_NOT_ATTR",
2567 "TEST: is not attr ($1 is)\n". $herecurr);
Andy Whitcrofta1ef2772008-10-15 22:02:17 -07002568 }
2569 next;
2570 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07002571
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07002572# check for initialisation to aggregates open brace on the next line
Andy Whitcroft99423c22009-10-26 16:50:15 -07002573 if ($line =~ /^.\s*{/ &&
2574 $prevline =~ /(?:^|[^=])=\s*$/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002575 ERROR("OPEN_BRACE",
2576 "that open brace { should be on the previous line\n" . $hereprev);
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07002577 }
2578
Andy Whitcroft653d4872007-06-23 17:16:34 -07002579#
2580# Checks which are anchored on the added line.
2581#
2582
2583# check for malformed paths in #include statements (uses RAW line)
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002584 if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
Andy Whitcroft653d4872007-06-23 17:16:34 -07002585 my $path = $1;
2586 if ($path =~ m{//}) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002587 ERROR("MALFORMED_INCLUDE",
Joe Perches495e9d82012-12-20 15:05:37 -08002588 "malformed #include filename\n" . $herecurr);
2589 }
2590 if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
2591 ERROR("UAPI_INCLUDE",
2592 "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
Andy Whitcroft653d4872007-06-23 17:16:34 -07002593 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07002594 }
Andy Whitcroft00df3442007-06-08 13:47:06 -07002595
2596# no C99 // comments
2597 if ($line =~ m{//}) {
Joe Perches3705ce52013-07-03 15:05:31 -07002598 if (ERROR("C99_COMMENTS",
2599 "do not use C99 // comments\n" . $herecurr) &&
2600 $fix) {
2601 my $line = $fixed[$linenr - 1];
2602 if ($line =~ /\/\/(.*)$/) {
2603 my $comment = trim($1);
2604 $fixed[$linenr - 1] =~ s@\/\/(.*)$@/\* $comment \*/@;
2605 }
2606 }
Andy Whitcroft00df3442007-06-08 13:47:06 -07002607 }
2608 # Remove C99 comments.
Andy Whitcroft0a920b52007-06-01 00:46:48 -07002609 $line =~ s@//.*@@;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002610 $opline =~ s@//.*@@;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07002611
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002612# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
2613# the whole statement.
2614#print "APW <$lines[$realline_next - 1]>\n";
2615 if (defined $realline_next &&
2616 exists $lines[$realline_next - 1] &&
2617 !defined $suppress_export{$realline_next} &&
2618 ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2619 $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
Andy Whitcroft3cbf62d2010-10-26 14:23:18 -07002620 # Handle definitions which produce identifiers with
2621 # a prefix:
2622 # XXX(foo);
2623 # EXPORT_SYMBOL(something_foo);
Andy Whitcroft653d4872007-06-23 17:16:34 -07002624 my $name = $1;
Andy Whitcroft87a53872012-01-10 15:10:04 -08002625 if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
Andy Whitcroft3cbf62d2010-10-26 14:23:18 -07002626 $name =~ /^${Ident}_$2/) {
2627#print "FOO C name<$name>\n";
2628 $suppress_export{$realline_next} = 1;
2629
2630 } elsif ($stat !~ /(?:
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002631 \n.}\s*$|
Andy Whitcroft48012052008-10-15 22:02:34 -07002632 ^.DEFINE_$Ident\(\Q$name\E\)|
2633 ^.DECLARE_$Ident\(\Q$name\E\)|
2634 ^.LIST_HEAD\(\Q$name\E\)|
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002635 ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
2636 \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
Andy Whitcroft48012052008-10-15 22:02:34 -07002637 )/x) {
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002638#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
2639 $suppress_export{$realline_next} = 2;
2640 } else {
2641 $suppress_export{$realline_next} = 1;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07002642 }
2643 }
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002644 if (!defined $suppress_export{$linenr} &&
2645 $prevline =~ /^.\s*$/ &&
2646 ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2647 $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
2648#print "FOO B <$lines[$linenr - 1]>\n";
2649 $suppress_export{$linenr} = 2;
2650 }
2651 if (defined $suppress_export{$linenr} &&
2652 $suppress_export{$linenr} == 2) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002653 WARN("EXPORT_SYMBOL",
2654 "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002655 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07002656
Joe Eloff5150bda2010-08-09 17:21:00 -07002657# check for global initialisers.
Joe Perchesd5e616f2013-09-11 14:23:54 -07002658 if ($line =~ /^\+(\s*$Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/) {
2659 if (ERROR("GLOBAL_INITIALISERS",
2660 "do not initialise globals to 0 or NULL\n" .
2661 $herecurr) &&
2662 $fix) {
2663 $fixed[$linenr - 1] =~ s/($Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/$1;/;
2664 }
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07002665 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07002666# check for static initialisers.
Joe Perchesd5e616f2013-09-11 14:23:54 -07002667 if ($line =~ /^\+.*\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
2668 if (ERROR("INITIALISED_STATIC",
2669 "do not initialise statics to 0 or NULL\n" .
2670 $herecurr) &&
2671 $fix) {
2672 $fixed[$linenr - 1] =~ s/(\bstatic\s.*?)\s*=\s*(0|NULL|false)\s*;/$1;/;
2673 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07002674 }
2675
Joe Perchescb710ec2010-10-26 14:23:20 -07002676# check for static const char * arrays.
2677 if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002678 WARN("STATIC_CONST_CHAR_ARRAY",
2679 "static const char * array should probably be static const char * const\n" .
Joe Perchescb710ec2010-10-26 14:23:20 -07002680 $herecurr);
2681 }
2682
2683# check for static char foo[] = "bar" declarations.
2684 if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002685 WARN("STATIC_CONST_CHAR_ARRAY",
2686 "static char array declaration should probably be static const char\n" .
Joe Perchescb710ec2010-10-26 14:23:20 -07002687 $herecurr);
2688 }
2689
Joe Perches9b0fa602014-04-03 14:49:18 -07002690# check for non-global char *foo[] = {"bar", ...} declarations.
2691 if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
2692 WARN("STATIC_CONST_CHAR_ARRAY",
2693 "char * array declaration might be better as static const\n" .
2694 $herecurr);
2695 }
2696
Joe Perchesb36190c2014-01-27 17:07:18 -08002697# check for function declarations without arguments like "int foo()"
2698 if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
2699 if (ERROR("FUNCTION_WITHOUT_ARGS",
2700 "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
2701 $fix) {
2702 $fixed[$linenr - 1] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
2703 }
2704 }
2705
Joe Perches92e112f2013-12-13 11:36:22 -07002706# check for uses of DEFINE_PCI_DEVICE_TABLE
2707 if ($line =~ /\bDEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=/) {
2708 if (WARN("DEFINE_PCI_DEVICE_TABLE",
2709 "Prefer struct pci_device_id over deprecated DEFINE_PCI_DEVICE_TABLE\n" . $herecurr) &&
2710 $fix) {
2711 $fixed[$linenr - 1] =~ s/\b(?:static\s+|)DEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=\s*/static const struct pci_device_id $1\[\] = /;
2712 }
Joe Perches93ed0e22010-10-26 14:23:21 -07002713 }
2714
Andy Whitcroft653d4872007-06-23 17:16:34 -07002715# check for new typedefs, only function parameters and sparse annotations
2716# make sense.
2717 if ($line =~ /\btypedef\s/ &&
Andy Whitcroft80545762009-01-06 14:41:26 -08002718 $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002719 $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
Andy Whitcroft8ed22ca2008-10-15 22:02:32 -07002720 $line !~ /\b$typeTypedefs\b/ &&
Andy Whitcroft653d4872007-06-23 17:16:34 -07002721 $line !~ /\b__bitwise(?:__|)\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002722 WARN("NEW_TYPEDEFS",
2723 "do not add new typedefs\n" . $herecurr);
Andy Whitcroft0a920b52007-06-01 00:46:48 -07002724 }
2725
2726# * goes on variable not on type
Andy Whitcroft65863862009-01-06 14:41:21 -08002727 # (char*[ const])
Andy Whitcroftbfcb2cc2012-01-10 15:10:15 -08002728 while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
2729 #print "AA<$1>\n";
Joe Perches3705ce52013-07-03 15:05:31 -07002730 my ($ident, $from, $to) = ($1, $2, $2);
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07002731
Andy Whitcroft65863862009-01-06 14:41:21 -08002732 # Should start with a space.
2733 $to =~ s/^(\S)/ $1/;
2734 # Should not end with a space.
2735 $to =~ s/\s+$//;
2736 # '*'s should not have spaces between.
Andy Whitcroftf9a0b3d2009-01-15 13:51:05 -08002737 while ($to =~ s/\*\s+\*/\*\*/) {
Andy Whitcroft65863862009-01-06 14:41:21 -08002738 }
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07002739
Joe Perches3705ce52013-07-03 15:05:31 -07002740## print "1: from<$from> to<$to> ident<$ident>\n";
Andy Whitcroft65863862009-01-06 14:41:21 -08002741 if ($from ne $to) {
Joe Perches3705ce52013-07-03 15:05:31 -07002742 if (ERROR("POINTER_LOCATION",
2743 "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr) &&
2744 $fix) {
2745 my $sub_from = $ident;
2746 my $sub_to = $ident;
2747 $sub_to =~ s/\Q$from\E/$to/;
2748 $fixed[$linenr - 1] =~
2749 s@\Q$sub_from\E@$sub_to@;
2750 }
Andy Whitcroft65863862009-01-06 14:41:21 -08002751 }
Andy Whitcroftbfcb2cc2012-01-10 15:10:15 -08002752 }
2753 while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
2754 #print "BB<$1>\n";
Joe Perches3705ce52013-07-03 15:05:31 -07002755 my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07002756
Andy Whitcroft65863862009-01-06 14:41:21 -08002757 # Should start with a space.
2758 $to =~ s/^(\S)/ $1/;
2759 # Should not end with a space.
2760 $to =~ s/\s+$//;
2761 # '*'s should not have spaces between.
Andy Whitcroftf9a0b3d2009-01-15 13:51:05 -08002762 while ($to =~ s/\*\s+\*/\*\*/) {
Andy Whitcroft65863862009-01-06 14:41:21 -08002763 }
2764 # Modifiers should have spaces.
2765 $to =~ s/(\b$Modifier$)/$1 /;
2766
Joe Perches3705ce52013-07-03 15:05:31 -07002767## print "2: from<$from> to<$to> ident<$ident>\n";
Andy Whitcroft667026e2009-02-27 14:03:08 -08002768 if ($from ne $to && $ident !~ /^$Modifier$/) {
Joe Perches3705ce52013-07-03 15:05:31 -07002769 if (ERROR("POINTER_LOCATION",
2770 "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr) &&
2771 $fix) {
2772
2773 my $sub_from = $match;
2774 my $sub_to = $match;
2775 $sub_to =~ s/\Q$from\E/$to/;
2776 $fixed[$linenr - 1] =~
2777 s@\Q$sub_from\E@$sub_to@;
2778 }
Andy Whitcroft65863862009-01-06 14:41:21 -08002779 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07002780 }
2781
2782# # no BUG() or BUG_ON()
2783# if ($line =~ /\b(BUG|BUG_ON)\b/) {
2784# print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n";
2785# print "$herecurr";
2786# $clean = 0;
2787# }
2788
Andy Whitcroft8905a672007-11-28 16:21:06 -08002789 if ($line =~ /\bLINUX_VERSION_CODE\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002790 WARN("LINUX_VERSION_CODE",
2791 "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 -08002792 }
2793
Joe Perches17441222011-06-15 15:08:17 -07002794# check for uses of printk_ratelimit
2795 if ($line =~ /\bprintk_ratelimit\s*\(/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002796 WARN("PRINTK_RATELIMITED",
2797"Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
Joe Perches17441222011-06-15 15:08:17 -07002798 }
2799
Andy Whitcroft00df3442007-06-08 13:47:06 -07002800# printk should use KERN_* levels. Note that follow on printk's on the
2801# same line do not need a level, so we use the current block context
2802# to try and find and validate the current printk. In summary the current
Lucas De Marchi25985ed2011-03-30 22:57:33 -03002803# printk includes all preceding printk's which have no newline on the end.
Andy Whitcroft00df3442007-06-08 13:47:06 -07002804# we assume the first bad printk is the one to report.
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07002805 if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
Andy Whitcroft00df3442007-06-08 13:47:06 -07002806 my $ok = 0;
2807 for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
2808 #print "CHECK<$lines[$ln - 1]\n";
Lucas De Marchi25985ed2011-03-30 22:57:33 -03002809 # we have a preceding printk if it ends
Andy Whitcroft00df3442007-06-08 13:47:06 -07002810 # with "\n" ignore it, else it is to blame
2811 if ($lines[$ln - 1] =~ m{\bprintk\(}) {
2812 if ($rawlines[$ln - 1] !~ m{\\n"}) {
2813 $ok = 1;
2814 }
2815 last;
2816 }
2817 }
2818 if ($ok == 0) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002819 WARN("PRINTK_WITHOUT_KERN_LEVEL",
2820 "printk() should include KERN_ facility level\n" . $herecurr);
Andy Whitcroft00df3442007-06-08 13:47:06 -07002821 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07002822 }
2823
Joe Perches243f3802012-05-31 16:26:09 -07002824 if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
2825 my $orig = $1;
2826 my $level = lc($orig);
2827 $level = "warn" if ($level eq "warning");
Joe Perches8f26b832012-10-04 17:13:32 -07002828 my $level2 = $level;
2829 $level2 = "dbg" if ($level eq "debug");
Joe Perches243f3802012-05-31 16:26:09 -07002830 WARN("PREFER_PR_LEVEL",
Joe Perches8f26b832012-10-04 17:13:32 -07002831 "Prefer netdev_$level2(netdev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr);
Joe Perches243f3802012-05-31 16:26:09 -07002832 }
2833
2834 if ($line =~ /\bpr_warning\s*\(/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07002835 if (WARN("PREFER_PR_LEVEL",
2836 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
2837 $fix) {
2838 $fixed[$linenr - 1] =~
2839 s/\bpr_warning\b/pr_warn/;
2840 }
Joe Perches243f3802012-05-31 16:26:09 -07002841 }
2842
Joe Perchesdc139312013-02-21 16:44:13 -08002843 if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
2844 my $orig = $1;
2845 my $level = lc($orig);
2846 $level = "warn" if ($level eq "warning");
2847 $level = "dbg" if ($level eq "debug");
2848 WARN("PREFER_DEV_LEVEL",
2849 "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
2850 }
2851
Andy Whitcroft653d4872007-06-23 17:16:34 -07002852# function brace can't be on same line, except for #defines of do while,
2853# or if closed on same line
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002854 if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and
2855 !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002856 ERROR("OPEN_BRACE",
2857 "open brace '{' following function declarations go on the next line\n" . $herecurr);
Andy Whitcroft0a920b52007-06-01 00:46:48 -07002858 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07002859
Andy Whitcroft8905a672007-11-28 16:21:06 -08002860# open braces for enum, union and struct go on the same line.
2861 if ($line =~ /^.\s*{/ &&
2862 $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002863 ERROR("OPEN_BRACE",
2864 "open brace '{' following $1 go on the same line\n" . $hereprev);
Andy Whitcroft8905a672007-11-28 16:21:06 -08002865 }
2866
Andy Whitcroft0c73b4e2010-10-26 14:23:15 -07002867# missing space after union, struct or enum definition
Joe Perches3705ce52013-07-03 15:05:31 -07002868 if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
2869 if (WARN("SPACING",
2870 "missing space after $1 definition\n" . $herecurr) &&
2871 $fix) {
2872 $fixed[$linenr - 1] =~
2873 s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
2874 }
Andy Whitcroft0c73b4e2010-10-26 14:23:15 -07002875 }
2876
Joe Perches31070b52014-01-23 15:54:49 -08002877# Function pointer declarations
2878# check spacing between type, funcptr, and args
2879# canonical declaration is "type (*funcptr)(args...)"
Joe Perches91f72e92014-04-03 14:49:12 -07002880 if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
Joe Perches31070b52014-01-23 15:54:49 -08002881 my $declare = $1;
2882 my $pre_pointer_space = $2;
2883 my $post_pointer_space = $3;
2884 my $funcname = $4;
2885 my $post_funcname_space = $5;
2886 my $pre_args_space = $6;
2887
Joe Perches91f72e92014-04-03 14:49:12 -07002888# the $Declare variable will capture all spaces after the type
2889# so check it for a missing trailing missing space but pointer return types
2890# don't need a space so don't warn for those.
2891 my $post_declare_space = "";
2892 if ($declare =~ /(\s+)$/) {
2893 $post_declare_space = $1;
2894 $declare = rtrim($declare);
2895 }
2896 if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
Joe Perches31070b52014-01-23 15:54:49 -08002897 WARN("SPACING",
2898 "missing space after return type\n" . $herecurr);
Joe Perches91f72e92014-04-03 14:49:12 -07002899 $post_declare_space = " ";
Joe Perches31070b52014-01-23 15:54:49 -08002900 }
2901
2902# unnecessary space "type (*funcptr)(args...)"
Joe Perches91f72e92014-04-03 14:49:12 -07002903# This test is not currently implemented because these declarations are
2904# equivalent to
2905# int foo(int bar, ...)
2906# and this is form shouldn't/doesn't generate a checkpatch warning.
2907#
2908# elsif ($declare =~ /\s{2,}$/) {
2909# WARN("SPACING",
2910# "Multiple spaces after return type\n" . $herecurr);
2911# }
Joe Perches31070b52014-01-23 15:54:49 -08002912
2913# unnecessary space "type ( *funcptr)(args...)"
2914 if (defined $pre_pointer_space &&
2915 $pre_pointer_space =~ /^\s/) {
2916 WARN("SPACING",
2917 "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
2918 }
2919
2920# unnecessary space "type (* funcptr)(args...)"
2921 if (defined $post_pointer_space &&
2922 $post_pointer_space =~ /^\s/) {
2923 WARN("SPACING",
2924 "Unnecessary space before function pointer name\n" . $herecurr);
2925 }
2926
2927# unnecessary space "type (*funcptr )(args...)"
2928 if (defined $post_funcname_space &&
2929 $post_funcname_space =~ /^\s/) {
2930 WARN("SPACING",
2931 "Unnecessary space after function pointer name\n" . $herecurr);
2932 }
2933
2934# unnecessary space "type (*funcptr) (args...)"
2935 if (defined $pre_args_space &&
2936 $pre_args_space =~ /^\s/) {
2937 WARN("SPACING",
2938 "Unnecessary space before function pointer arguments\n" . $herecurr);
2939 }
2940
2941 if (show_type("SPACING") && $fix) {
2942 $fixed[$linenr - 1] =~
Joe Perches91f72e92014-04-03 14:49:12 -07002943 s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
Joe Perches31070b52014-01-23 15:54:49 -08002944 }
2945 }
2946
Andy Whitcroft8d31cfc2008-07-23 21:29:02 -07002947# check for spacing round square brackets; allowed:
2948# 1. with a type on the left -- int [] a;
Andy Whitcroftfe2a7db2008-10-15 22:02:15 -07002949# 2. at the beginning of a line for slice initialisers -- [0...10] = 5,
2950# 3. inside a curly brace -- = { [0...10] = 5 }
Andy Whitcroft8d31cfc2008-07-23 21:29:02 -07002951 while ($line =~ /(.*?\s)\[/g) {
2952 my ($where, $prefix) = ($-[1], $1);
2953 if ($prefix !~ /$Type\s+$/ &&
Andy Whitcroftfe2a7db2008-10-15 22:02:15 -07002954 ($where != 0 || $prefix !~ /^.\s+$/) &&
Andy Whitcroftdaebc532012-03-23 15:02:17 -07002955 $prefix !~ /[{,]\s+$/) {
Joe Perches3705ce52013-07-03 15:05:31 -07002956 if (ERROR("BRACKET_SPACE",
2957 "space prohibited before open square bracket '['\n" . $herecurr) &&
2958 $fix) {
2959 $fixed[$linenr - 1] =~
2960 s/^(\+.*?)\s+\[/$1\[/;
2961 }
Andy Whitcroft8d31cfc2008-07-23 21:29:02 -07002962 }
2963 }
2964
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07002965# check for spaces between functions and their parentheses.
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002966 while ($line =~ /($Ident)\s+\(/g) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002967 my $name = $1;
Andy Whitcroft773647a2008-03-28 14:15:58 -07002968 my $ctx_before = substr($line, 0, $-[1]);
2969 my $ctx = "$ctx_before$name";
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002970
2971 # Ignore those directives where spaces _are_ permitted.
Andy Whitcroft773647a2008-03-28 14:15:58 -07002972 if ($name =~ /^(?:
2973 if|for|while|switch|return|case|
2974 volatile|__volatile__|
2975 __attribute__|format|__extension__|
2976 asm|__asm__)$/x)
2977 {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002978 # cpp #define statements have non-optional spaces, ie
2979 # if there is a space between the name and the open
2980 # parenthesis it is simply not a parameter group.
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002981 } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07002982
2983 # cpp #elif statement condition may start with a (
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002984 } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002985
2986 # If this whole things ends with a type its most
2987 # likely a typedef for a function.
Andy Whitcroft773647a2008-03-28 14:15:58 -07002988 } elsif ($ctx =~ /$Type$/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002989
2990 } else {
Joe Perches3705ce52013-07-03 15:05:31 -07002991 if (WARN("SPACING",
2992 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
2993 $fix) {
2994 $fixed[$linenr - 1] =~
2995 s/\b$name\s+\(/$name\(/;
2996 }
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002997 }
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07002998 }
Eric Nelson9a4cad42012-05-31 16:26:09 -07002999
Andy Whitcroft653d4872007-06-23 17:16:34 -07003000# Check operator spacing.
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003001 if (!($line=~/\#\s*include/)) {
Joe Perches3705ce52013-07-03 15:05:31 -07003002 my $fixed_line = "";
3003 my $line_fixed = 0;
3004
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003005 my $ops = qr{
3006 <<=|>>=|<=|>=|==|!=|
3007 \+=|-=|\*=|\/=|%=|\^=|\|=|&=|
3008 =>|->|<<|>>|<|>|=|!|~|
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003009 &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
Joe Perches84731622013-11-12 15:10:05 -08003010 \?:|\?|:
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003011 }x;
Andy Whitcroftcf655042008-03-04 14:28:20 -08003012 my @elements = split(/($ops|;)/, $opline);
Joe Perches3705ce52013-07-03 15:05:31 -07003013
3014## print("element count: <" . $#elements . ">\n");
3015## foreach my $el (@elements) {
3016## print("el: <$el>\n");
3017## }
3018
3019 my @fix_elements = ();
Andy Whitcroft00df3442007-06-08 13:47:06 -07003020 my $off = 0;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003021
Joe Perches3705ce52013-07-03 15:05:31 -07003022 foreach my $el (@elements) {
3023 push(@fix_elements, substr($rawline, $off, length($el)));
3024 $off += length($el);
3025 }
3026
3027 $off = 0;
3028
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003029 my $blank = copy_spacing($opline);
Joe Perchesb34c6482013-09-11 14:24:01 -07003030 my $last_after = -1;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003031
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003032 for (my $n = 0; $n < $#elements; $n += 2) {
Joe Perches3705ce52013-07-03 15:05:31 -07003033
3034 my $good = $fix_elements[$n] . $fix_elements[$n + 1];
3035
3036## print("n: <$n> good: <$good>\n");
3037
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003038 $off += length($elements[$n]);
3039
Lucas De Marchi25985ed2011-03-30 22:57:33 -03003040 # Pick up the preceding and succeeding characters.
Andy Whitcroft773647a2008-03-28 14:15:58 -07003041 my $ca = substr($opline, 0, $off);
3042 my $cc = '';
3043 if (length($opline) >= ($off + length($elements[$n + 1]))) {
3044 $cc = substr($opline, $off + length($elements[$n + 1]));
3045 }
3046 my $cb = "$ca$;$cc";
3047
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003048 my $a = '';
3049 $a = 'V' if ($elements[$n] ne '');
3050 $a = 'W' if ($elements[$n] =~ /\s$/);
Andy Whitcroftcf655042008-03-04 14:28:20 -08003051 $a = 'C' if ($elements[$n] =~ /$;$/);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003052 $a = 'B' if ($elements[$n] =~ /(\[|\()$/);
3053 $a = 'O' if ($elements[$n] eq '');
Andy Whitcroft773647a2008-03-28 14:15:58 -07003054 $a = 'E' if ($ca =~ /^\s*$/);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003055
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003056 my $op = $elements[$n + 1];
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003057
3058 my $c = '';
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003059 if (defined $elements[$n + 2]) {
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003060 $c = 'V' if ($elements[$n + 2] ne '');
3061 $c = 'W' if ($elements[$n + 2] =~ /^\s/);
Andy Whitcroftcf655042008-03-04 14:28:20 -08003062 $c = 'C' if ($elements[$n + 2] =~ /^$;/);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003063 $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
3064 $c = 'O' if ($elements[$n + 2] eq '');
Andy Whitcroft8b1b3372009-01-06 14:41:27 -08003065 $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003066 } else {
3067 $c = 'E';
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003068 }
3069
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003070 my $ctx = "${a}x${c}";
3071
3072 my $at = "(ctx:$ctx)";
3073
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003074 my $ptr = substr($blank, 0, $off) . "^";
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07003075 my $hereptr = "$hereline$ptr\n";
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003076
Andy Whitcroft74048ed2008-07-23 21:29:10 -07003077 # Pull out the value of this operator.
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003078 my $op_type = substr($curr_values, $off + 1, 1);
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003079
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003080 # Get the full operator variant.
3081 my $opv = $op . substr($curr_vars, $off, 1);
3082
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003083 # Ignore operators passed as parameters.
3084 if ($op_type ne 'V' &&
3085 $ca =~ /\s$/ && $cc =~ /^\s*,/) {
3086
Andy Whitcroftcf655042008-03-04 14:28:20 -08003087# # Ignore comments
3088# } elsif ($op =~ /^$;+$/) {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003089
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003090 # ; should have either the end of line or a space or \ after it
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003091 } elsif ($op eq ';') {
Andy Whitcroftcf655042008-03-04 14:28:20 -08003092 if ($ctx !~ /.x[WEBC]/ &&
3093 $cc !~ /^\\/ && $cc !~ /^;/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003094 if (ERROR("SPACING",
3095 "space required after that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003096 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
Joe Perches3705ce52013-07-03 15:05:31 -07003097 $line_fixed = 1;
3098 }
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003099 }
3100
3101 # // is a comment
3102 } elsif ($op eq '//') {
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003103
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003104 # No spaces for:
3105 # ->
3106 # : when part of a bitfield
3107 } elsif ($op eq '->' || $opv eq ':B') {
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003108 if ($ctx =~ /Wx.|.xW/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003109 if (ERROR("SPACING",
3110 "spaces prohibited around that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003111 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003112 if (defined $fix_elements[$n + 2]) {
3113 $fix_elements[$n + 2] =~ s/^\s+//;
3114 }
Joe Perchesb34c6482013-09-11 14:24:01 -07003115 $line_fixed = 1;
Joe Perches3705ce52013-07-03 15:05:31 -07003116 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003117 }
3118
3119 # , must have a space on the right.
3120 } elsif ($op eq ',') {
Andy Whitcroftcf655042008-03-04 14:28:20 -08003121 if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003122 if (ERROR("SPACING",
3123 "space required after that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003124 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
Joe Perches3705ce52013-07-03 15:05:31 -07003125 $line_fixed = 1;
Joe Perchesb34c6482013-09-11 14:24:01 -07003126 $last_after = $n;
Joe Perches3705ce52013-07-03 15:05:31 -07003127 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003128 }
3129
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003130 # '*' as part of a type definition -- reported already.
Andy Whitcroft74048ed2008-07-23 21:29:10 -07003131 } elsif ($opv eq '*_') {
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003132 #warn "'*' is part of type\n";
3133
3134 # unary operators should have a space before and
3135 # none after. May be left adjacent to another
3136 # unary operator, or a cast
3137 } elsif ($op eq '!' || $op eq '~' ||
Andy Whitcroft74048ed2008-07-23 21:29:10 -07003138 $opv eq '*U' || $opv eq '-U' ||
Andy Whitcroft0d413862008-10-15 22:02:16 -07003139 $opv eq '&U' || $opv eq '&&U') {
Andy Whitcroftcf655042008-03-04 14:28:20 -08003140 if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003141 if (ERROR("SPACING",
3142 "space required before that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003143 if ($n != $last_after + 2) {
3144 $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
3145 $line_fixed = 1;
3146 }
Joe Perches3705ce52013-07-03 15:05:31 -07003147 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003148 }
Andy Whitcrofta3340b32009-02-27 14:03:07 -08003149 if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07003150 # A unary '*' may be const
3151
3152 } elsif ($ctx =~ /.xW/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003153 if (ERROR("SPACING",
3154 "space prohibited after that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003155 $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003156 if (defined $fix_elements[$n + 2]) {
3157 $fix_elements[$n + 2] =~ s/^\s+//;
3158 }
Joe Perchesb34c6482013-09-11 14:24:01 -07003159 $line_fixed = 1;
Joe Perches3705ce52013-07-03 15:05:31 -07003160 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003161 }
3162
3163 # unary ++ and unary -- are allowed no space on one side.
3164 } elsif ($op eq '++' or $op eq '--') {
Andy Whitcroft773647a2008-03-28 14:15:58 -07003165 if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003166 if (ERROR("SPACING",
3167 "space required one side of that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003168 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
Joe Perches3705ce52013-07-03 15:05:31 -07003169 $line_fixed = 1;
3170 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003171 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07003172 if ($ctx =~ /Wx[BE]/ ||
3173 ($ctx =~ /Wx./ && $cc =~ /^;/)) {
Joe Perches3705ce52013-07-03 15:05:31 -07003174 if (ERROR("SPACING",
3175 "space prohibited before that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003176 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003177 $line_fixed = 1;
3178 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07003179 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07003180 if ($ctx =~ /ExW/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003181 if (ERROR("SPACING",
3182 "space prohibited after that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003183 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003184 if (defined $fix_elements[$n + 2]) {
3185 $fix_elements[$n + 2] =~ s/^\s+//;
3186 }
Joe Perchesb34c6482013-09-11 14:24:01 -07003187 $line_fixed = 1;
Joe Perches3705ce52013-07-03 15:05:31 -07003188 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07003189 }
3190
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003191 # << and >> may either have or not have spaces both sides
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003192 } elsif ($op eq '<<' or $op eq '>>' or
3193 $op eq '&' or $op eq '^' or $op eq '|' or
3194 $op eq '+' or $op eq '-' or
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003195 $op eq '*' or $op eq '/' or
3196 $op eq '%')
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003197 {
Andy Whitcroft773647a2008-03-28 14:15:58 -07003198 if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003199 if (ERROR("SPACING",
3200 "need consistent spacing around '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003201 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
3202 if (defined $fix_elements[$n + 2]) {
3203 $fix_elements[$n + 2] =~ s/^\s+//;
3204 }
Joe Perches3705ce52013-07-03 15:05:31 -07003205 $line_fixed = 1;
3206 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003207 }
3208
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003209 # A colon needs no spaces before when it is
3210 # terminating a case value or a label.
3211 } elsif ($opv eq ':C' || $opv eq ':L') {
3212 if ($ctx =~ /Wx./) {
Joe Perches3705ce52013-07-03 15:05:31 -07003213 if (ERROR("SPACING",
3214 "space prohibited before that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003215 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003216 $line_fixed = 1;
3217 }
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003218 }
3219
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003220 # All the others need spaces both sides.
Andy Whitcroftcf655042008-03-04 14:28:20 -08003221 } elsif ($ctx !~ /[EWC]x[CWE]/) {
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003222 my $ok = 0;
3223
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003224 # Ignore email addresses <foo@bar>
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003225 if (($op eq '<' &&
3226 $cc =~ /^\S+\@\S+>/) ||
3227 ($op eq '>' &&
3228 $ca =~ /<\S+\@\S+$/))
3229 {
3230 $ok = 1;
3231 }
3232
Joe Perches84731622013-11-12 15:10:05 -08003233 # messages are ERROR, but ?: are CHK
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003234 if ($ok == 0) {
Joe Perches84731622013-11-12 15:10:05 -08003235 my $msg_type = \&ERROR;
3236 $msg_type = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
3237
3238 if (&{$msg_type}("SPACING",
3239 "spaces required around that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003240 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
3241 if (defined $fix_elements[$n + 2]) {
3242 $fix_elements[$n + 2] =~ s/^\s+//;
3243 }
Joe Perches3705ce52013-07-03 15:05:31 -07003244 $line_fixed = 1;
3245 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003246 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003247 }
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003248 $off += length($elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003249
3250## print("n: <$n> GOOD: <$good>\n");
3251
3252 $fixed_line = $fixed_line . $good;
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003253 }
Joe Perches3705ce52013-07-03 15:05:31 -07003254
3255 if (($#elements % 2) == 0) {
3256 $fixed_line = $fixed_line . $fix_elements[$#elements];
3257 }
3258
3259 if ($fix && $line_fixed && $fixed_line ne $fixed[$linenr - 1]) {
3260 $fixed[$linenr - 1] = $fixed_line;
3261 }
3262
3263
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003264 }
3265
Joe Perches786b6322013-07-03 15:05:32 -07003266# check for whitespace before a non-naked semicolon
Joe Perchesd2e248e2014-01-23 15:54:41 -08003267 if ($line =~ /^\+.*\S\s+;\s*$/) {
Joe Perches786b6322013-07-03 15:05:32 -07003268 if (WARN("SPACING",
3269 "space prohibited before semicolon\n" . $herecurr) &&
3270 $fix) {
3271 1 while $fixed[$linenr - 1] =~
3272 s/^(\+.*\S)\s+;/$1;/;
3273 }
3274 }
3275
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003276# check for multiple assignments
3277 if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003278 CHK("MULTIPLE_ASSIGNMENTS",
3279 "multiple assignments should be avoided\n" . $herecurr);
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003280 }
3281
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003282## # check for multiple declarations, allowing for a function declaration
3283## # continuation.
3284## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
3285## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
3286##
3287## # Remove any bracketed sections to ensure we do not
3288## # falsly report the parameters of functions.
3289## my $ln = $line;
3290## while ($ln =~ s/\([^\(\)]*\)//g) {
3291## }
3292## if ($ln =~ /,/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003293## WARN("MULTIPLE_DECLARATION",
3294## "declaring multiple variables together should be avoided\n" . $herecurr);
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003295## }
3296## }
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003297
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003298#need space before brace following if, while, etc
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003299 if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) ||
3300 $line =~ /do{/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003301 if (ERROR("SPACING",
3302 "space required before the open brace '{'\n" . $herecurr) &&
3303 $fix) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07003304 $fixed[$linenr - 1] =~ s/^(\+.*(?:do|\))){/$1 {/;
Joe Perches3705ce52013-07-03 15:05:31 -07003305 }
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07003306 }
3307
Joe Perchesc4a62ef2013-07-03 15:05:28 -07003308## # check for blank lines before declarations
3309## if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
3310## $prevrawline =~ /^.\s*$/) {
3311## WARN("SPACING",
3312## "No blank lines before declarations\n" . $hereprev);
3313## }
3314##
3315
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07003316# closing brace should have a space following it when it has anything
3317# on the line
3318 if ($line =~ /}(?!(?:,|;|\)))\S/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07003319 if (ERROR("SPACING",
3320 "space required after that close brace '}'\n" . $herecurr) &&
3321 $fix) {
3322 $fixed[$linenr - 1] =~
3323 s/}((?!(?:,|;|\)))\S)/} $1/;
3324 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003325 }
3326
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003327# check spacing on square brackets
3328 if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003329 if (ERROR("SPACING",
3330 "space prohibited after that open square bracket '['\n" . $herecurr) &&
3331 $fix) {
3332 $fixed[$linenr - 1] =~
3333 s/\[\s+/\[/;
3334 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003335 }
3336 if ($line =~ /\s\]/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003337 if (ERROR("SPACING",
3338 "space prohibited before that close square bracket ']'\n" . $herecurr) &&
3339 $fix) {
3340 $fixed[$linenr - 1] =~
3341 s/\s+\]/\]/;
3342 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003343 }
3344
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003345# check spacing on parentheses
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003346 if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
3347 $line !~ /for\s*\(\s+;/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003348 if (ERROR("SPACING",
3349 "space prohibited after that open parenthesis '('\n" . $herecurr) &&
3350 $fix) {
3351 $fixed[$linenr - 1] =~
3352 s/\(\s+/\(/;
3353 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003354 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003355 if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003356 $line !~ /for\s*\(.*;\s+\)/ &&
3357 $line !~ /:\s+\)/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003358 if (ERROR("SPACING",
3359 "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
3360 $fix) {
3361 $fixed[$linenr - 1] =~
3362 s/\s+\)/\)/;
3363 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003364 }
3365
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003366#goto labels aren't indented, allow a single space however
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003367 if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003368 !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
Joe Perches3705ce52013-07-03 15:05:31 -07003369 if (WARN("INDENTED_LABEL",
3370 "labels should not be indented\n" . $herecurr) &&
3371 $fix) {
3372 $fixed[$linenr - 1] =~
3373 s/^(.)\s+/$1/;
3374 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003375 }
3376
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003377# Return is not a function.
Joe Perches507e5142013-11-12 15:10:13 -08003378 if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003379 my $spacing = $1;
Joe Perches507e5142013-11-12 15:10:13 -08003380 if ($^V && $^V ge 5.10.0 &&
3381 $stat =~ /^.\s*return\s*$balanced_parens\s*;\s*$/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003382 ERROR("RETURN_PARENTHESES",
3383 "return is not a function, parentheses are not required\n" . $herecurr);
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003384
3385 } elsif ($spacing !~ /\s+/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003386 ERROR("SPACING",
3387 "space required before the open parenthesis '('\n" . $herecurr);
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003388 }
3389 }
Joe Perches507e5142013-11-12 15:10:13 -08003390
Joe Perches189248d2014-01-23 15:54:47 -08003391# if statements using unnecessary parentheses - ie: if ((foo == bar))
3392 if ($^V && $^V ge 5.10.0 &&
3393 $line =~ /\bif\s*((?:\(\s*){2,})/) {
3394 my $openparens = $1;
3395 my $count = $openparens =~ tr@\(@\(@;
3396 my $msg = "";
3397 if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
3398 my $comp = $4; #Not $1 because of $LvalOrFunc
3399 $msg = " - maybe == should be = ?" if ($comp eq "==");
3400 WARN("UNNECESSARY_PARENTHESES",
3401 "Unnecessary parentheses$msg\n" . $herecurr);
3402 }
3403 }
3404
Andy Whitcroft53a3c442010-10-26 14:23:14 -07003405# Return of what appears to be an errno should normally be -'ve
3406 if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
3407 my $name = $1;
3408 if ($name ne 'EOF' && $name ne 'ERROR') {
Joe Perches000d1cc12011-07-25 17:13:25 -07003409 WARN("USE_NEGATIVE_ERRNO",
3410 "return of an errno should typically be -ve (return -$1)\n" . $herecurr);
Andy Whitcroft53a3c442010-10-26 14:23:14 -07003411 }
3412 }
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003413
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003414# Need a space before open parenthesis after if, while etc
Joe Perches3705ce52013-07-03 15:05:31 -07003415 if ($line =~ /\b(if|while|for|switch)\(/) {
3416 if (ERROR("SPACING",
3417 "space required before the open parenthesis '('\n" . $herecurr) &&
3418 $fix) {
3419 $fixed[$linenr - 1] =~
3420 s/\b(if|while|for|switch)\(/$1 \(/;
3421 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003422 }
3423
Andy Whitcroftf5fe35d2008-07-23 21:29:03 -07003424# Check for illegal assignment in if conditional -- and check for trailing
3425# statements after the conditional.
Andy Whitcroft170d3a22008-10-15 22:02:30 -07003426 if ($line =~ /do\s*(?!{)/) {
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08003427 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3428 ctx_statement_block($linenr, $realcnt, 0)
3429 if (!defined $stat);
Andy Whitcroft170d3a22008-10-15 22:02:30 -07003430 my ($stat_next) = ctx_statement_block($line_nr_next,
3431 $remain_next, $off_next);
3432 $stat_next =~ s/\n./\n /g;
3433 ##print "stat<$stat> stat_next<$stat_next>\n";
3434
3435 if ($stat_next =~ /^\s*while\b/) {
3436 # If the statement carries leading newlines,
3437 # then count those as offsets.
3438 my ($whitespace) =
3439 ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
3440 my $offset =
3441 statement_rawlines($whitespace) - 1;
3442
3443 $suppress_whiletrailers{$line_nr_next +
3444 $offset} = 1;
3445 }
3446 }
3447 if (!defined $suppress_whiletrailers{$linenr} &&
Joe Perchesc11230f2013-11-21 14:31:57 -08003448 defined($stat) && defined($cond) &&
Andy Whitcroft170d3a22008-10-15 22:02:30 -07003449 $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07003450 my ($s, $c) = ($stat, $cond);
Andy Whitcroft8905a672007-11-28 16:21:06 -08003451
Andy Whitcroftb53c8e12009-01-06 14:41:29 -08003452 if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003453 ERROR("ASSIGN_IN_IF",
3454 "do not use assignment in if condition\n" . $herecurr);
Andy Whitcroft8905a672007-11-28 16:21:06 -08003455 }
3456
3457 # Find out what is on the end of the line after the
3458 # conditional.
Andy Whitcroft773647a2008-03-28 14:15:58 -07003459 substr($s, 0, length($c), '');
Andy Whitcroft8905a672007-11-28 16:21:06 -08003460 $s =~ s/\n.*//g;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003461 $s =~ s/$;//g; # Remove any comments
Andy Whitcroft53210162008-07-23 21:29:03 -07003462 if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
3463 $c !~ /}\s*while\s*/)
Andy Whitcroft773647a2008-03-28 14:15:58 -07003464 {
Andy Whitcroftbb44ad32008-10-15 22:02:34 -07003465 # Find out how long the conditional actually is.
3466 my @newlines = ($c =~ /\n/gs);
3467 my $cond_lines = 1 + $#newlines;
Hidetoshi Seto42bdf742010-03-05 13:43:50 -08003468 my $stat_real = '';
Andy Whitcroftbb44ad32008-10-15 22:02:34 -07003469
Hidetoshi Seto42bdf742010-03-05 13:43:50 -08003470 $stat_real = raw_line($linenr, $cond_lines)
3471 . "\n" if ($cond_lines);
Andy Whitcroftbb44ad32008-10-15 22:02:34 -07003472 if (defined($stat_real) && $cond_lines > 1) {
3473 $stat_real = "[...]\n$stat_real";
3474 }
3475
Joe Perches000d1cc12011-07-25 17:13:25 -07003476 ERROR("TRAILING_STATEMENTS",
3477 "trailing statements should be on next line\n" . $herecurr . $stat_real);
Andy Whitcroft8905a672007-11-28 16:21:06 -08003478 }
3479 }
3480
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003481# Check for bitwise tests written as boolean
3482 if ($line =~ /
3483 (?:
3484 (?:\[|\(|\&\&|\|\|)
3485 \s*0[xX][0-9]+\s*
3486 (?:\&\&|\|\|)
3487 |
3488 (?:\&\&|\|\|)
3489 \s*0[xX][0-9]+\s*
3490 (?:\&\&|\|\||\)|\])
3491 )/x)
3492 {
Joe Perches000d1cc12011-07-25 17:13:25 -07003493 WARN("HEXADECIMAL_BOOLEAN_TEST",
3494 "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003495 }
3496
Andy Whitcroft8905a672007-11-28 16:21:06 -08003497# if and else should not have general statements after it
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003498 if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
3499 my $s = $1;
3500 $s =~ s/$;//g; # Remove any comments
3501 if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003502 ERROR("TRAILING_STATEMENTS",
3503 "trailing statements should be on next line\n" . $herecurr);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003504 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003505 }
Andy Whitcroft39667782009-01-15 13:51:06 -08003506# if should not continue a brace
3507 if ($line =~ /}\s*if\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003508 ERROR("TRAILING_STATEMENTS",
3509 "trailing statements should be on next line\n" .
Andy Whitcroft39667782009-01-15 13:51:06 -08003510 $herecurr);
3511 }
Andy Whitcrofta1080bf2008-10-15 22:02:25 -07003512# case and default should not have general statements after them
3513 if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
3514 $line !~ /\G(?:
Andy Whitcroft3fef12d2008-10-15 22:02:36 -07003515 (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
Andy Whitcrofta1080bf2008-10-15 22:02:25 -07003516 \s*return\s+
3517 )/xg)
3518 {
Joe Perches000d1cc12011-07-25 17:13:25 -07003519 ERROR("TRAILING_STATEMENTS",
3520 "trailing statements should be on next line\n" . $herecurr);
Andy Whitcrofta1080bf2008-10-15 22:02:25 -07003521 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003522
3523 # Check for }<nl>else {, these must be at the same
3524 # indent level to be relevant to each other.
3525 if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
3526 $previndent == $indent) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003527 ERROR("ELSE_AFTER_BRACE",
3528 "else should follow close brace '}'\n" . $hereprev);
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003529 }
3530
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003531 if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and
3532 $previndent == $indent) {
3533 my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
3534
3535 # Find out what is on the end of the line after the
3536 # conditional.
Andy Whitcroft773647a2008-03-28 14:15:58 -07003537 substr($s, 0, length($c), '');
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003538 $s =~ s/\n.*//g;
3539
3540 if ($s =~ /^\s*;/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003541 ERROR("WHILE_AFTER_BRACE",
3542 "while should follow close brace '}'\n" . $hereprev);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003543 }
3544 }
3545
Joe Perches95e2c602013-07-03 15:05:20 -07003546#Specific variable tests
Joe Perches323c1262012-12-17 16:02:07 -08003547 while ($line =~ m{($Constant|$Lval)}g) {
3548 my $var = $1;
Joe Perches95e2c602013-07-03 15:05:20 -07003549
3550#gcc binary extension
3551 if ($var =~ /^$Binary$/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07003552 if (WARN("GCC_BINARY_CONSTANT",
3553 "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) &&
3554 $fix) {
3555 my $hexval = sprintf("0x%x", oct($var));
3556 $fixed[$linenr - 1] =~
3557 s/\b$var\b/$hexval/;
3558 }
Joe Perches95e2c602013-07-03 15:05:20 -07003559 }
3560
3561#CamelCase
Joe Perches807bd262013-07-03 15:05:22 -07003562 if ($var !~ /^$Constant$/ &&
Joe Perchesbe797942013-07-03 15:05:20 -07003563 $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
Joe Perches22735ce2013-07-03 15:05:33 -07003564#Ignore Page<foo> variants
Joe Perches807bd262013-07-03 15:05:22 -07003565 $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
Joe Perches22735ce2013-07-03 15:05:33 -07003566#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
Joe Perches34456862013-07-03 15:05:34 -07003567 $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/) {
Joe Perches7e781f62013-09-11 14:23:55 -07003568 while ($var =~ m{($Ident)}g) {
3569 my $word = $1;
3570 next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
Joe Perchesd8b07712013-11-12 15:10:06 -08003571 if ($check) {
3572 seed_camelcase_includes();
3573 if (!$file && !$camelcase_file_seeded) {
3574 seed_camelcase_file($realfile);
3575 $camelcase_file_seeded = 1;
3576 }
3577 }
Joe Perches7e781f62013-09-11 14:23:55 -07003578 if (!defined $camelcase{$word}) {
3579 $camelcase{$word} = 1;
3580 CHK("CAMELCASE",
3581 "Avoid CamelCase: <$word>\n" . $herecurr);
3582 }
Joe Perches34456862013-07-03 15:05:34 -07003583 }
Joe Perches323c1262012-12-17 16:02:07 -08003584 }
3585 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003586
3587#no spaces allowed after \ in define
Joe Perchesd5e616f2013-09-11 14:23:54 -07003588 if ($line =~ /\#\s*define.*\\\s+$/) {
3589 if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
3590 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
3591 $fix) {
3592 $fixed[$linenr - 1] =~ s/\s+$//;
3593 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003594 }
3595
Andy Whitcroft653d4872007-06-23 17:16:34 -07003596#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003597 if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
Andy Whitcrofte09dec42008-10-15 22:02:20 -07003598 my $file = "$1.h";
3599 my $checkfile = "include/linux/$file";
3600 if (-f "$root/$checkfile" &&
3601 $realfile ne $checkfile &&
Wolfram Sang7840a942010-08-09 17:20:57 -07003602 $1 !~ /$allowed_asm_includes/)
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003603 {
Andy Whitcrofte09dec42008-10-15 22:02:20 -07003604 if ($realfile =~ m{^arch/}) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003605 CHK("ARCH_INCLUDE_LINUX",
3606 "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
Andy Whitcrofte09dec42008-10-15 22:02:20 -07003607 } else {
Joe Perches000d1cc12011-07-25 17:13:25 -07003608 WARN("INCLUDE_LINUX",
3609 "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
Andy Whitcrofte09dec42008-10-15 22:02:20 -07003610 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003611 }
3612 }
3613
Andy Whitcroft653d4872007-06-23 17:16:34 -07003614# multi-statement macros should be enclosed in a do while loop, grab the
3615# first statement and ensure its the whole macro if its not enclosed
Andy Whitcroftcf655042008-03-04 14:28:20 -08003616# in a known good container
Andy Whitcroftb8f96a32008-07-23 21:29:07 -07003617 if ($realfile !~ m@/vmlinux.lds.h$@ &&
3618 $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003619 my $ln = $linenr;
3620 my $cnt = $realcnt;
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003621 my ($off, $dstat, $dcond, $rest);
3622 my $ctx = '';
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003623 ($dstat, $dcond, $ln, $cnt, $off) =
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003624 ctx_statement_block($linenr, $realcnt, 0);
3625 $ctx = $dstat;
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003626 #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
Andy Whitcrofta3bb97a2008-07-23 21:29:00 -07003627 #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003628
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003629 $dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
Andy Whitcroft292f1a92008-07-23 21:29:11 -07003630 $dstat =~ s/$;//g;
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003631 $dstat =~ s/\\\n.//g;
3632 $dstat =~ s/^\s*//s;
3633 $dstat =~ s/\s*$//s;
3634
3635 # Flatten any parentheses and braces
Andy Whitcroftbf30d6e2008-10-15 22:02:33 -07003636 while ($dstat =~ s/\([^\(\)]*\)/1/ ||
3637 $dstat =~ s/\{[^\{\}]*\}/1/ ||
Andy Whitcroftc81769f2012-01-10 15:10:10 -08003638 $dstat =~ s/\[[^\[\]]*\]/1/)
Andy Whitcroftbf30d6e2008-10-15 22:02:33 -07003639 {
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07003640 }
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003641
Andy Whitcrofte45bab82012-03-23 15:02:18 -07003642 # Flatten any obvious string concatentation.
3643 while ($dstat =~ s/("X*")\s*$Ident/$1/ ||
3644 $dstat =~ s/$Ident\s*("X*")/$1/)
3645 {
3646 }
3647
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003648 my $exceptions = qr{
3649 $Declare|
3650 module_param_named|
Kees Cooka0a0a7a2012-10-04 17:13:38 -07003651 MODULE_PARM_DESC|
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003652 DECLARE_PER_CPU|
3653 DEFINE_PER_CPU|
Andy Whitcroft383099f2009-01-06 14:41:18 -08003654 __typeof__\(|
Stefani Seibold22fd2d32010-03-05 13:43:52 -08003655 union|
3656 struct|
Andy Whitcroftea71a0a2009-09-21 17:04:38 -07003657 \.$Ident\s*=\s*|
3658 ^\"|\"$
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003659 }x;
Andy Whitcroft5eaa20b2010-10-26 14:23:18 -07003660 #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003661 if ($dstat ne '' &&
3662 $dstat !~ /^(?:$Ident|-?$Constant),$/ && # 10, // foo(),
3663 $dstat !~ /^(?:$Ident|-?$Constant);$/ && # foo();
Joe Perches3cc4b1c2013-07-03 15:05:27 -07003664 $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ && # 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
Andy Whitcroftb9df76a2012-03-23 15:02:17 -07003665 $dstat !~ /^'X'$/ && # character constants
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003666 $dstat !~ /$exceptions/ &&
3667 $dstat !~ /^\.$Ident\s*=/ && # .foo =
Joe Perchese942e2c2013-04-17 15:58:26 -07003668 $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo
Andy Whitcroft72f115f2012-01-10 15:10:06 -08003669 $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...)
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003670 $dstat !~ /^for\s*$Constant$/ && # for (...)
3671 $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ && # for (...) bar()
3672 $dstat !~ /^do\s*{/ && # do {...
Joe Perchesf95a7e62013-09-11 14:24:00 -07003673 $dstat !~ /^\({/ && # ({...
3674 $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003675 {
3676 $ctx =~ s/\n*$//;
3677 my $herectx = $here . "\n";
3678 my $cnt = statement_rawlines($ctx);
3679
3680 for (my $n = 0; $n < $cnt; $n++) {
3681 $herectx .= raw_line($linenr, $n) . "\n";
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003682 }
3683
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003684 if ($dstat =~ /;/) {
3685 ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
3686 "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
3687 } else {
Joe Perches000d1cc12011-07-25 17:13:25 -07003688 ERROR("COMPLEX_MACRO",
Andy Whitcroftf74bd192012-01-10 15:09:54 -08003689 "Macros with complex values should be enclosed in parenthesis\n" . "$herectx");
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003690 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07003691 }
Joe Perches5023d342012-12-17 16:01:47 -08003692
Joe Perches481eb482012-12-17 16:01:56 -08003693# check for line continuations outside of #defines, preprocessor #, and asm
Joe Perches5023d342012-12-17 16:01:47 -08003694
3695 } else {
3696 if ($prevline !~ /^..*\\$/ &&
Joe Perches481eb482012-12-17 16:01:56 -08003697 $line !~ /^\+\s*\#.*\\$/ && # preprocessor
3698 $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm
Joe Perches5023d342012-12-17 16:01:47 -08003699 $line =~ /^\+.*\\$/) {
3700 WARN("LINE_CONTINUATIONS",
3701 "Avoid unnecessary line continuations\n" . $herecurr);
3702 }
Andy Whitcroft0a920b52007-06-01 00:46:48 -07003703 }
3704
Joe Perchesb13edf72012-07-30 14:41:24 -07003705# do {} while (0) macro tests:
3706# single-statement macros do not need to be enclosed in do while (0) loop,
3707# macro should not end with a semicolon
3708 if ($^V && $^V ge 5.10.0 &&
3709 $realfile !~ m@/vmlinux.lds.h$@ &&
3710 $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
3711 my $ln = $linenr;
3712 my $cnt = $realcnt;
3713 my ($off, $dstat, $dcond, $rest);
3714 my $ctx = '';
3715 ($dstat, $dcond, $ln, $cnt, $off) =
3716 ctx_statement_block($linenr, $realcnt, 0);
3717 $ctx = $dstat;
3718
3719 $dstat =~ s/\\\n.//g;
3720
3721 if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
3722 my $stmts = $2;
3723 my $semis = $3;
3724
3725 $ctx =~ s/\n*$//;
3726 my $cnt = statement_rawlines($ctx);
3727 my $herectx = $here . "\n";
3728
3729 for (my $n = 0; $n < $cnt; $n++) {
3730 $herectx .= raw_line($linenr, $n) . "\n";
3731 }
3732
Joe Perchesac8e97f2012-08-21 16:15:53 -07003733 if (($stmts =~ tr/;/;/) == 1 &&
3734 $stmts !~ /^\s*(if|while|for|switch)\b/) {
Joe Perchesb13edf72012-07-30 14:41:24 -07003735 WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
3736 "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
3737 }
3738 if (defined $semis && $semis ne "") {
3739 WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
3740 "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
3741 }
3742 }
3743 }
3744
Mike Frysinger080ba922009-01-06 14:41:25 -08003745# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
3746# all assignments may have only one of the following with an assignment:
3747# .
3748# ALIGN(...)
3749# VMLINUX_SYMBOL(...)
3750 if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003751 WARN("MISSING_VMLINUX_SYMBOL",
3752 "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
Mike Frysinger080ba922009-01-06 14:41:25 -08003753 }
3754
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003755# check for redundant bracing round if etc
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003756 if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
3757 my ($level, $endln, @chunks) =
Andy Whitcroftcf655042008-03-04 14:28:20 -08003758 ctx_statement_full($linenr, $realcnt, 1);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003759 #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08003760 #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
3761 if ($#chunks > 0 && $level == 0) {
Joe Perchesaad4f612012-03-23 15:02:19 -07003762 my @allowed = ();
3763 my $allow = 0;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003764 my $seen = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -07003765 my $herectx = $here . "\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08003766 my $ln = $linenr - 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003767 for my $chunk (@chunks) {
3768 my ($cond, $block) = @{$chunk};
3769
Andy Whitcroft773647a2008-03-28 14:15:58 -07003770 # If the condition carries leading newlines, then count those as offsets.
3771 my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
3772 my $offset = statement_rawlines($whitespace) - 1;
3773
Joe Perchesaad4f612012-03-23 15:02:19 -07003774 $allowed[$allow] = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -07003775 #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
3776
3777 # We have looked at and allowed this specific line.
3778 $suppress_ifbraces{$ln + $offset} = 1;
3779
3780 $herectx .= "$rawlines[$ln + $offset]\n[...]\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08003781 $ln += statement_rawlines($block) - 1;
3782
Andy Whitcroft773647a2008-03-28 14:15:58 -07003783 substr($block, 0, length($cond), '');
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003784
3785 $seen++ if ($block =~ /^\s*{/);
3786
Joe Perchesaad4f612012-03-23 15:02:19 -07003787 #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08003788 if (statement_lines($cond) > 1) {
3789 #print "APW: ALLOWED: cond<$cond>\n";
Joe Perchesaad4f612012-03-23 15:02:19 -07003790 $allowed[$allow] = 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003791 }
3792 if ($block =~/\b(?:if|for|while)\b/) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08003793 #print "APW: ALLOWED: block<$block>\n";
Joe Perchesaad4f612012-03-23 15:02:19 -07003794 $allowed[$allow] = 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003795 }
Andy Whitcroftcf655042008-03-04 14:28:20 -08003796 if (statement_block_size($block) > 1) {
3797 #print "APW: ALLOWED: lines block<$block>\n";
Joe Perchesaad4f612012-03-23 15:02:19 -07003798 $allowed[$allow] = 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003799 }
Joe Perchesaad4f612012-03-23 15:02:19 -07003800 $allow++;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003801 }
Joe Perchesaad4f612012-03-23 15:02:19 -07003802 if ($seen) {
3803 my $sum_allowed = 0;
3804 foreach (@allowed) {
3805 $sum_allowed += $_;
3806 }
3807 if ($sum_allowed == 0) {
3808 WARN("BRACES",
3809 "braces {} are not necessary for any arm of this statement\n" . $herectx);
3810 } elsif ($sum_allowed != $allow &&
3811 $seen != $allow) {
3812 CHK("BRACES",
3813 "braces {} should be used on all arms of this statement\n" . $herectx);
3814 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003815 }
3816 }
3817 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07003818 if (!defined $suppress_ifbraces{$linenr - 1} &&
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003819 $line =~ /\b(if|while|for|else)\b/) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08003820 my $allowed = 0;
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003821
Andy Whitcroftcf655042008-03-04 14:28:20 -08003822 # Check the pre-context.
3823 if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
3824 #print "APW: ALLOWED: pre<$1>\n";
3825 $allowed = 1;
3826 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07003827
3828 my ($level, $endln, @chunks) =
3829 ctx_statement_full($linenr, $realcnt, $-[0]);
3830
Andy Whitcroftcf655042008-03-04 14:28:20 -08003831 # Check the condition.
3832 my ($cond, $block) = @{$chunks[0]};
Andy Whitcroft773647a2008-03-28 14:15:58 -07003833 #print "CHECKING<$linenr> cond<$cond> block<$block>\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08003834 if (defined $cond) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07003835 substr($block, 0, length($cond), '');
Andy Whitcroftcf655042008-03-04 14:28:20 -08003836 }
3837 if (statement_lines($cond) > 1) {
3838 #print "APW: ALLOWED: cond<$cond>\n";
3839 $allowed = 1;
3840 }
3841 if ($block =~/\b(?:if|for|while)\b/) {
3842 #print "APW: ALLOWED: block<$block>\n";
3843 $allowed = 1;
3844 }
3845 if (statement_block_size($block) > 1) {
3846 #print "APW: ALLOWED: lines block<$block>\n";
3847 $allowed = 1;
3848 }
3849 # Check the post-context.
3850 if (defined $chunks[1]) {
3851 my ($cond, $block) = @{$chunks[1]};
3852 if (defined $cond) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07003853 substr($block, 0, length($cond), '');
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003854 }
Andy Whitcroftcf655042008-03-04 14:28:20 -08003855 if ($block =~ /^\s*\{/) {
3856 #print "APW: ALLOWED: chunk-1 block<$block>\n";
3857 $allowed = 1;
3858 }
3859 }
3860 if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
Justin P. Mattock69932482011-07-26 23:06:29 -07003861 my $herectx = $here . "\n";
Andy Whitcroftf0556632008-10-15 22:02:23 -07003862 my $cnt = statement_rawlines($block);
Andy Whitcroftcf655042008-03-04 14:28:20 -08003863
Andy Whitcroftf0556632008-10-15 22:02:23 -07003864 for (my $n = 0; $n < $cnt; $n++) {
Justin P. Mattock69932482011-07-26 23:06:29 -07003865 $herectx .= raw_line($linenr, $n) . "\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08003866 }
3867
Joe Perches000d1cc12011-07-25 17:13:25 -07003868 WARN("BRACES",
3869 "braces {} are not necessary for single statement blocks\n" . $herectx);
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003870 }
3871 }
3872
Joe Perches0979ae62012-12-17 16:01:59 -08003873# check for unnecessary blank lines around braces
Joe Perches77b9a532013-07-03 15:05:29 -07003874 if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
Joe Perches0979ae62012-12-17 16:01:59 -08003875 CHK("BRACES",
3876 "Blank lines aren't necessary before a close brace '}'\n" . $hereprev);
3877 }
Joe Perches77b9a532013-07-03 15:05:29 -07003878 if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
Joe Perches0979ae62012-12-17 16:01:59 -08003879 CHK("BRACES",
3880 "Blank lines aren't necessary after an open brace '{'\n" . $hereprev);
3881 }
3882
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003883# no volatiles please
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003884 my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
3885 if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003886 WARN("VOLATILE",
3887 "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003888 }
3889
Andy Whitcroft00df3442007-06-08 13:47:06 -07003890# warn about #if 0
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003891 if ($line =~ /^.\s*\#\s*if\s+0\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003892 CHK("REDUNDANT_CODE",
3893 "if this code is redundant consider removing it\n" .
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07003894 $herecurr);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003895 }
3896
Andy Whitcroft03df4b52012-12-17 16:01:52 -08003897# check for needless "if (<foo>) fn(<foo>)" uses
3898 if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
3899 my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;';
3900 if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {
3901 WARN('NEEDLESS_IF',
3902 "$1(NULL) is safe this check is probably not required\n" . $hereprev);
Greg Kroah-Hartman4c432a82008-07-23 21:29:04 -07003903 }
3904 }
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003905
Joe Perches8716de32013-09-11 14:24:05 -07003906# check for bad placement of section $InitAttribute (e.g.: __initdata)
3907 if ($line =~ /(\b$InitAttribute\b)/) {
3908 my $attr = $1;
3909 if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
3910 my $ptr = $1;
3911 my $var = $2;
3912 if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
3913 ERROR("MISPLACED_INIT",
3914 "$attr should be placed after $var\n" . $herecurr)) ||
3915 ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
3916 WARN("MISPLACED_INIT",
3917 "$attr should be placed after $var\n" . $herecurr))) &&
3918 $fix) {
3919 $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;
3920 }
3921 }
3922 }
3923
Joe Perchese970b882013-11-12 15:10:10 -08003924# check for $InitAttributeData (ie: __initdata) with const
3925 if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
3926 my $attr = $1;
3927 $attr =~ /($InitAttributePrefix)(.*)/;
3928 my $attr_prefix = $1;
3929 my $attr_type = $2;
3930 if (ERROR("INIT_ATTRIBUTE",
3931 "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
3932 $fix) {
3933 $fixed[$linenr - 1] =~
3934 s/$InitAttributeData/${attr_prefix}initconst/;
3935 }
3936 }
3937
3938# check for $InitAttributeConst (ie: __initconst) without const
3939 if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
3940 my $attr = $1;
3941 if (ERROR("INIT_ATTRIBUTE",
3942 "Use of $attr requires a separate use of const\n" . $herecurr) &&
3943 $fix) {
3944 my $lead = $fixed[$linenr - 1] =~
3945 /(^\+\s*(?:static\s+))/;
3946 $lead = rtrim($1);
3947 $lead = "$lead " if ($lead !~ /^\+$/);
3948 $lead = "${lead}const ";
3949 $fixed[$linenr - 1] =~ s/(^\+\s*(?:static\s+))/$lead/;
3950 }
3951 }
3952
Joe Perchesfbdb8132014-04-03 14:49:14 -07003953# don't use __constant_<foo> functions outside of include/uapi/
3954 if ($realfile !~ m@^include/uapi/@ &&
3955 $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
3956 my $constant_func = $1;
3957 my $func = $constant_func;
3958 $func =~ s/^__constant_//;
3959 if (WARN("CONSTANT_CONVERSION",
3960 "$constant_func should be $func\n" . $herecurr) &&
3961 $fix) {
3962 $fixed[$linenr - 1] =~ s/\b$constant_func\b/$func/g;
3963 }
3964 }
3965
Patrick Pannuto1a15a252010-08-09 17:21:01 -07003966# prefer usleep_range over udelay
Bruce Allan37581c22013-02-21 16:44:19 -08003967 if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
Joe Perches43c1d772014-04-03 14:49:11 -07003968 my $delay = $1;
Patrick Pannuto1a15a252010-08-09 17:21:01 -07003969 # ignore udelay's < 10, however
Joe Perches43c1d772014-04-03 14:49:11 -07003970 if (! ($delay < 10) ) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003971 CHK("USLEEP_RANGE",
Joe Perches43c1d772014-04-03 14:49:11 -07003972 "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $herecurr);
3973 }
3974 if ($delay > 2000) {
3975 WARN("LONG_UDELAY",
3976 "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr);
Patrick Pannuto1a15a252010-08-09 17:21:01 -07003977 }
3978 }
3979
Patrick Pannuto09ef8722010-08-09 17:21:02 -07003980# warn about unexpectedly long msleep's
3981 if ($line =~ /\bmsleep\s*\((\d+)\);/) {
3982 if ($1 < 20) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003983 WARN("MSLEEP",
Joe Perches43c1d772014-04-03 14:49:11 -07003984 "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $herecurr);
Patrick Pannuto09ef8722010-08-09 17:21:02 -07003985 }
3986 }
3987
Joe Perches36ec1932013-07-03 15:05:25 -07003988# check for comparisons of jiffies
3989 if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
3990 WARN("JIFFIES_COMPARISON",
3991 "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
3992 }
3993
Joe Perches9d7a34a2013-07-03 15:05:26 -07003994# check for comparisons of get_jiffies_64()
3995 if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
3996 WARN("JIFFIES_COMPARISON",
3997 "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
3998 }
3999
Andy Whitcroft00df3442007-06-08 13:47:06 -07004000# warn about #ifdefs in C files
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004001# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
Andy Whitcroft00df3442007-06-08 13:47:06 -07004002# print "#ifdef in C files should be avoided\n";
4003# print "$herecurr";
4004# $clean = 0;
4005# }
4006
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07004007# warn about spacing in #ifdefs
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004008 if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
Joe Perches3705ce52013-07-03 15:05:31 -07004009 if (ERROR("SPACING",
4010 "exactly one space required after that #$1\n" . $herecurr) &&
4011 $fix) {
4012 $fixed[$linenr - 1] =~
4013 s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
4014 }
4015
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07004016 }
4017
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004018# check for spinlock_t definitions without a comment.
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004019 if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
4020 $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004021 my $which = $1;
4022 if (!ctx_has_comment($first_line, $linenr)) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004023 CHK("UNCOMMENTED_DEFINITION",
4024 "$1 definition without comment\n" . $herecurr);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004025 }
4026 }
4027# check for memory barriers without a comment.
4028 if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
4029 if (!ctx_has_comment($first_line, $linenr)) {
Joe Perchesc1fd7bb2013-11-12 15:10:11 -08004030 WARN("MEMORY_BARRIER",
4031 "memory barrier without comment\n" . $herecurr);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004032 }
4033 }
4034# check of hardware specific defines
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004035 if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004036 CHK("ARCH_DEFINES",
4037 "architecture specific defines should be avoided\n" . $herecurr);
Andy Whitcroft0a920b52007-06-01 00:46:48 -07004038 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07004039
Tobias Klauserd4977c72010-05-24 14:33:30 -07004040# Check that the storage class is at the beginning of a declaration
4041 if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004042 WARN("STORAGE_CLASS",
4043 "storage class should be at the beginning of the declaration\n" . $herecurr)
Tobias Klauserd4977c72010-05-24 14:33:30 -07004044 }
4045
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004046# check the location of the inline attribute, that it is between
4047# storage class and type.
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07004048 if ($line =~ /\b$Type\s+$Inline\b/ ||
4049 $line =~ /\b$Inline\s+$Storage\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004050 ERROR("INLINE_LOCATION",
4051 "inline keyword should sit between storage class and type\n" . $herecurr);
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004052 }
4053
Andy Whitcroft8905a672007-11-28 16:21:06 -08004054# Check for __inline__ and __inline, prefer inline
Joe Perches2b7ab452013-11-12 15:10:14 -08004055 if ($realfile !~ m@\binclude/uapi/@ &&
4056 $line =~ /\b(__inline__|__inline)\b/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004057 if (WARN("INLINE",
4058 "plain inline is preferred over $1\n" . $herecurr) &&
4059 $fix) {
4060 $fixed[$linenr - 1] =~ s/\b(__inline__|__inline)\b/inline/;
4061
4062 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08004063 }
4064
Joe Perches3d130fd2011-01-12 17:00:00 -08004065# Check for __attribute__ packed, prefer __packed
Joe Perches2b7ab452013-11-12 15:10:14 -08004066 if ($realfile !~ m@\binclude/uapi/@ &&
4067 $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004068 WARN("PREFER_PACKED",
4069 "__packed is preferred over __attribute__((packed))\n" . $herecurr);
Joe Perches3d130fd2011-01-12 17:00:00 -08004070 }
4071
Joe Perches39b7e282011-07-25 17:13:24 -07004072# Check for __attribute__ aligned, prefer __aligned
Joe Perches2b7ab452013-11-12 15:10:14 -08004073 if ($realfile !~ m@\binclude/uapi/@ &&
4074 $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004075 WARN("PREFER_ALIGNED",
4076 "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
Joe Perches39b7e282011-07-25 17:13:24 -07004077 }
4078
Joe Perches5f14d3b2012-01-10 15:09:52 -08004079# Check for __attribute__ format(printf, prefer __printf
Joe Perches2b7ab452013-11-12 15:10:14 -08004080 if ($realfile !~ m@\binclude/uapi/@ &&
4081 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004082 if (WARN("PREFER_PRINTF",
4083 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
4084 $fix) {
4085 $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
4086
4087 }
Joe Perches5f14d3b2012-01-10 15:09:52 -08004088 }
4089
Joe Perches6061d942012-03-23 15:02:16 -07004090# Check for __attribute__ format(scanf, prefer __scanf
Joe Perches2b7ab452013-11-12 15:10:14 -08004091 if ($realfile !~ m@\binclude/uapi/@ &&
4092 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004093 if (WARN("PREFER_SCANF",
4094 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
4095 $fix) {
4096 $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
4097 }
Joe Perches6061d942012-03-23 15:02:16 -07004098 }
4099
Joe Perches8f53a9b2010-03-05 13:43:48 -08004100# check for sizeof(&)
4101 if ($line =~ /\bsizeof\s*\(\s*\&/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004102 WARN("SIZEOF_ADDRESS",
4103 "sizeof(& should be avoided\n" . $herecurr);
Joe Perches8f53a9b2010-03-05 13:43:48 -08004104 }
4105
Joe Perches66c80b62012-07-30 14:41:22 -07004106# check for sizeof without parenthesis
4107 if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004108 if (WARN("SIZEOF_PARENTHESIS",
4109 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
4110 $fix) {
4111 $fixed[$linenr - 1] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
4112 }
Joe Perches66c80b62012-07-30 14:41:22 -07004113 }
4114
Joe Perches428e2fd2011-05-24 17:13:39 -07004115# check for line continuations in quoted strings with odd counts of "
4116 if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004117 WARN("LINE_CONTINUATIONS",
4118 "Avoid line continuations in quoted strings\n" . $herecurr);
Joe Perches428e2fd2011-05-24 17:13:39 -07004119 }
4120
Joe Perches88982fe2012-12-17 16:02:00 -08004121# check for struct spinlock declarations
4122 if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
4123 WARN("USE_SPINLOCK_T",
4124 "struct spinlock should be spinlock_t\n" . $herecurr);
4125 }
4126
Joe Perchesa6962d72013-04-29 16:18:13 -07004127# check for seq_printf uses that could be seq_puts
Joe Perches06668722013-11-12 15:10:07 -08004128 if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
Joe Perchesa6962d72013-04-29 16:18:13 -07004129 my $fmt = get_quoted_string($line, $rawline);
Joe Perches06668722013-11-12 15:10:07 -08004130 if ($fmt ne "" && $fmt !~ /[^\\]\%/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004131 if (WARN("PREFER_SEQ_PUTS",
4132 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
4133 $fix) {
4134 $fixed[$linenr - 1] =~ s/\bseq_printf\b/seq_puts/;
4135 }
Joe Perchesa6962d72013-04-29 16:18:13 -07004136 }
4137 }
4138
Andy Whitcroft554e1652012-01-10 15:09:57 -08004139# Check for misused memsets
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004140 if ($^V && $^V ge 5.10.0 &&
4141 defined $stat &&
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004142 $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {
Andy Whitcroft554e1652012-01-10 15:09:57 -08004143
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004144 my $ms_addr = $2;
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004145 my $ms_val = $7;
4146 my $ms_size = $12;
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004147
Andy Whitcroft554e1652012-01-10 15:09:57 -08004148 if ($ms_size =~ /^(0x|)0$/i) {
4149 ERROR("MEMSET",
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004150 "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 -08004151 } elsif ($ms_size =~ /^(0x|)1$/i) {
4152 WARN("MEMSET",
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004153 "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
4154 }
4155 }
4156
Joe Perches98a9bba2014-01-23 15:54:52 -08004157# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
4158 if ($^V && $^V ge 5.10.0 &&
4159 $line =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/s) {
4160 if (WARN("PREFER_ETHER_ADDR_COPY",
4161 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . $herecurr) &&
4162 $fix) {
4163 $fixed[$linenr - 1] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
4164 }
4165 }
4166
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004167# typecasts on min/max could be min_t/max_t
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004168 if ($^V && $^V ge 5.10.0 &&
4169 defined $stat &&
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004170 $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004171 if (defined $2 || defined $7) {
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004172 my $call = $1;
4173 my $cast1 = deparenthesize($2);
4174 my $arg1 = $3;
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004175 my $cast2 = deparenthesize($7);
4176 my $arg2 = $8;
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004177 my $cast;
4178
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004179 if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004180 $cast = "$cast1 or $cast2";
4181 } elsif ($cast1 ne "") {
4182 $cast = $cast1;
4183 } else {
4184 $cast = $cast2;
4185 }
4186 WARN("MINMAX",
4187 "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
Andy Whitcroft554e1652012-01-10 15:09:57 -08004188 }
4189 }
4190
Joe Perches4a273192012-07-30 14:41:20 -07004191# check usleep_range arguments
4192 if ($^V && $^V ge 5.10.0 &&
4193 defined $stat &&
4194 $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
4195 my $min = $1;
4196 my $max = $7;
4197 if ($min eq $max) {
4198 WARN("USLEEP_RANGE",
4199 "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
4200 } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
4201 $min > $max) {
4202 WARN("USLEEP_RANGE",
4203 "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
4204 }
4205 }
4206
Joe Perches823b7942013-11-12 15:10:15 -08004207# check for naked sscanf
4208 if ($^V && $^V ge 5.10.0 &&
4209 defined $stat &&
Joe Perches6c8bd702014-04-03 14:49:16 -07004210 $line =~ /\bsscanf\b/ &&
Joe Perches823b7942013-11-12 15:10:15 -08004211 ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
4212 $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
4213 $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
4214 my $lc = $stat =~ tr@\n@@;
4215 $lc = $lc + $linenr;
4216 my $stat_real = raw_line($linenr, 0);
4217 for (my $count = $linenr + 1; $count <= $lc; $count++) {
4218 $stat_real = $stat_real . "\n" . raw_line($count, 0);
4219 }
4220 WARN("NAKED_SSCANF",
4221 "unchecked sscanf return value\n" . "$here\n$stat_real\n");
4222 }
4223
Joe Perches70dc8a42013-09-11 14:23:58 -07004224# check for new externs in .h files.
4225 if ($realfile =~ /\.h$/ &&
4226 $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
Joe Perchesd1d85782013-09-24 15:27:46 -07004227 if (CHK("AVOID_EXTERNS",
4228 "extern prototypes should be avoided in .h files\n" . $herecurr) &&
Joe Perches70dc8a42013-09-11 14:23:58 -07004229 $fix) {
4230 $fixed[$linenr - 1] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
4231 }
4232 }
4233
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004234# check for new externs in .c files.
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004235 if ($realfile =~ /\.c$/ && defined $stat &&
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004236 $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004237 {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004238 my $function_name = $1;
4239 my $paren_space = $2;
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004240
4241 my $s = $stat;
4242 if (defined $cond) {
4243 substr($s, 0, length($cond), '');
4244 }
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004245 if ($s =~ /^\s*;/ &&
4246 $function_name ne 'uninitialized_var')
4247 {
Joe Perches000d1cc12011-07-25 17:13:25 -07004248 WARN("AVOID_EXTERNS",
4249 "externs should be avoided in .c files\n" . $herecurr);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004250 }
4251
4252 if ($paren_space =~ /\n/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004253 WARN("FUNCTION_ARGUMENTS",
4254 "arguments for function declarations should follow identifier\n" . $herecurr);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004255 }
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004256
4257 } elsif ($realfile =~ /\.c$/ && defined $stat &&
4258 $stat =~ /^.\s*extern\s+/)
4259 {
Joe Perches000d1cc12011-07-25 17:13:25 -07004260 WARN("AVOID_EXTERNS",
4261 "externs should be avoided in .c files\n" . $herecurr);
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004262 }
4263
4264# checks for new __setup's
4265 if ($rawline =~ /\b__setup\("([^"]*)"/) {
4266 my $name = $1;
4267
4268 if (!grep(/$name/, @setup_docs)) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004269 CHK("UNDOCUMENTED_SETUP",
4270 "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004271 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07004272 }
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07004273
4274# check for pointless casting of kmalloc return
Joe Perchescaf2a542011-01-12 16:59:56 -08004275 if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004276 WARN("UNNECESSARY_CASTS",
4277 "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07004278 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004279
Joe Perchesa640d252013-07-03 15:05:21 -07004280# alloc style
4281# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
4282 if ($^V && $^V ge 5.10.0 &&
4283 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
4284 CHK("ALLOC_SIZEOF_STRUCT",
4285 "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
4286 }
4287
Joe Perches972fdea2013-04-29 16:18:12 -07004288# check for krealloc arg reuse
4289 if ($^V && $^V ge 5.10.0 &&
4290 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
4291 WARN("KREALLOC_ARG_REUSE",
4292 "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
4293 }
4294
Joe Perches5ce59ae2013-02-21 16:44:18 -08004295# check for alloc argument mismatch
4296 if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
4297 WARN("ALLOC_ARRAY_ARGS",
4298 "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
4299 }
4300
David Rientjes7e4915e2014-01-23 15:54:42 -08004301# check for GFP_NOWAIT use
4302 if ($line =~ /\b__GFP_NOFAIL\b/) {
4303 WARN("__GFP_NOFAIL",
4304 "Use of __GFP_NOFAIL is deprecated, no new users should be added\n" . $herecurr);
4305 }
4306
Joe Perchescaf2a542011-01-12 16:59:56 -08004307# check for multiple semicolons
4308 if ($line =~ /;\s*;\s*$/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004309 if (WARN("ONE_SEMICOLON",
4310 "Statements terminations use 1 semicolon\n" . $herecurr) &&
4311 $fix) {
4312 $fixed[$linenr - 1] =~ s/(\s*;\s*){2,}$/;/g;
4313 }
Joe Perchesd1e2ad02012-12-17 16:02:01 -08004314 }
4315
Joe Perchesc34c09a2014-01-23 15:54:43 -08004316# check for case / default statements not preceeded by break/fallthrough/switch
4317 if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
4318 my $has_break = 0;
4319 my $has_statement = 0;
4320 my $count = 0;
4321 my $prevline = $linenr;
4322 while ($prevline > 1 && $count < 3 && !$has_break) {
4323 $prevline--;
4324 my $rline = $rawlines[$prevline - 1];
4325 my $fline = $lines[$prevline - 1];
4326 last if ($fline =~ /^\@\@/);
4327 next if ($fline =~ /^\-/);
4328 next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
4329 $has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
4330 next if ($fline =~ /^.[\s$;]*$/);
4331 $has_statement = 1;
4332 $count++;
4333 $has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/);
4334 }
4335 if (!$has_break && $has_statement) {
4336 WARN("MISSING_BREAK",
4337 "Possible switch case/default not preceeded by break or fallthrough comment\n" . $herecurr);
4338 }
4339 }
4340
Joe Perchesd1e2ad02012-12-17 16:02:01 -08004341# check for switch/default statements without a break;
4342 if ($^V && $^V ge 5.10.0 &&
4343 defined $stat &&
4344 $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
4345 my $ctx = '';
4346 my $herectx = $here . "\n";
4347 my $cnt = statement_rawlines($stat);
4348 for (my $n = 0; $n < $cnt; $n++) {
4349 $herectx .= raw_line($linenr, $n) . "\n";
4350 }
4351 WARN("DEFAULT_NO_BREAK",
4352 "switch default: should use break\n" . $herectx);
Joe Perchescaf2a542011-01-12 16:59:56 -08004353 }
4354
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004355# check for gcc specific __FUNCTION__
Joe Perchesd5e616f2013-09-11 14:23:54 -07004356 if ($line =~ /\b__FUNCTION__\b/) {
4357 if (WARN("USE_FUNC",
4358 "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr) &&
4359 $fix) {
4360 $fixed[$linenr - 1] =~ s/\b__FUNCTION__\b/__func__/g;
4361 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004362 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07004363
Joe Perches2c924882012-03-23 15:02:20 -07004364# check for use of yield()
4365 if ($line =~ /\byield\s*\(\s*\)/) {
4366 WARN("YIELD",
4367 "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr);
4368 }
4369
Joe Perches179f8f42013-07-03 15:05:30 -07004370# check for comparisons against true and false
4371 if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
4372 my $lead = $1;
4373 my $arg = $2;
4374 my $test = $3;
4375 my $otype = $4;
4376 my $trail = $5;
4377 my $op = "!";
4378
4379 ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
4380
4381 my $type = lc($otype);
4382 if ($type =~ /^(?:true|false)$/) {
4383 if (("$test" eq "==" && "$type" eq "true") ||
4384 ("$test" eq "!=" && "$type" eq "false")) {
4385 $op = "";
4386 }
4387
4388 CHK("BOOL_COMPARISON",
4389 "Using comparison to $otype is error prone\n" . $herecurr);
4390
4391## maybe suggesting a correct construct would better
4392## "Using comparison to $otype is error prone. Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
4393
4394 }
4395 }
4396
Thomas Gleixner4882720b2010-09-07 14:34:01 +00004397# check for semaphores initialized locked
4398 if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004399 WARN("CONSIDER_COMPLETION",
4400 "consider using a completion\n" . $herecurr);
Andy Whitcroft773647a2008-03-28 14:15:58 -07004401 }
Joe Perches6712d852012-03-23 15:02:20 -07004402
Joe Perches67d0a072011-10-31 17:13:10 -07004403# recommend kstrto* over simple_strto* and strict_strto*
4404 if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004405 WARN("CONSIDER_KSTRTO",
Joe Perches67d0a072011-10-31 17:13:10 -07004406 "$1 is obsolete, use k$3 instead\n" . $herecurr);
Andy Whitcroft773647a2008-03-28 14:15:58 -07004407 }
Joe Perches6712d852012-03-23 15:02:20 -07004408
Michael Ellermanf3db6632008-07-23 21:28:57 -07004409# check for __initcall(), use device_initcall() explicitly please
4410 if ($line =~ /^.\s*__initcall\s*\(/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004411 WARN("USE_DEVICE_INITCALL",
4412 "please use device_initcall() instead of __initcall()\n" . $herecurr);
Michael Ellermanf3db6632008-07-23 21:28:57 -07004413 }
Joe Perches6712d852012-03-23 15:02:20 -07004414
Emese Revfy79404842010-03-05 13:43:53 -08004415# check for various ops structs, ensure they are const.
4416 my $struct_ops = qr{acpi_dock_ops|
4417 address_space_operations|
4418 backlight_ops|
4419 block_device_operations|
4420 dentry_operations|
4421 dev_pm_ops|
4422 dma_map_ops|
4423 extent_io_ops|
4424 file_lock_operations|
4425 file_operations|
4426 hv_ops|
4427 ide_dma_ops|
4428 intel_dvo_dev_ops|
4429 item_operations|
4430 iwl_ops|
4431 kgdb_arch|
4432 kgdb_io|
4433 kset_uevent_ops|
4434 lock_manager_operations|
4435 microcode_ops|
4436 mtrr_ops|
4437 neigh_ops|
4438 nlmsvc_binding|
4439 pci_raw_ops|
4440 pipe_buf_operations|
4441 platform_hibernation_ops|
4442 platform_suspend_ops|
4443 proto_ops|
4444 rpc_pipe_ops|
4445 seq_operations|
4446 snd_ac97_build_ops|
4447 soc_pcmcia_socket_ops|
4448 stacktrace_ops|
4449 sysfs_ops|
4450 tty_operations|
4451 usb_mon_operations|
4452 wd_ops}x;
Andy Whitcroft6903ffb2009-01-15 13:51:07 -08004453 if ($line !~ /\bconst\b/ &&
Emese Revfy79404842010-03-05 13:43:53 -08004454 $line =~ /\bstruct\s+($struct_ops)\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004455 WARN("CONST_STRUCT",
4456 "struct $1 should normally be const\n" .
Andy Whitcroft6903ffb2009-01-15 13:51:07 -08004457 $herecurr);
Andy Whitcroft2b6db5c2009-01-06 14:41:29 -08004458 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07004459
4460# use of NR_CPUS is usually wrong
4461# ignore definitions of NR_CPUS and usage to define arrays as likely right
4462 if ($line =~ /\bNR_CPUS\b/ &&
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004463 $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
4464 $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004465 $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
4466 $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
4467 $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
Andy Whitcroft773647a2008-03-28 14:15:58 -07004468 {
Joe Perches000d1cc12011-07-25 17:13:25 -07004469 WARN("NR_CPUS",
4470 "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 -07004471 }
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004472
Joe Perches52ea8502013-11-12 15:10:09 -08004473# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
4474 if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
4475 ERROR("DEFINE_ARCH_HAS",
4476 "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
4477 }
4478
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004479# check for %L{u,d,i} in strings
4480 my $string;
4481 while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
4482 $string = substr($rawline, $-[1], $+[1] - $-[1]);
Andy Whitcroft2a1bc5d2008-10-15 22:02:23 -07004483 $string =~ s/%%/__/g;
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004484 if ($string =~ /(?<!%)%L[udi]/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004485 WARN("PRINTF_L",
4486 "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004487 last;
4488 }
4489 }
Andy Whitcroft691d77b2009-01-06 14:41:16 -08004490
4491# whine mightly about in_atomic
4492 if ($line =~ /\bin_atomic\s*\(/) {
4493 if ($realfile =~ m@^drivers/@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004494 ERROR("IN_ATOMIC",
4495 "do not use in_atomic in drivers\n" . $herecurr);
Andy Whitcroftf4a87732009-02-27 14:03:05 -08004496 } elsif ($realfile !~ m@^kernel/@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004497 WARN("IN_ATOMIC",
4498 "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
Andy Whitcroft691d77b2009-01-06 14:41:16 -08004499 }
4500 }
Peter Zijlstra1704f472010-03-19 01:37:42 +01004501
4502# check for lockdep_set_novalidate_class
4503 if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
4504 $line =~ /__lockdep_no_validate__\s*\)/ ) {
4505 if ($realfile !~ m@^kernel/lockdep@ &&
4506 $realfile !~ m@^include/linux/lockdep@ &&
4507 $realfile !~ m@^drivers/base/core@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004508 ERROR("LOCKDEP",
4509 "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
Peter Zijlstra1704f472010-03-19 01:37:42 +01004510 }
4511 }
Dave Jones88f88312011-01-12 16:59:59 -08004512
4513 if ($line =~ /debugfs_create_file.*S_IWUGO/ ||
4514 $line =~ /DEVICE_ATTR.*S_IWUGO/ ) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004515 WARN("EXPORTED_WORLD_WRITABLE",
4516 "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
Dave Jones88f88312011-01-12 16:59:59 -08004517 }
Joe Perches24358802014-04-03 14:49:13 -07004518
4519 foreach my $entry (@mode_permission_funcs) {
4520 my $func = $entry->[0];
4521 my $arg_pos = $entry->[1];
4522
4523 my $skip_args = "";
4524 if ($arg_pos > 1) {
4525 $arg_pos--;
4526 $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
4527 }
4528 my $test = "\\b$func\\s*\\(${skip_args}([\\d]+)\\s*[,\\)]";
4529 if ($^V && $^V ge 5.10.0 &&
4530 $line =~ /$test/) {
4531 my $val = $1;
4532 $val = $6 if ($skip_args ne "");
4533
Joe Perches1727cc72014-04-03 14:49:15 -07004534 if ($val !~ /^0$/ &&
4535 (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
4536 length($val) ne 4)) {
Joe Perches24358802014-04-03 14:49:13 -07004537 ERROR("NON_OCTAL_PERMISSIONS",
Joe Perches1727cc72014-04-03 14:49:15 -07004538 "Use 4 digit octal (0777) not decimal permissions\n" . $herecurr);
Joe Perches24358802014-04-03 14:49:13 -07004539 }
4540 }
4541 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004542 }
4543
4544 # If we have no input at all, then there is nothing to report on
4545 # so just keep quiet.
4546 if ($#rawlines == -1) {
4547 exit(0);
Andy Whitcroft0a920b52007-06-01 00:46:48 -07004548 }
4549
Andy Whitcroft8905a672007-11-28 16:21:06 -08004550 # In mailback mode only produce a report in the negative, for
4551 # things that appear to be patches.
4552 if ($mailback && ($clean == 1 || !$is_patch)) {
4553 exit(0);
4554 }
4555
4556 # This is not a patch, and we are are in 'no-patch' mode so
4557 # just keep quiet.
4558 if (!$chk_patch && !$is_patch) {
4559 exit(0);
4560 }
4561
4562 if (!$is_patch) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004563 ERROR("NOT_UNIFIED_DIFF",
4564 "Does not appear to be a unified-diff format patch\n");
Andy Whitcroft0a920b52007-06-01 00:46:48 -07004565 }
4566 if ($is_patch && $chk_signoff && $signoff == 0) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004567 ERROR("MISSING_SIGN_OFF",
4568 "Missing Signed-off-by: line(s)\n");
Andy Whitcroft0a920b52007-06-01 00:46:48 -07004569 }
4570
Andy Whitcroft8905a672007-11-28 16:21:06 -08004571 print report_dump();
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004572 if ($summary && !($clean == 1 && $quiet == 1)) {
4573 print "$filename " if ($summary_file);
Andy Whitcroft8905a672007-11-28 16:21:06 -08004574 print "total: $cnt_error errors, $cnt_warn warnings, " .
4575 (($check)? "$cnt_chk checks, " : "") .
4576 "$cnt_lines lines checked\n";
4577 print "\n" if ($quiet == 0);
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07004578 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08004579
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07004580 if ($quiet == 0) {
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004581
4582 if ($^V lt 5.10.0) {
4583 print("NOTE: perl $^V is not modern enough to detect all possible issues.\n");
4584 print("An upgrade to at least perl v5.10.0 is suggested.\n\n");
4585 }
4586
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07004587 # If there were whitespace errors which cleanpatch can fix
4588 # then suggest that.
4589 if ($rpt_cleaners) {
4590 print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n";
4591 print " scripts/cleanfile\n\n";
Mike Frysingerb0781212011-03-22 16:34:43 -07004592 $rpt_cleaners = 0;
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07004593 }
4594 }
4595
Joe Perches91bfe482013-09-11 14:23:59 -07004596 hash_show_words(\%use_type, "Used");
4597 hash_show_words(\%ignore_type, "Ignored");
Joe Perches000d1cc12011-07-25 17:13:25 -07004598
Joe Perches3705ce52013-07-03 15:05:31 -07004599 if ($clean == 0 && $fix && "@rawlines" ne "@fixed") {
Joe Perches9624b8d2014-01-23 15:54:44 -08004600 my $newfile = $filename;
4601 $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
Joe Perches3705ce52013-07-03 15:05:31 -07004602 my $linecount = 0;
4603 my $f;
4604
4605 open($f, '>', $newfile)
4606 or die "$P: Can't open $newfile for write\n";
4607 foreach my $fixed_line (@fixed) {
4608 $linecount++;
4609 if ($file) {
4610 if ($linecount > 3) {
4611 $fixed_line =~ s/^\+//;
4612 print $f $fixed_line. "\n";
4613 }
4614 } else {
4615 print $f $fixed_line . "\n";
4616 }
4617 }
4618 close($f);
4619
4620 if (!$quiet) {
4621 print << "EOM";
4622Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
4623
4624Do _NOT_ trust the results written to this file.
4625Do _NOT_ submit these changes without inspecting them for correctness.
4626
4627This EXPERIMENTAL file is simply a convenience to help rewrite patches.
4628No warranties, expressed or implied...
4629
4630EOM
4631 }
4632 }
4633
Andy Whitcroft0a920b52007-06-01 00:46:48 -07004634 if ($clean == 1 && $quiet == 0) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08004635 print "$vname has no obvious style problems and is ready for submission.\n"
Andy Whitcroft0a920b52007-06-01 00:46:48 -07004636 }
4637 if ($clean == 0 && $quiet == 0) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004638 print << "EOM";
4639$vname has style problems, please review.
4640
4641If any of these errors are false positives, please report
4642them to the maintainer, see CHECKPATCH in MAINTAINERS.
4643EOM
Andy Whitcroft0a920b52007-06-01 00:46:48 -07004644 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004645
Andy Whitcroft0a920b52007-06-01 00:46:48 -07004646 return $clean;
4647}