mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
scripts/checkpatch.pl: Resync with v5.16
This resyncs us with the version found in v5.16 of the Linux kernel with the following exceptions: - Keep our u-boot specific tests / code area. - Change the location of checkpatch.rst - Drop the "use strscpy" test as we don't have that, but do have strlcpy and want that used now. - Keep debug/printf in the list for $logFunctions This also syncs the spdxcheck.py tool and all the associated documentation. S Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
68f08966b0
commit
587254ebcf
3 changed files with 642 additions and 97 deletions
|
@ -246,6 +246,7 @@ Allocation style
|
||||||
The first argument for kcalloc or kmalloc_array should be the
|
The first argument for kcalloc or kmalloc_array should be the
|
||||||
number of elements. sizeof() as the first argument is generally
|
number of elements. sizeof() as the first argument is generally
|
||||||
wrong.
|
wrong.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/core-api/memory-allocation.html
|
See: https://www.kernel.org/doc/html/latest/core-api/memory-allocation.html
|
||||||
|
|
||||||
**ALLOC_SIZEOF_STRUCT**
|
**ALLOC_SIZEOF_STRUCT**
|
||||||
|
@ -264,6 +265,7 @@ Allocation style
|
||||||
**ALLOC_WITH_MULTIPLY**
|
**ALLOC_WITH_MULTIPLY**
|
||||||
Prefer kmalloc_array/kcalloc over kmalloc/kzalloc with a
|
Prefer kmalloc_array/kcalloc over kmalloc/kzalloc with a
|
||||||
sizeof multiply.
|
sizeof multiply.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/core-api/memory-allocation.html
|
See: https://www.kernel.org/doc/html/latest/core-api/memory-allocation.html
|
||||||
|
|
||||||
|
|
||||||
|
@ -284,6 +286,7 @@ API usage
|
||||||
BUG() or BUG_ON() should be avoided totally.
|
BUG() or BUG_ON() should be avoided totally.
|
||||||
Use WARN() and WARN_ON() instead, and handle the "impossible"
|
Use WARN() and WARN_ON() instead, and handle the "impossible"
|
||||||
error condition as gracefully as possible.
|
error condition as gracefully as possible.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/deprecated.html#bug-and-bug-on
|
See: https://www.kernel.org/doc/html/latest/process/deprecated.html#bug-and-bug-on
|
||||||
|
|
||||||
**CONSIDER_KSTRTO**
|
**CONSIDER_KSTRTO**
|
||||||
|
@ -292,12 +295,161 @@ API usage
|
||||||
may lead to unexpected results in callers. The respective kstrtol(),
|
may lead to unexpected results in callers. The respective kstrtol(),
|
||||||
kstrtoll(), kstrtoul(), and kstrtoull() functions tend to be the
|
kstrtoll(), kstrtoul(), and kstrtoull() functions tend to be the
|
||||||
correct replacements.
|
correct replacements.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/deprecated.html#simple-strtol-simple-strtoll-simple-strtoul-simple-strtoull
|
See: https://www.kernel.org/doc/html/latest/process/deprecated.html#simple-strtol-simple-strtoll-simple-strtoul-simple-strtoull
|
||||||
|
|
||||||
|
**CONSTANT_CONVERSION**
|
||||||
|
Use of __constant_<foo> form is discouraged for the following functions::
|
||||||
|
|
||||||
|
__constant_cpu_to_be[x]
|
||||||
|
__constant_cpu_to_le[x]
|
||||||
|
__constant_be[x]_to_cpu
|
||||||
|
__constant_le[x]_to_cpu
|
||||||
|
__constant_htons
|
||||||
|
__constant_ntohs
|
||||||
|
|
||||||
|
Using any of these outside of include/uapi/ is not preferred as using the
|
||||||
|
function without __constant_ is identical when the argument is a
|
||||||
|
constant.
|
||||||
|
|
||||||
|
In big endian systems, the macros like __constant_cpu_to_be32(x) and
|
||||||
|
cpu_to_be32(x) expand to the same expression::
|
||||||
|
|
||||||
|
#define __constant_cpu_to_be32(x) ((__force __be32)(__u32)(x))
|
||||||
|
#define __cpu_to_be32(x) ((__force __be32)(__u32)(x))
|
||||||
|
|
||||||
|
In little endian systems, the macros __constant_cpu_to_be32(x) and
|
||||||
|
cpu_to_be32(x) expand to __constant_swab32 and __swab32. __swab32
|
||||||
|
has a __builtin_constant_p check::
|
||||||
|
|
||||||
|
#define __swab32(x) \
|
||||||
|
(__builtin_constant_p((__u32)(x)) ? \
|
||||||
|
___constant_swab32(x) : \
|
||||||
|
__fswab32(x))
|
||||||
|
|
||||||
|
So ultimately they have a special case for constants.
|
||||||
|
Similar is the case with all of the macros in the list. Thus
|
||||||
|
using the __constant_... forms are unnecessarily verbose and
|
||||||
|
not preferred outside of include/uapi.
|
||||||
|
|
||||||
|
See: https://lore.kernel.org/lkml/1400106425.12666.6.camel@joe-AO725/
|
||||||
|
|
||||||
|
**DEPRECATED_API**
|
||||||
|
Usage of a deprecated RCU API is detected. It is recommended to replace
|
||||||
|
old flavourful RCU APIs by their new vanilla-RCU counterparts.
|
||||||
|
|
||||||
|
The full list of available RCU APIs can be viewed from the kernel docs.
|
||||||
|
|
||||||
|
See: https://www.kernel.org/doc/html/latest/RCU/whatisRCU.html#full-list-of-rcu-apis
|
||||||
|
|
||||||
|
**DEPRECATED_VARIABLE**
|
||||||
|
EXTRA_{A,C,CPP,LD}FLAGS are deprecated and should be replaced by the new
|
||||||
|
flags added via commit f77bf01425b1 ("kbuild: introduce ccflags-y,
|
||||||
|
asflags-y and ldflags-y").
|
||||||
|
|
||||||
|
The following conversion scheme maybe used::
|
||||||
|
|
||||||
|
EXTRA_AFLAGS -> asflags-y
|
||||||
|
EXTRA_CFLAGS -> ccflags-y
|
||||||
|
EXTRA_CPPFLAGS -> cppflags-y
|
||||||
|
EXTRA_LDFLAGS -> ldflags-y
|
||||||
|
|
||||||
|
See:
|
||||||
|
|
||||||
|
1. https://lore.kernel.org/lkml/20070930191054.GA15876@uranus.ravnborg.org/
|
||||||
|
2. https://lore.kernel.org/lkml/1313384834-24433-12-git-send-email-lacombar@gmail.com/
|
||||||
|
3. https://www.kernel.org/doc/html/latest/kbuild/makefiles.html#compilation-flags
|
||||||
|
|
||||||
|
**DEVICE_ATTR_FUNCTIONS**
|
||||||
|
The function names used in DEVICE_ATTR is unusual.
|
||||||
|
Typically, the store and show functions are used with <attr>_store and
|
||||||
|
<attr>_show, where <attr> is a named attribute variable of the device.
|
||||||
|
|
||||||
|
Consider the following examples::
|
||||||
|
|
||||||
|
static DEVICE_ATTR(type, 0444, type_show, NULL);
|
||||||
|
static DEVICE_ATTR(power, 0644, power_show, power_store);
|
||||||
|
|
||||||
|
The function names should preferably follow the above pattern.
|
||||||
|
|
||||||
|
See: https://www.kernel.org/doc/html/latest/driver-api/driver-model/device.html#attributes
|
||||||
|
|
||||||
|
**DEVICE_ATTR_RO**
|
||||||
|
The DEVICE_ATTR_RO(name) helper macro can be used instead of
|
||||||
|
DEVICE_ATTR(name, 0444, name_show, NULL);
|
||||||
|
|
||||||
|
Note that the macro automatically appends _show to the named
|
||||||
|
attribute variable of the device for the show method.
|
||||||
|
|
||||||
|
See: https://www.kernel.org/doc/html/latest/driver-api/driver-model/device.html#attributes
|
||||||
|
|
||||||
|
**DEVICE_ATTR_RW**
|
||||||
|
The DEVICE_ATTR_RW(name) helper macro can be used instead of
|
||||||
|
DEVICE_ATTR(name, 0644, name_show, name_store);
|
||||||
|
|
||||||
|
Note that the macro automatically appends _show and _store to the
|
||||||
|
named attribute variable of the device for the show and store methods.
|
||||||
|
|
||||||
|
See: https://www.kernel.org/doc/html/latest/driver-api/driver-model/device.html#attributes
|
||||||
|
|
||||||
|
**DEVICE_ATTR_WO**
|
||||||
|
The DEVICE_AATR_WO(name) helper macro can be used instead of
|
||||||
|
DEVICE_ATTR(name, 0200, NULL, name_store);
|
||||||
|
|
||||||
|
Note that the macro automatically appends _store to the
|
||||||
|
named attribute variable of the device for the store method.
|
||||||
|
|
||||||
|
See: https://www.kernel.org/doc/html/latest/driver-api/driver-model/device.html#attributes
|
||||||
|
|
||||||
|
**DUPLICATED_SYSCTL_CONST**
|
||||||
|
Commit d91bff3011cf ("proc/sysctl: add shared variables for range
|
||||||
|
check") added some shared const variables to be used instead of a local
|
||||||
|
copy in each source file.
|
||||||
|
|
||||||
|
Consider replacing the sysctl range checking value with the shared
|
||||||
|
one in include/linux/sysctl.h. The following conversion scheme may
|
||||||
|
be used::
|
||||||
|
|
||||||
|
&zero -> SYSCTL_ZERO
|
||||||
|
&one -> SYSCTL_ONE
|
||||||
|
&int_max -> SYSCTL_INT_MAX
|
||||||
|
|
||||||
|
See:
|
||||||
|
|
||||||
|
1. https://lore.kernel.org/lkml/20190430180111.10688-1-mcroce@redhat.com/
|
||||||
|
2. https://lore.kernel.org/lkml/20190531131422.14970-1-mcroce@redhat.com/
|
||||||
|
|
||||||
|
**ENOSYS**
|
||||||
|
ENOSYS means that a nonexistent system call was called.
|
||||||
|
Earlier, it was wrongly used for things like invalid operations on
|
||||||
|
otherwise valid syscalls. This should be avoided in new code.
|
||||||
|
|
||||||
|
See: https://lore.kernel.org/lkml/5eb299021dec23c1a48fa7d9f2c8b794e967766d.1408730669.git.luto@amacapital.net/
|
||||||
|
|
||||||
|
**ENOTSUPP**
|
||||||
|
ENOTSUPP is not a standard error code and should be avoided in new patches.
|
||||||
|
EOPNOTSUPP should be used instead.
|
||||||
|
|
||||||
|
See: https://lore.kernel.org/netdev/20200510182252.GA411829@lunn.ch/
|
||||||
|
|
||||||
|
**EXPORT_SYMBOL**
|
||||||
|
EXPORT_SYMBOL should immediately follow the symbol to be exported.
|
||||||
|
|
||||||
|
**IN_ATOMIC**
|
||||||
|
in_atomic() is not for driver use so any such use is reported as an ERROR.
|
||||||
|
Also in_atomic() is often used to determine if sleeping is permitted,
|
||||||
|
but it is not reliable in this use model. Therefore its use is
|
||||||
|
strongly discouraged.
|
||||||
|
|
||||||
|
However, in_atomic() is ok for core kernel use.
|
||||||
|
|
||||||
|
See: https://lore.kernel.org/lkml/20080320201723.b87b3732.akpm@linux-foundation.org/
|
||||||
|
|
||||||
**LOCKDEP**
|
**LOCKDEP**
|
||||||
The lockdep_no_validate class was added as a temporary measure to
|
The lockdep_no_validate class was added as a temporary measure to
|
||||||
prevent warnings on conversion of device->sem to device->mutex.
|
prevent warnings on conversion of device->sem to device->mutex.
|
||||||
It should not be used for any other purpose.
|
It should not be used for any other purpose.
|
||||||
|
|
||||||
See: https://lore.kernel.org/lkml/1268959062.9440.467.camel@laptop/
|
See: https://lore.kernel.org/lkml/1268959062.9440.467.camel@laptop/
|
||||||
|
|
||||||
**MALFORMED_INCLUDE**
|
**MALFORMED_INCLUDE**
|
||||||
|
@ -308,14 +460,21 @@ API usage
|
||||||
**USE_LOCKDEP**
|
**USE_LOCKDEP**
|
||||||
lockdep_assert_held() annotations should be preferred over
|
lockdep_assert_held() annotations should be preferred over
|
||||||
assertions based on spin_is_locked()
|
assertions based on spin_is_locked()
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/locking/lockdep-design.html#annotations
|
See: https://www.kernel.org/doc/html/latest/locking/lockdep-design.html#annotations
|
||||||
|
|
||||||
**UAPI_INCLUDE**
|
**UAPI_INCLUDE**
|
||||||
No #include statements in include/uapi should use a uapi/ path.
|
No #include statements in include/uapi should use a uapi/ path.
|
||||||
|
|
||||||
|
**USLEEP_RANGE**
|
||||||
|
usleep_range() should be preferred over udelay(). The proper way of
|
||||||
|
using usleep_range() is mentioned in the kernel docs.
|
||||||
|
|
||||||
Comment style
|
See: https://www.kernel.org/doc/html/latest/timers/timers-howto.html#delays-information-on-the-various-kernel-delay-sleep-mechanisms
|
||||||
-------------
|
|
||||||
|
|
||||||
|
Comments
|
||||||
|
--------
|
||||||
|
|
||||||
**BLOCK_COMMENT_STYLE**
|
**BLOCK_COMMENT_STYLE**
|
||||||
The comment style is incorrect. The preferred style for multi-
|
The comment style is incorrect. The preferred style for multi-
|
||||||
|
@ -338,8 +497,24 @@ Comment style
|
||||||
**C99_COMMENTS**
|
**C99_COMMENTS**
|
||||||
C99 style single line comments (//) should not be used.
|
C99 style single line comments (//) should not be used.
|
||||||
Prefer the block comment style instead.
|
Prefer the block comment style instead.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#commenting
|
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#commenting
|
||||||
|
|
||||||
|
**DATA_RACE**
|
||||||
|
Applications of data_race() should have a comment so as to document the
|
||||||
|
reasoning behind why it was deemed safe.
|
||||||
|
|
||||||
|
See: https://lore.kernel.org/lkml/20200401101714.44781-1-elver@google.com/
|
||||||
|
|
||||||
|
**FSF_MAILING_ADDRESS**
|
||||||
|
Kernel maintainers reject new instances of the GPL boilerplate paragraph
|
||||||
|
directing people to write to the FSF for a copy of the GPL, since the
|
||||||
|
FSF has moved in the past and may do so again.
|
||||||
|
So do not write paragraphs about writing to the Free Software Foundation's
|
||||||
|
mailing address.
|
||||||
|
|
||||||
|
See: https://lore.kernel.org/lkml/20131006222342.GT19510@leaf/
|
||||||
|
|
||||||
|
|
||||||
Commit message
|
Commit message
|
||||||
--------------
|
--------------
|
||||||
|
@ -347,6 +522,7 @@ Commit message
|
||||||
**BAD_SIGN_OFF**
|
**BAD_SIGN_OFF**
|
||||||
The signed-off-by line does not fall in line with the standards
|
The signed-off-by line does not fall in line with the standards
|
||||||
specified by the community.
|
specified by the community.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#developer-s-certificate-of-origin-1-1
|
See: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#developer-s-certificate-of-origin-1-1
|
||||||
|
|
||||||
**BAD_STABLE_ADDRESS_STYLE**
|
**BAD_STABLE_ADDRESS_STYLE**
|
||||||
|
@ -368,12 +544,33 @@ Commit message
|
||||||
**COMMIT_MESSAGE**
|
**COMMIT_MESSAGE**
|
||||||
The patch is missing a commit description. A brief
|
The patch is missing a commit description. A brief
|
||||||
description of the changes made by the patch should be added.
|
description of the changes made by the patch should be added.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#describe-your-changes
|
See: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#describe-your-changes
|
||||||
|
|
||||||
|
**EMAIL_SUBJECT**
|
||||||
|
Naming the tool that found the issue is not very useful in the
|
||||||
|
subject line. A good subject line summarizes the change that
|
||||||
|
the patch brings.
|
||||||
|
|
||||||
|
See: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#describe-your-changes
|
||||||
|
|
||||||
|
**FROM_SIGN_OFF_MISMATCH**
|
||||||
|
The author's email does not match with that in the Signed-off-by:
|
||||||
|
line(s). This can be sometimes caused due to an improperly configured
|
||||||
|
email client.
|
||||||
|
|
||||||
|
This message is emitted due to any of the following reasons::
|
||||||
|
|
||||||
|
- The email names do not match.
|
||||||
|
- The email addresses do not match.
|
||||||
|
- The email subaddresses do not match.
|
||||||
|
- The email comments do not match.
|
||||||
|
|
||||||
**MISSING_SIGN_OFF**
|
**MISSING_SIGN_OFF**
|
||||||
The patch is missing a Signed-off-by line. A signed-off-by
|
The patch is missing a Signed-off-by line. A signed-off-by
|
||||||
line should be added according to Developer's certificate of
|
line should be added according to Developer's certificate of
|
||||||
Origin.
|
Origin.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin
|
See: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin
|
||||||
|
|
||||||
**NO_AUTHOR_SIGN_OFF**
|
**NO_AUTHOR_SIGN_OFF**
|
||||||
|
@ -382,6 +579,7 @@ Commit message
|
||||||
end of explanation of the patch to denote that the author has
|
end of explanation of the patch to denote that the author has
|
||||||
written it or otherwise has the rights to pass it on as an open
|
written it or otherwise has the rights to pass it on as an open
|
||||||
source patch.
|
source patch.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin
|
See: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin
|
||||||
|
|
||||||
**DIFF_IN_COMMIT_MSG**
|
**DIFF_IN_COMMIT_MSG**
|
||||||
|
@ -389,6 +587,7 @@ Commit message
|
||||||
This causes problems when one tries to apply a file containing both
|
This causes problems when one tries to apply a file containing both
|
||||||
the changelog and the diff because patch(1) tries to apply the diff
|
the changelog and the diff because patch(1) tries to apply the diff
|
||||||
which it found in the changelog.
|
which it found in the changelog.
|
||||||
|
|
||||||
See: https://lore.kernel.org/lkml/20150611134006.9df79a893e3636019ad2759e@linux-foundation.org/
|
See: https://lore.kernel.org/lkml/20150611134006.9df79a893e3636019ad2759e@linux-foundation.org/
|
||||||
|
|
||||||
**GERRIT_CHANGE_ID**
|
**GERRIT_CHANGE_ID**
|
||||||
|
@ -431,6 +630,7 @@ Comparison style
|
||||||
**BOOL_COMPARISON**
|
**BOOL_COMPARISON**
|
||||||
Comparisons of A to true and false are better written
|
Comparisons of A to true and false are better written
|
||||||
as A and !A.
|
as A and !A.
|
||||||
|
|
||||||
See: https://lore.kernel.org/lkml/1365563834.27174.12.camel@joe-AO722/
|
See: https://lore.kernel.org/lkml/1365563834.27174.12.camel@joe-AO722/
|
||||||
|
|
||||||
**COMPARISON_TO_NULL**
|
**COMPARISON_TO_NULL**
|
||||||
|
@ -442,6 +642,120 @@ Comparison style
|
||||||
side of the test should be avoided.
|
side of the test should be avoided.
|
||||||
|
|
||||||
|
|
||||||
|
Indentation and Line Breaks
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
**CODE_INDENT**
|
||||||
|
Code indent should use tabs instead of spaces.
|
||||||
|
Outside of comments, documentation and Kconfig,
|
||||||
|
spaces are never used for indentation.
|
||||||
|
|
||||||
|
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#indentation
|
||||||
|
|
||||||
|
**DEEP_INDENTATION**
|
||||||
|
Indentation with 6 or more tabs usually indicate overly indented
|
||||||
|
code.
|
||||||
|
|
||||||
|
It is suggested to refactor excessive indentation of
|
||||||
|
if/else/for/do/while/switch statements.
|
||||||
|
|
||||||
|
See: https://lore.kernel.org/lkml/1328311239.21255.24.camel@joe2Laptop/
|
||||||
|
|
||||||
|
**SWITCH_CASE_INDENT_LEVEL**
|
||||||
|
switch should be at the same indent as case.
|
||||||
|
Example::
|
||||||
|
|
||||||
|
switch (suffix) {
|
||||||
|
case 'G':
|
||||||
|
case 'g':
|
||||||
|
mem <<= 30;
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
case 'm':
|
||||||
|
mem <<= 20;
|
||||||
|
break;
|
||||||
|
case 'K':
|
||||||
|
case 'k':
|
||||||
|
mem <<= 10;
|
||||||
|
fallthrough;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#indentation
|
||||||
|
|
||||||
|
**LONG_LINE**
|
||||||
|
The line has exceeded the specified maximum length.
|
||||||
|
To use a different maximum line length, the --max-line-length=n option
|
||||||
|
may be added while invoking checkpatch.
|
||||||
|
|
||||||
|
Earlier, the default line length was 80 columns. Commit bdc48fa11e46
|
||||||
|
("checkpatch/coding-style: deprecate 80-column warning") increased the
|
||||||
|
limit to 100 columns. This is not a hard limit either and it's
|
||||||
|
preferable to stay within 80 columns whenever possible.
|
||||||
|
|
||||||
|
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#breaking-long-lines-and-strings
|
||||||
|
|
||||||
|
**LONG_LINE_STRING**
|
||||||
|
A string starts before but extends beyond the maximum line length.
|
||||||
|
To use a different maximum line length, the --max-line-length=n option
|
||||||
|
may be added while invoking checkpatch.
|
||||||
|
|
||||||
|
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#breaking-long-lines-and-strings
|
||||||
|
|
||||||
|
**LONG_LINE_COMMENT**
|
||||||
|
A comment starts before but extends beyond the maximum line length.
|
||||||
|
To use a different maximum line length, the --max-line-length=n option
|
||||||
|
may be added while invoking checkpatch.
|
||||||
|
|
||||||
|
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#breaking-long-lines-and-strings
|
||||||
|
|
||||||
|
**SPLIT_STRING**
|
||||||
|
Quoted strings that appear as messages in userspace and can be
|
||||||
|
grepped, should not be split across multiple lines.
|
||||||
|
|
||||||
|
See: https://lore.kernel.org/lkml/20120203052727.GA15035@leaf/
|
||||||
|
|
||||||
|
**MULTILINE_DEREFERENCE**
|
||||||
|
A single dereferencing identifier spanned on multiple lines like::
|
||||||
|
|
||||||
|
struct_identifier->member[index].
|
||||||
|
member = <foo>;
|
||||||
|
|
||||||
|
is generally hard to follow. It can easily lead to typos and so makes
|
||||||
|
the code vulnerable to bugs.
|
||||||
|
|
||||||
|
If fixing the multiple line dereferencing leads to an 80 column
|
||||||
|
violation, then either rewrite the code in a more simple way or if the
|
||||||
|
starting part of the dereferencing identifier is the same and used at
|
||||||
|
multiple places then store it in a temporary variable, and use that
|
||||||
|
temporary variable only at all the places. For example, if there are
|
||||||
|
two dereferencing identifiers::
|
||||||
|
|
||||||
|
member1->member2->member3.foo1;
|
||||||
|
member1->member2->member3.foo2;
|
||||||
|
|
||||||
|
then store the member1->member2->member3 part in a temporary variable.
|
||||||
|
It not only helps to avoid the 80 column violation but also reduces
|
||||||
|
the program size by removing the unnecessary dereferences.
|
||||||
|
|
||||||
|
But if none of the above methods work then ignore the 80 column
|
||||||
|
violation because it is much easier to read a dereferencing identifier
|
||||||
|
on a single line.
|
||||||
|
|
||||||
|
**TRAILING_STATEMENTS**
|
||||||
|
Trailing statements (for example after any conditional) should be
|
||||||
|
on the next line.
|
||||||
|
Statements, such as::
|
||||||
|
|
||||||
|
if (x == y) break;
|
||||||
|
|
||||||
|
should be::
|
||||||
|
|
||||||
|
if (x == y)
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
Macros, Attributes and Symbols
|
Macros, Attributes and Symbols
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
|
@ -472,7 +786,7 @@ Macros, Attributes and Symbols
|
||||||
|
|
||||||
**BIT_MACRO**
|
**BIT_MACRO**
|
||||||
Defines like: 1 << <digit> could be BIT(digit).
|
Defines like: 1 << <digit> could be BIT(digit).
|
||||||
The BIT() macro is defined in include/linux/bitops.h::
|
The BIT() macro is defined via include/linux/bits.h::
|
||||||
|
|
||||||
#define BIT(nr) (1UL << (nr))
|
#define BIT(nr) (1UL << (nr))
|
||||||
|
|
||||||
|
@ -492,6 +806,7 @@ Macros, Attributes and Symbols
|
||||||
The kernel does *not* use the ``__DATE__`` and ``__TIME__`` macros,
|
The kernel does *not* use the ``__DATE__`` and ``__TIME__`` macros,
|
||||||
and enables warnings if they are used as they can lead to
|
and enables warnings if they are used as they can lead to
|
||||||
non-deterministic builds.
|
non-deterministic builds.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/kbuild/reproducible-builds.html#timestamps
|
See: https://www.kernel.org/doc/html/latest/kbuild/reproducible-builds.html#timestamps
|
||||||
|
|
||||||
**DEFINE_ARCH_HAS**
|
**DEFINE_ARCH_HAS**
|
||||||
|
@ -502,8 +817,12 @@ Macros, Attributes and Symbols
|
||||||
want architectures able to override them with optimized ones, we
|
want architectures able to override them with optimized ones, we
|
||||||
should either use weak functions (appropriate for some cases), or
|
should either use weak functions (appropriate for some cases), or
|
||||||
the symbol that protects them should be the same symbol we use.
|
the symbol that protects them should be the same symbol we use.
|
||||||
|
|
||||||
See: https://lore.kernel.org/lkml/CA+55aFycQ9XJvEOsiM3txHL5bjUc8CeKWJNR_H+MiicaddB42Q@mail.gmail.com/
|
See: https://lore.kernel.org/lkml/CA+55aFycQ9XJvEOsiM3txHL5bjUc8CeKWJNR_H+MiicaddB42Q@mail.gmail.com/
|
||||||
|
|
||||||
|
**DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON**
|
||||||
|
do {} while(0) macros should not have a trailing semicolon.
|
||||||
|
|
||||||
**INIT_ATTRIBUTE**
|
**INIT_ATTRIBUTE**
|
||||||
Const init definitions should use __initconst instead of
|
Const init definitions should use __initconst instead of
|
||||||
__initdata.
|
__initdata.
|
||||||
|
@ -528,6 +847,20 @@ Macros, Attributes and Symbols
|
||||||
...
|
...
|
||||||
}
|
}
|
||||||
|
|
||||||
|
**MISPLACED_INIT**
|
||||||
|
It is possible to use section markers on variables in a way
|
||||||
|
which gcc doesn't understand (or at least not the way the
|
||||||
|
developer intended)::
|
||||||
|
|
||||||
|
static struct __initdata samsung_pll_clock exynos4_plls[nr_plls] = {
|
||||||
|
|
||||||
|
does not put exynos4_plls in the .initdata section. The __initdata
|
||||||
|
marker can be virtually anywhere on the line, except right after
|
||||||
|
"struct". The preferred location is before the "=" sign if there is
|
||||||
|
one, or before the trailing ";" otherwise.
|
||||||
|
|
||||||
|
See: https://lore.kernel.org/lkml/1377655732.3619.19.camel@joe-AO722/
|
||||||
|
|
||||||
**MULTISTATEMENT_MACRO_USE_DO_WHILE**
|
**MULTISTATEMENT_MACRO_USE_DO_WHILE**
|
||||||
Macros with multiple statements should be enclosed in a
|
Macros with multiple statements should be enclosed in a
|
||||||
do - while block. Same should also be the case for macros
|
do - while block. Same should also be the case for macros
|
||||||
|
@ -541,6 +874,42 @@ Macros, Attributes and Symbols
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#macros-enums-and-rtl
|
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#macros-enums-and-rtl
|
||||||
|
|
||||||
|
**PREFER_FALLTHROUGH**
|
||||||
|
Use the `fallthrough;` pseudo keyword instead of
|
||||||
|
`/* fallthrough */` like comments.
|
||||||
|
|
||||||
|
**TRAILING_SEMICOLON**
|
||||||
|
Macro definition should not end with a semicolon. The macro
|
||||||
|
invocation style should be consistent with function calls.
|
||||||
|
This can prevent any unexpected code paths::
|
||||||
|
|
||||||
|
#define MAC do_something;
|
||||||
|
|
||||||
|
If this macro is used within a if else statement, like::
|
||||||
|
|
||||||
|
if (some_condition)
|
||||||
|
MAC;
|
||||||
|
|
||||||
|
else
|
||||||
|
do_something;
|
||||||
|
|
||||||
|
Then there would be a compilation error, because when the macro is
|
||||||
|
expanded there are two trailing semicolons, so the else branch gets
|
||||||
|
orphaned.
|
||||||
|
|
||||||
|
See: https://lore.kernel.org/lkml/1399671106.2912.21.camel@joe-AO725/
|
||||||
|
|
||||||
|
**SINGLE_STATEMENT_DO_WHILE_MACRO**
|
||||||
|
For the multi-statement macros, it is necessary to use the do-while
|
||||||
|
loop to avoid unpredictable code paths. The do-while loop helps to
|
||||||
|
group the multiple statements into a single one so that a
|
||||||
|
function-like macro can be used as a function only.
|
||||||
|
|
||||||
|
But for the single statement macros, it is unnecessary to use the
|
||||||
|
do-while loop. Although the code is syntactically correct but using
|
||||||
|
the do-while loop is redundant. So remove the do-while loop for single
|
||||||
|
statement macros.
|
||||||
|
|
||||||
**WEAK_DECLARATION**
|
**WEAK_DECLARATION**
|
||||||
Using weak declarations like __attribute__((weak)) or __weak
|
Using weak declarations like __attribute__((weak)) or __weak
|
||||||
can have unintended link defects. Avoid using them.
|
can have unintended link defects. Avoid using them.
|
||||||
|
@ -551,8 +920,51 @@ Functions and Variables
|
||||||
|
|
||||||
**CAMELCASE**
|
**CAMELCASE**
|
||||||
Avoid CamelCase Identifiers.
|
Avoid CamelCase Identifiers.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#naming
|
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#naming
|
||||||
|
|
||||||
|
**CONST_CONST**
|
||||||
|
Using `const <type> const *` is generally meant to be
|
||||||
|
written `const <type> * const`.
|
||||||
|
|
||||||
|
**CONST_STRUCT**
|
||||||
|
Using const is generally a good idea. Checkpatch reads
|
||||||
|
a list of frequently used structs that are always or
|
||||||
|
almost always constant.
|
||||||
|
|
||||||
|
The existing structs list can be viewed from
|
||||||
|
`scripts/const_structs.checkpatch`.
|
||||||
|
|
||||||
|
See: https://lore.kernel.org/lkml/alpine.DEB.2.10.1608281509480.3321@hadrien/
|
||||||
|
|
||||||
|
**EMBEDDED_FUNCTION_NAME**
|
||||||
|
Embedded function names are less appropriate to use as
|
||||||
|
refactoring can cause function renaming. Prefer the use of
|
||||||
|
"%s", __func__ to embedded function names.
|
||||||
|
|
||||||
|
Note that this does not work with -f (--file) checkpatch option
|
||||||
|
as it depends on patch context providing the function name.
|
||||||
|
|
||||||
|
**FUNCTION_ARGUMENTS**
|
||||||
|
This warning is emitted due to any of the following reasons:
|
||||||
|
|
||||||
|
1. Arguments for the function declaration do not follow
|
||||||
|
the identifier name. Example::
|
||||||
|
|
||||||
|
void foo
|
||||||
|
(int bar, int baz)
|
||||||
|
|
||||||
|
This should be corrected to::
|
||||||
|
|
||||||
|
void foo(int bar, int baz)
|
||||||
|
|
||||||
|
2. Some arguments for the function definition do not
|
||||||
|
have an identifier name. Example::
|
||||||
|
|
||||||
|
void foo(int)
|
||||||
|
|
||||||
|
All arguments should have identifier names.
|
||||||
|
|
||||||
**FUNCTION_WITHOUT_ARGS**
|
**FUNCTION_WITHOUT_ARGS**
|
||||||
Function declarations without arguments like::
|
Function declarations without arguments like::
|
||||||
|
|
||||||
|
@ -573,6 +985,11 @@ Functions and Variables
|
||||||
Your compiler (or rather your loader) automatically does
|
Your compiler (or rather your loader) automatically does
|
||||||
it for you.
|
it for you.
|
||||||
|
|
||||||
|
**MULTIPLE_ASSIGNMENTS**
|
||||||
|
Multiple assignments on a single line makes the code unnecessarily
|
||||||
|
complicated. So on a single line assign value to a single variable
|
||||||
|
only, this makes the code more readable and helps avoid typos.
|
||||||
|
|
||||||
**RETURN_PARENTHESES**
|
**RETURN_PARENTHESES**
|
||||||
return is not a function and as such doesn't need parentheses::
|
return is not a function and as such doesn't need parentheses::
|
||||||
|
|
||||||
|
@ -583,6 +1000,45 @@ Functions and Variables
|
||||||
return bar;
|
return bar;
|
||||||
|
|
||||||
|
|
||||||
|
Permissions
|
||||||
|
-----------
|
||||||
|
|
||||||
|
**DEVICE_ATTR_PERMS**
|
||||||
|
The permissions used in DEVICE_ATTR are unusual.
|
||||||
|
Typically only three permissions are used - 0644 (RW), 0444 (RO)
|
||||||
|
and 0200 (WO).
|
||||||
|
|
||||||
|
See: https://www.kernel.org/doc/html/latest/filesystems/sysfs.html#attributes
|
||||||
|
|
||||||
|
**EXECUTE_PERMISSIONS**
|
||||||
|
There is no reason for source files to be executable. The executable
|
||||||
|
bit can be removed safely.
|
||||||
|
|
||||||
|
**EXPORTED_WORLD_WRITABLE**
|
||||||
|
Exporting world writable sysfs/debugfs files is usually a bad thing.
|
||||||
|
When done arbitrarily they can introduce serious security bugs.
|
||||||
|
In the past, some of the debugfs vulnerabilities would seemingly allow
|
||||||
|
any local user to write arbitrary values into device registers - a
|
||||||
|
situation from which little good can be expected to emerge.
|
||||||
|
|
||||||
|
See: https://lore.kernel.org/linux-arm-kernel/cover.1296818921.git.segoon@openwall.com/
|
||||||
|
|
||||||
|
**NON_OCTAL_PERMISSIONS**
|
||||||
|
Permission bits should use 4 digit octal permissions (like 0700 or 0444).
|
||||||
|
Avoid using any other base like decimal.
|
||||||
|
|
||||||
|
**SYMBOLIC_PERMS**
|
||||||
|
Permission bits in the octal form are more readable and easier to
|
||||||
|
understand than their symbolic counterparts because many command-line
|
||||||
|
tools use this notation. Experienced kernel developers have been using
|
||||||
|
these traditional Unix permission bits for decades and so they find it
|
||||||
|
easier to understand the octal notation than the symbolic macros.
|
||||||
|
For example, it is harder to read S_IWUSR|S_IRUGO than 0644, which
|
||||||
|
obscures the developer's intent rather than clarifying it.
|
||||||
|
|
||||||
|
See: https://lore.kernel.org/lkml/CA+55aFw5v23T-zvDZp-MmD_EYxF8WbafwwB59934FV7g21uMGQ@mail.gmail.com/
|
||||||
|
|
||||||
|
|
||||||
Spacing and Brackets
|
Spacing and Brackets
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
|
@ -616,7 +1072,7 @@ Spacing and Brackets
|
||||||
|
|
||||||
1. With a type on the left::
|
1. With a type on the left::
|
||||||
|
|
||||||
;int [] a;
|
int [] a;
|
||||||
|
|
||||||
2. At the beginning of a line for slice initialisers::
|
2. At the beginning of a line for slice initialisers::
|
||||||
|
|
||||||
|
@ -626,12 +1082,6 @@ Spacing and Brackets
|
||||||
|
|
||||||
= { [0...10] = 5 }
|
= { [0...10] = 5 }
|
||||||
|
|
||||||
**CODE_INDENT**
|
|
||||||
Code indent should use tabs instead of spaces.
|
|
||||||
Outside of comments, documentation and Kconfig,
|
|
||||||
spaces are never used for indentation.
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#indentation
|
|
||||||
|
|
||||||
**CONCATENATED_STRING**
|
**CONCATENATED_STRING**
|
||||||
Concatenated elements should have a space in between.
|
Concatenated elements should have a space in between.
|
||||||
Example::
|
Example::
|
||||||
|
@ -644,17 +1094,20 @@ Spacing and Brackets
|
||||||
|
|
||||||
**ELSE_AFTER_BRACE**
|
**ELSE_AFTER_BRACE**
|
||||||
`else {` should follow the closing block `}` on the same line.
|
`else {` should follow the closing block `}` on the same line.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#placing-braces-and-spaces
|
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#placing-braces-and-spaces
|
||||||
|
|
||||||
**LINE_SPACING**
|
**LINE_SPACING**
|
||||||
Vertical space is wasted given the limited number of lines an
|
Vertical space is wasted given the limited number of lines an
|
||||||
editor window can display when multiple blank lines are used.
|
editor window can display when multiple blank lines are used.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#spaces
|
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#spaces
|
||||||
|
|
||||||
**OPEN_BRACE**
|
**OPEN_BRACE**
|
||||||
The opening brace should be following the function definitions on the
|
The opening brace should be following the function definitions on the
|
||||||
next line. For any non-functional block it should be on the same line
|
next line. For any non-functional block it should be on the same line
|
||||||
as the last construct.
|
as the last construct.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#placing-braces-and-spaces
|
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#placing-braces-and-spaces
|
||||||
|
|
||||||
**POINTER_LOCATION**
|
**POINTER_LOCATION**
|
||||||
|
@ -671,37 +1124,47 @@ Spacing and Brackets
|
||||||
|
|
||||||
**SPACING**
|
**SPACING**
|
||||||
Whitespace style used in the kernel sources is described in kernel docs.
|
Whitespace style used in the kernel sources is described in kernel docs.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#spaces
|
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#spaces
|
||||||
|
|
||||||
**SWITCH_CASE_INDENT_LEVEL**
|
|
||||||
switch should be at the same indent as case.
|
|
||||||
Example::
|
|
||||||
|
|
||||||
switch (suffix) {
|
|
||||||
case 'G':
|
|
||||||
case 'g':
|
|
||||||
mem <<= 30;
|
|
||||||
break;
|
|
||||||
case 'M':
|
|
||||||
case 'm':
|
|
||||||
mem <<= 20;
|
|
||||||
break;
|
|
||||||
case 'K':
|
|
||||||
case 'k':
|
|
||||||
mem <<= 10;
|
|
||||||
/* fall through */
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#indentation
|
|
||||||
|
|
||||||
**TRAILING_WHITESPACE**
|
**TRAILING_WHITESPACE**
|
||||||
Trailing whitespace should always be removed.
|
Trailing whitespace should always be removed.
|
||||||
Some editors highlight the trailing whitespace and cause visual
|
Some editors highlight the trailing whitespace and cause visual
|
||||||
distractions when editing files.
|
distractions when editing files.
|
||||||
|
|
||||||
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#spaces
|
See: https://www.kernel.org/doc/html/latest/process/coding-style.html#spaces
|
||||||
|
|
||||||
|
**UNNECESSARY_PARENTHESES**
|
||||||
|
Parentheses are not required in the following cases:
|
||||||
|
|
||||||
|
1. Function pointer uses::
|
||||||
|
|
||||||
|
(foo->bar)();
|
||||||
|
|
||||||
|
could be::
|
||||||
|
|
||||||
|
foo->bar();
|
||||||
|
|
||||||
|
2. Comparisons in if::
|
||||||
|
|
||||||
|
if ((foo->bar) && (foo->baz))
|
||||||
|
if ((foo == bar))
|
||||||
|
|
||||||
|
could be::
|
||||||
|
|
||||||
|
if (foo->bar && foo->baz)
|
||||||
|
if (foo == bar)
|
||||||
|
|
||||||
|
3. addressof/dereference single Lvalues::
|
||||||
|
|
||||||
|
&(foo->bar)
|
||||||
|
*(foo->bar)
|
||||||
|
|
||||||
|
could be::
|
||||||
|
|
||||||
|
&foo->bar
|
||||||
|
*foo->bar
|
||||||
|
|
||||||
**WHILE_AFTER_BRACE**
|
**WHILE_AFTER_BRACE**
|
||||||
while should follow the closing bracket on the same line::
|
while should follow the closing bracket on the same line::
|
||||||
|
|
||||||
|
@ -723,17 +1186,50 @@ Others
|
||||||
The patch seems to be corrupted or lines are wrapped.
|
The patch seems to be corrupted or lines are wrapped.
|
||||||
Please regenerate the patch file before sending it to the maintainer.
|
Please regenerate the patch file before sending it to the maintainer.
|
||||||
|
|
||||||
|
**CVS_KEYWORD**
|
||||||
|
Since linux moved to git, the CVS markers are no longer used.
|
||||||
|
So, CVS style keywords ($Id$, $Revision$, $Log$) should not be
|
||||||
|
added.
|
||||||
|
|
||||||
|
**DEFAULT_NO_BREAK**
|
||||||
|
switch default case is sometimes written as "default:;". This can
|
||||||
|
cause new cases added below default to be defective.
|
||||||
|
|
||||||
|
A "break;" should be added after empty default statement to avoid
|
||||||
|
unwanted fallthrough.
|
||||||
|
|
||||||
**DOS_LINE_ENDINGS**
|
**DOS_LINE_ENDINGS**
|
||||||
For DOS-formatted patches, there are extra ^M symbols at the end of
|
For DOS-formatted patches, there are extra ^M symbols at the end of
|
||||||
the line. These should be removed.
|
the line. These should be removed.
|
||||||
|
|
||||||
**EXECUTE_PERMISSIONS**
|
**DT_SCHEMA_BINDING_PATCH**
|
||||||
There is no reason for source files to be executable. The executable
|
DT bindings moved to a json-schema based format instead of
|
||||||
bit can be removed safely.
|
freeform text.
|
||||||
|
|
||||||
**NON_OCTAL_PERMISSIONS**
|
See: https://www.kernel.org/doc/html/latest/devicetree/bindings/writing-schema.html
|
||||||
Permission bits should use 4 digit octal permissions (like 0700 or 0444).
|
|
||||||
Avoid using any other base like decimal.
|
**DT_SPLIT_BINDING_PATCH**
|
||||||
|
Devicetree bindings should be their own patch. This is because
|
||||||
|
bindings are logically independent from a driver implementation,
|
||||||
|
they have a different maintainer (even though they often
|
||||||
|
are applied via the same tree), and it makes for a cleaner history in the
|
||||||
|
DT only tree created with git-filter-branch.
|
||||||
|
|
||||||
|
See: https://www.kernel.org/doc/html/latest/devicetree/bindings/submitting-patches.html#i-for-patch-submitters
|
||||||
|
|
||||||
|
**EMBEDDED_FILENAME**
|
||||||
|
Embedding the complete filename path inside the file isn't particularly
|
||||||
|
useful as often the path is moved around and becomes incorrect.
|
||||||
|
|
||||||
|
**FILE_PATH_CHANGES**
|
||||||
|
Whenever files are added, moved, or deleted, the MAINTAINERS file
|
||||||
|
patterns can be out of sync or outdated.
|
||||||
|
|
||||||
|
So MAINTAINERS might need updating in these cases.
|
||||||
|
|
||||||
|
**MEMSET**
|
||||||
|
The memset use appears to be incorrect. This may be caused due to
|
||||||
|
badly ordered parameters. Please recheck the usage.
|
||||||
|
|
||||||
**NOT_UNIFIED_DIFF**
|
**NOT_UNIFIED_DIFF**
|
||||||
The patch file does not appear to be in unified-diff format. Please
|
The patch file does not appear to be in unified-diff format. Please
|
||||||
|
@ -742,14 +1238,12 @@ Others
|
||||||
**PRINTF_0XDECIMAL**
|
**PRINTF_0XDECIMAL**
|
||||||
Prefixing 0x with decimal output is defective and should be corrected.
|
Prefixing 0x with decimal output is defective and should be corrected.
|
||||||
|
|
||||||
**TRAILING_STATEMENTS**
|
**SPDX_LICENSE_TAG**
|
||||||
Trailing statements (for example after any conditional) should be
|
The source file is missing or has an improper SPDX identifier tag.
|
||||||
on the next line.
|
The Linux kernel requires the precise SPDX identifier in all source files,
|
||||||
Like::
|
and it is thoroughly documented in the kernel docs.
|
||||||
|
|
||||||
if (x == y) break;
|
See: https://www.kernel.org/doc/html/latest/process/license-rules.html
|
||||||
|
|
||||||
should be::
|
**TYPO_SPELLING**
|
||||||
|
Some words may have been misspelled. Consider reviewing them.
|
||||||
if (x == y)
|
|
||||||
break;
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ my $min_conf_desc_length = 4;
|
||||||
my $spelling_file = "$D/spelling.txt";
|
my $spelling_file = "$D/spelling.txt";
|
||||||
my $codespell = 0;
|
my $codespell = 0;
|
||||||
my $codespellfile = "/usr/share/codespell/dictionary.txt";
|
my $codespellfile = "/usr/share/codespell/dictionary.txt";
|
||||||
|
my $user_codespellfile = "";
|
||||||
my $conststructsfile = "$D/const_structs.checkpatch";
|
my $conststructsfile = "$D/const_structs.checkpatch";
|
||||||
my $u_boot = 0;
|
my $u_boot = 0;
|
||||||
my $docsfile = "$D/../doc/develop/checkpatch.rst";
|
my $docsfile = "$D/../doc/develop/checkpatch.rst";
|
||||||
|
@ -131,7 +132,7 @@ Options:
|
||||||
--ignore-perl-version override checking of perl version. expect
|
--ignore-perl-version override checking of perl version. expect
|
||||||
runtime errors.
|
runtime errors.
|
||||||
--codespell Use the codespell dictionary for spelling/typos
|
--codespell Use the codespell dictionary for spelling/typos
|
||||||
(default:/usr/share/codespell/dictionary.txt)
|
(default:$codespellfile)
|
||||||
--codespellfile Use this codespell dictionary
|
--codespellfile Use this codespell dictionary
|
||||||
--typedefsfile Read additional types from this file
|
--typedefsfile Read additional types from this file
|
||||||
--color[=WHEN] Use colors 'always', 'never', or only when output
|
--color[=WHEN] Use colors 'always', 'never', or only when output
|
||||||
|
@ -319,7 +320,7 @@ GetOptions(
|
||||||
'debug=s' => \%debug,
|
'debug=s' => \%debug,
|
||||||
'test-only=s' => \$tst_only,
|
'test-only=s' => \$tst_only,
|
||||||
'codespell!' => \$codespell,
|
'codespell!' => \$codespell,
|
||||||
'codespellfile=s' => \$codespellfile,
|
'codespellfile=s' => \$user_codespellfile,
|
||||||
'typedefsfile=s' => \$typedefsfile,
|
'typedefsfile=s' => \$typedefsfile,
|
||||||
'u-boot' => \$u_boot,
|
'u-boot' => \$u_boot,
|
||||||
'color=s' => \$color,
|
'color=s' => \$color,
|
||||||
|
@ -328,9 +329,32 @@ GetOptions(
|
||||||
'kconfig-prefix=s' => \${CONFIG_},
|
'kconfig-prefix=s' => \${CONFIG_},
|
||||||
'h|help' => \$help,
|
'h|help' => \$help,
|
||||||
'version' => \$help
|
'version' => \$help
|
||||||
) or help(1);
|
) or $help = 2;
|
||||||
|
|
||||||
help(0) if ($help);
|
if ($user_codespellfile) {
|
||||||
|
# Use the user provided codespell file unconditionally
|
||||||
|
$codespellfile = $user_codespellfile;
|
||||||
|
} elsif (!(-f $codespellfile)) {
|
||||||
|
# If /usr/share/codespell/dictionary.txt is not present, try to find it
|
||||||
|
# under codespell's install directory: <codespell_root>/data/dictionary.txt
|
||||||
|
if (($codespell || $help) && which("codespell") ne "" && which("python") ne "") {
|
||||||
|
my $python_codespell_dict = << "EOF";
|
||||||
|
|
||||||
|
import os.path as op
|
||||||
|
import codespell_lib
|
||||||
|
codespell_dir = op.dirname(codespell_lib.__file__)
|
||||||
|
codespell_file = op.join(codespell_dir, 'data', 'dictionary.txt')
|
||||||
|
print(codespell_file, end='')
|
||||||
|
EOF
|
||||||
|
|
||||||
|
my $codespell_dict = `python -c "$python_codespell_dict" 2> /dev/null`;
|
||||||
|
$codespellfile = $codespell_dict if (-f $codespell_dict);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# $help is 1 if either -h, --help or --version is passed as option - exitcode: 0
|
||||||
|
# $help is 2 if invalid option is passed - exitcode: 1
|
||||||
|
help($help - 1) if ($help);
|
||||||
|
|
||||||
die "$P: --git cannot be used with --file or --fix\n" if ($git && ($file || $fix));
|
die "$P: --git cannot be used with --file or --fix\n" if ($git && ($file || $fix));
|
||||||
die "$P: --verbose cannot be used with --terse\n" if ($verbose && $terse);
|
die "$P: --verbose cannot be used with --terse\n" if ($verbose && $terse);
|
||||||
|
@ -492,7 +516,8 @@ our $Attribute = qr{
|
||||||
____cacheline_aligned|
|
____cacheline_aligned|
|
||||||
____cacheline_aligned_in_smp|
|
____cacheline_aligned_in_smp|
|
||||||
____cacheline_internodealigned_in_smp|
|
____cacheline_internodealigned_in_smp|
|
||||||
__weak
|
__weak|
|
||||||
|
__alloc_size\s*\(\s*\d+\s*(?:,\s*\d+\s*)?\)
|
||||||
}x;
|
}x;
|
||||||
our $Modifier;
|
our $Modifier;
|
||||||
our $Inline = qr{inline|__always_inline|noinline|__inline|__inline__};
|
our $Inline = qr{inline|__always_inline|noinline|__inline|__inline__};
|
||||||
|
@ -504,7 +529,7 @@ our $Binary = qr{(?i)0b[01]+$Int_type?};
|
||||||
our $Hex = qr{(?i)0x[0-9a-f]+$Int_type?};
|
our $Hex = qr{(?i)0x[0-9a-f]+$Int_type?};
|
||||||
our $Int = qr{[0-9]+$Int_type?};
|
our $Int = qr{[0-9]+$Int_type?};
|
||||||
our $Octal = qr{0[0-7]+$Int_type?};
|
our $Octal = qr{0[0-7]+$Int_type?};
|
||||||
our $String = qr{"[X\t]*"};
|
our $String = qr{(?:\b[Lu])?"[X\t]*"};
|
||||||
our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
|
our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
|
||||||
our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
|
our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
|
||||||
our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?};
|
our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?};
|
||||||
|
@ -1089,10 +1114,10 @@ sub is_maintained_obsolete {
|
||||||
sub is_SPDX_License_valid {
|
sub is_SPDX_License_valid {
|
||||||
my ($license) = @_;
|
my ($license) = @_;
|
||||||
|
|
||||||
return 1 if (!$tree || which("python") eq "" || !(-e "$root/scripts/spdxcheck.py") || !(-e "$gitroot"));
|
return 1 if (!$tree || which("python3") eq "" || !(-x "$root/scripts/spdxcheck.py") || !(-e "$gitroot"));
|
||||||
|
|
||||||
my $root_path = abs_path($root);
|
my $root_path = abs_path($root);
|
||||||
my $status = `cd "$root_path"; echo "$license" | python scripts/spdxcheck.py -`;
|
my $status = `cd "$root_path"; echo "$license" | scripts/spdxcheck.py -`;
|
||||||
return 0 if ($status ne "");
|
return 0 if ($status ne "");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -1186,7 +1211,8 @@ sub git_commit_info {
|
||||||
# git log --format='%H %s' -1 $line |
|
# git log --format='%H %s' -1 $line |
|
||||||
# echo "commit $(cut -c 1-12,41-)"
|
# echo "commit $(cut -c 1-12,41-)"
|
||||||
# done
|
# done
|
||||||
} elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
|
} elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./ ||
|
||||||
|
$lines[0] =~ /^fatal: bad object $commit/) {
|
||||||
$id = undef;
|
$id = undef;
|
||||||
} else {
|
} else {
|
||||||
$id = substr($lines[0], 0, 12);
|
$id = substr($lines[0], 0, 12);
|
||||||
|
@ -2697,6 +2723,8 @@ sub process {
|
||||||
my $reported_maintainer_file = 0;
|
my $reported_maintainer_file = 0;
|
||||||
my $non_utf8_charset = 0;
|
my $non_utf8_charset = 0;
|
||||||
|
|
||||||
|
my $last_git_commit_id_linenr = -1;
|
||||||
|
|
||||||
my $last_blank_line = 0;
|
my $last_blank_line = 0;
|
||||||
my $last_coalesced_string_linenr = -1;
|
my $last_coalesced_string_linenr = -1;
|
||||||
|
|
||||||
|
@ -3019,10 +3047,10 @@ sub process {
|
||||||
my ($email_name, $email_comment, $email_address, $comment1) = parse_email($ctx);
|
my ($email_name, $email_comment, $email_address, $comment1) = parse_email($ctx);
|
||||||
my ($author_name, $author_comment, $author_address, $comment2) = parse_email($author);
|
my ($author_name, $author_comment, $author_address, $comment2) = parse_email($author);
|
||||||
|
|
||||||
if ($email_address eq $author_address && $email_name eq $author_name) {
|
if (lc $email_address eq lc $author_address && $email_name eq $author_name) {
|
||||||
$author_sob = $ctx;
|
$author_sob = $ctx;
|
||||||
$authorsignoff = 2;
|
$authorsignoff = 2;
|
||||||
} elsif ($email_address eq $author_address) {
|
} elsif (lc $email_address eq lc $author_address) {
|
||||||
$author_sob = $ctx;
|
$author_sob = $ctx;
|
||||||
$authorsignoff = 3;
|
$authorsignoff = 3;
|
||||||
} elsif ($email_name eq $author_name) {
|
} elsif ($email_name eq $author_name) {
|
||||||
|
@ -3280,10 +3308,20 @@ sub process {
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check for git id commit length and improperly formed commit descriptions
|
# Check for git id commit length and improperly formed commit descriptions
|
||||||
if ($in_commit_log && !$commit_log_possible_stack_dump &&
|
# A correctly formed commit description is:
|
||||||
|
# commit <SHA-1 hash length 12+ chars> ("Complete commit subject")
|
||||||
|
# with the commit subject '("' prefix and '")' suffix
|
||||||
|
# This is a fairly compilicated block as it tests for what appears to be
|
||||||
|
# bare SHA-1 hash with minimum length of 5. It also avoids several types of
|
||||||
|
# possible SHA-1 matches.
|
||||||
|
# A commit match can span multiple lines so this block attempts to find a
|
||||||
|
# complete typical commit on a maximum of 3 lines
|
||||||
|
if ($perl_version_ok &&
|
||||||
|
$in_commit_log && !$commit_log_possible_stack_dump &&
|
||||||
$line !~ /^\s*(?:Link|Patchwork|http|https|BugLink|base-commit):/i &&
|
$line !~ /^\s*(?:Link|Patchwork|http|https|BugLink|base-commit):/i &&
|
||||||
$line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
|
$line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
|
||||||
($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
|
(($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
|
||||||
|
($line =~ /\bcommit\s*$/i && defined($rawlines[$linenr]) && $rawlines[$linenr] =~ /^\s*[0-9a-f]{5,}\b/i)) ||
|
||||||
($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
|
($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
|
||||||
$line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
|
$line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
|
||||||
$line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {
|
$line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {
|
||||||
|
@ -3293,49 +3331,56 @@ sub process {
|
||||||
my $long = 0;
|
my $long = 0;
|
||||||
my $case = 1;
|
my $case = 1;
|
||||||
my $space = 1;
|
my $space = 1;
|
||||||
my $hasdesc = 0;
|
|
||||||
my $hasparens = 0;
|
|
||||||
my $id = '0123456789ab';
|
my $id = '0123456789ab';
|
||||||
my $orig_desc = "commit description";
|
my $orig_desc = "commit description";
|
||||||
my $description = "";
|
my $description = "";
|
||||||
|
my $herectx = $herecurr;
|
||||||
|
my $has_parens = 0;
|
||||||
|
my $has_quotes = 0;
|
||||||
|
|
||||||
if ($line =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) {
|
my $input = $line;
|
||||||
$init_char = $1;
|
if ($line =~ /(?:\bcommit\s+[0-9a-f]{5,}|\bcommit\s*$)/i) {
|
||||||
$orig_commit = lc($2);
|
for (my $n = 0; $n < 2; $n++) {
|
||||||
} elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) {
|
if ($input =~ /\bcommit\s+[0-9a-f]{5,}\s*($balanced_parens)/i) {
|
||||||
$orig_commit = lc($1);
|
$orig_desc = $1;
|
||||||
|
$has_parens = 1;
|
||||||
|
# Always strip leading/trailing parens then double quotes if existing
|
||||||
|
$orig_desc = substr($orig_desc, 1, -1);
|
||||||
|
if ($orig_desc =~ /^".*"$/) {
|
||||||
|
$orig_desc = substr($orig_desc, 1, -1);
|
||||||
|
$has_quotes = 1;
|
||||||
|
}
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
last if ($#lines < $linenr + $n);
|
||||||
|
$input .= " " . trim($rawlines[$linenr + $n]);
|
||||||
|
$herectx .= "$rawlines[$linenr + $n]\n";
|
||||||
|
}
|
||||||
|
$herectx = $herecurr if (!$has_parens);
|
||||||
}
|
}
|
||||||
|
|
||||||
$short = 0 if ($line =~ /\bcommit\s+[0-9a-f]{12,40}/i);
|
if ($input =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) {
|
||||||
$long = 1 if ($line =~ /\bcommit\s+[0-9a-f]{41,}/i);
|
$init_char = $1;
|
||||||
$space = 0 if ($line =~ /\bcommit [0-9a-f]/i);
|
$orig_commit = lc($2);
|
||||||
$case = 0 if ($line =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/);
|
$short = 0 if ($input =~ /\bcommit\s+[0-9a-f]{12,40}/i);
|
||||||
if ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) {
|
$long = 1 if ($input =~ /\bcommit\s+[0-9a-f]{41,}/i);
|
||||||
$orig_desc = $1;
|
$space = 0 if ($input =~ /\bcommit [0-9a-f]/i);
|
||||||
$hasparens = 1;
|
$case = 0 if ($input =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/);
|
||||||
} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i &&
|
} elsif ($input =~ /\b([0-9a-f]{12,40})\b/i) {
|
||||||
defined $rawlines[$linenr] &&
|
$orig_commit = lc($1);
|
||||||
$rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) {
|
|
||||||
$orig_desc = $1;
|
|
||||||
$hasparens = 1;
|
|
||||||
} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i &&
|
|
||||||
defined $rawlines[$linenr] &&
|
|
||||||
$rawlines[$linenr] =~ /^\s*[^"]+"\)/) {
|
|
||||||
$line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i;
|
|
||||||
$orig_desc = $1;
|
|
||||||
$rawlines[$linenr] =~ /^\s*([^"]+)"\)/;
|
|
||||||
$orig_desc .= " " . $1;
|
|
||||||
$hasparens = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
($id, $description) = git_commit_info($orig_commit,
|
($id, $description) = git_commit_info($orig_commit,
|
||||||
$id, $orig_desc);
|
$id, $orig_desc);
|
||||||
|
|
||||||
if (defined($id) &&
|
if (defined($id) &&
|
||||||
($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) {
|
($short || $long || $space || $case || ($orig_desc ne $description) || !$has_quotes) &&
|
||||||
|
$last_git_commit_id_linenr != $linenr - 1) {
|
||||||
ERROR("GIT_COMMIT_ID",
|
ERROR("GIT_COMMIT_ID",
|
||||||
"Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herecurr);
|
"Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herectx);
|
||||||
}
|
}
|
||||||
|
#don't report the next line if this line ends in commit and the sha1 hash is the next line
|
||||||
|
$last_git_commit_id_linenr = $linenr if ($line =~ /\bcommit\s*$/i);
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check for added, moved or deleted files
|
# Check for added, moved or deleted files
|
||||||
|
@ -4542,6 +4587,7 @@ sub process {
|
||||||
# XXX(foo);
|
# XXX(foo);
|
||||||
# EXPORT_SYMBOL(something_foo);
|
# EXPORT_SYMBOL(something_foo);
|
||||||
my $name = $1;
|
my $name = $1;
|
||||||
|
$name =~ s/^\s*($Ident).*/$1/;
|
||||||
if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
|
if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
|
||||||
$name =~ /^${Ident}_$2/) {
|
$name =~ /^${Ident}_$2/) {
|
||||||
#print "FOO C name<$name>\n";
|
#print "FOO C name<$name>\n";
|
||||||
|
@ -5475,9 +5521,13 @@ sub process {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#goto labels aren't indented, allow a single space however
|
# check that goto labels aren't indented (allow a single space indentation)
|
||||||
if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
|
# and ignore bitfield definitions like foo:1
|
||||||
!($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
|
# Strictly, labels can have whitespace after the identifier and before the :
|
||||||
|
# but this is not allowed here as many ?: uses would appear to be labels
|
||||||
|
if ($sline =~ /^.\s+[A-Za-z_][A-Za-z\d_]*:(?!\s*\d+)/ &&
|
||||||
|
$sline !~ /^. [A-Za-z\d_][A-Za-z\d_]*:/ &&
|
||||||
|
$sline !~ /^.\s+default:/) {
|
||||||
if (WARN("INDENTED_LABEL",
|
if (WARN("INDENTED_LABEL",
|
||||||
"labels should not be indented\n" . $herecurr) &&
|
"labels should not be indented\n" . $herecurr) &&
|
||||||
$fix) {
|
$fix) {
|
||||||
|
@ -5572,7 +5622,7 @@ sub process {
|
||||||
# Return of what appears to be an errno should normally be negative
|
# Return of what appears to be an errno should normally be negative
|
||||||
if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) {
|
if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) {
|
||||||
my $name = $1;
|
my $name = $1;
|
||||||
if ($name ne 'EOF' && $name ne 'ERROR') {
|
if ($name ne 'EOF' && $name ne 'ERROR' && $name !~ /^EPOLL/) {
|
||||||
WARN("USE_NEGATIVE_ERRNO",
|
WARN("USE_NEGATIVE_ERRNO",
|
||||||
"return of an errno should typically be negative (ie: return -$1)\n" . $herecurr);
|
"return of an errno should typically be negative (ie: return -$1)\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
@ -6242,7 +6292,8 @@ sub process {
|
||||||
}
|
}
|
||||||
|
|
||||||
# concatenated string without spaces between elements
|
# concatenated string without spaces between elements
|
||||||
if ($line =~ /$String[A-Za-z0-9_]/ || $line =~ /[A-Za-z0-9_]$String/) {
|
if ($line =~ /$String[A-Z_]/ ||
|
||||||
|
($line =~ /([A-Za-z0-9_]+)$String/ && $1 !~ /^[Lu]$/)) {
|
||||||
if (CHK("CONCATENATED_STRING",
|
if (CHK("CONCATENATED_STRING",
|
||||||
"Concatenated strings should use spaces between elements\n" . $herecurr) &&
|
"Concatenated strings should use spaces between elements\n" . $herecurr) &&
|
||||||
$fix) {
|
$fix) {
|
||||||
|
@ -6255,7 +6306,7 @@ sub process {
|
||||||
}
|
}
|
||||||
|
|
||||||
# uncoalesced string fragments
|
# uncoalesced string fragments
|
||||||
if ($line =~ /$String\s*"/) {
|
if ($line =~ /$String\s*[Lu]?"/) {
|
||||||
if (WARN("STRING_FRAGMENTS",
|
if (WARN("STRING_FRAGMENTS",
|
||||||
"Consecutive strings are generally better as a single string\n" . $herecurr) &&
|
"Consecutive strings are generally better as a single string\n" . $herecurr) &&
|
||||||
$fix) {
|
$fix) {
|
||||||
|
|
|
@ -44,7 +44,7 @@ def read_spdxdata(repo):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
exception = None
|
exception = None
|
||||||
for l in open(el.path).readlines():
|
for l in open(el.path, encoding="utf-8").readlines():
|
||||||
if l.startswith('Valid-License-Identifier:'):
|
if l.startswith('Valid-License-Identifier:'):
|
||||||
lid = l.split(':')[1].strip().upper()
|
lid = l.split(':')[1].strip().upper()
|
||||||
if lid in spdx.licenses:
|
if lid in spdx.licenses:
|
||||||
|
|
Loading…
Reference in a new issue