diff options
| author | Alexey Dobriyan <adobriyan@gmail.com> | 2017-02-27 17:30:05 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-02-27 21:43:48 -0500 |
| commit | 522b837c672eba9e9fb69f9f52bced0256dc6697 (patch) | |
| tree | d9cd9c08c655b4c1fce3f883274bb93506f32538 /scripts | |
| parent | 5b5e0928f742cfa853b2411400a1b19fa379d758 (diff) | |
checkpatch: warn when formats use %Z and suggest %z
vsnprintf extension %Z<foo> is non-standard C. Suggest the use of %z
instead.
Miscellanea:
- Correct the misuse of type string PRINTF_0xDECIMAL type strings are
supposed to be uppercase only. Fix this and add tr/[a-z]/[A-Z] to the
type check in case I forget this again sometime in the future.
- Improve the mechanism to find these defects so all 3 current checks
are done on the format string
[joe@perches.com: correct the misuse of type string PRINTF_0xDECIMAL, improve the mechanism to find these defects]
Link: http://lkml.kernel.org/r/4e3ad74b0c9dc229b06018a2d79655308ddbbebd.1484014173.git.joe@perches.com
Link: http://lkml.kernel.org/r/20170109235955.GA6787@avx2
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/checkpatch.pl | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 918259a55f65..baa3c7be04ad 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl | |||
| @@ -1848,6 +1848,8 @@ my $prefix = ''; | |||
| 1848 | sub show_type { | 1848 | sub show_type { |
| 1849 | my ($type) = @_; | 1849 | my ($type) = @_; |
| 1850 | 1850 | ||
| 1851 | $type =~ tr/[a-z]/[A-Z]/; | ||
| 1852 | |||
| 1851 | return defined $use_type{$type} if (scalar keys %use_type > 0); | 1853 | return defined $use_type{$type} if (scalar keys %use_type > 0); |
| 1852 | 1854 | ||
| 1853 | return !defined $ignore_type{$type}; | 1855 | return !defined $ignore_type{$type}; |
| @@ -5204,18 +5206,27 @@ sub process { | |||
| 5204 | "Consecutive strings are generally better as a single string\n" . $herecurr); | 5206 | "Consecutive strings are generally better as a single string\n" . $herecurr); |
| 5205 | } | 5207 | } |
| 5206 | 5208 | ||
| 5207 | # check for %L{u,d,i} and 0x%[udi] in strings | 5209 | # check for non-standard and hex prefixed decimal printf formats |
| 5208 | my $string; | 5210 | my $show_L = 1; #don't show the same defect twice |
| 5211 | my $show_Z = 1; | ||
| 5209 | while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) { | 5212 | while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) { |
| 5210 | $string = substr($rawline, $-[1], $+[1] - $-[1]); | 5213 | my $string = substr($rawline, $-[1], $+[1] - $-[1]); |
| 5211 | $string =~ s/%%/__/g; | 5214 | $string =~ s/%%/__/g; |
| 5212 | if ($string =~ /(?<!%)%[\*\d\.\$]*L[udi]/) { | 5215 | # check for %L |
| 5216 | if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) { | ||
| 5213 | WARN("PRINTF_L", | 5217 | WARN("PRINTF_L", |
| 5214 | "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr); | 5218 | "\%L$1 is non-standard C, use %ll$1\n" . $herecurr); |
| 5215 | last; | 5219 | $show_L = 0; |
| 5216 | } | 5220 | } |
| 5217 | if ($string =~ /0x%[\*\d\.\$\Llzth]*[udi]/) { | 5221 | # check for %Z |
| 5218 | ERROR("PRINTF_0xDECIMAL", | 5222 | if ($show_Z && $string =~ /%[\*\d\.\$]*Z([diouxX])/) { |
| 5223 | WARN("PRINTF_Z", | ||
| 5224 | "%Z$1 is non-standard C, use %z$1\n" . $herecurr); | ||
| 5225 | $show_Z = 0; | ||
| 5226 | } | ||
| 5227 | # check for 0x<decimal> | ||
| 5228 | if ($string =~ /0x%[\*\d\.\$\Llzth]*[diou]/) { | ||
| 5229 | ERROR("PRINTF_0XDECIMAL", | ||
| 5219 | "Prefixing 0x with decimal output is defective\n" . $herecurr); | 5230 | "Prefixing 0x with decimal output is defective\n" . $herecurr); |
| 5220 | } | 5231 | } |
| 5221 | } | 5232 | } |
