[Linux-kernel-mentees] checkpatch.pl investigation: MULTISTATEMENT_MACRO_USE_DO_WHILE issues

Dwaipayan Ray dwaipayanray1 at gmail.com
Mon Sep 28 17:11:58 UTC 2020


On Mon, Sep 28, 2020 at 9:44 PM Lukas Bulwahn <lukas.bulwahn at gmail.com> wrote:
>
>
>
> On Mon, 28 Sep 2020, Dwaipayan Ray wrote:
>
> > Hi,
> > Checkpatch seems to generate some false positives on
> > certain macros.
> >
> > For example running checkpatch on (kernel/trace/trace_export.c),
> >
> > ERROR: Macros with multiple statements should be enclosed in a do - while loop
> > #49: FILE: kernel/trace/trace_export.c:49:
> > +#define __field_packed(type, container, item) type item;
> >
> > ERROR: Macros with multiple statements should be enclosed in a do - while loop
> > #52: FILE: kernel/trace/trace_export.c:52:
> > +#define __array(type, item, size) type item[size];
> >
>
> I guess checkpatch.pl detects the semicolon and thinks it must be two
> statements. How about checking if the semicolon is actually followed by
> anything or not?
>
> > and several other same errors.
> >
>
> Are they all in one file or spread around in the kernel everywhere?
>

Yes, there were all in the same file. I have to run checkpatch on other
files extensively before I can confirm these issues exist elsewhere.

But yes, checking for a semicolon followed by some characters
does solve the problem, and changes the warning to a (Macros
with complex values...).

I do agree that such complex checks should be left to clang-format or
likewise.

Not sure if it is worthwhile merging, but here goes the diff:

---
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 9e65d21456f1..8382977e95fd 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl

@@ -5351,7 +5367,7 @@ sub process {
                                if ($dstat =~ /^\s*if\b/) {

ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
                                              "Macros starting with if
should be enclosed by a do - while loop to avoid possible if/else
logic defects\n" . "$herectx");
-                               } elsif ($dstat =~ /;/) {
+                               } elsif ($dstat =~ /;.+/) {

ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
                                              "Macros with multiple
statements should be enclosed in a do - while loop\n" . "$herectx");
                                } else {
---
Thanks,
Dwaipayan.


More information about the Linux-kernel-mentees mailing list