From: Nathan Chancellor <natechancellor@gmail.com>
To: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: Michal Marek <michal.lkml@markovi.net>,
Linux Kbuild mailing list <linux-kbuild@vger.kernel.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Nick Desaulniers <ndesaulniers@google.com>,
Kees Cook <keescook@chromium.org>
Subject: Re: [PATCH] Kbuild: Hide Clang's -Wempty-body behind W=1
Date: Tue, 16 Oct 2018 22:02:55 -0700 [thread overview]
Message-ID: <20181017050255.GA9286@flashbox> (raw)
In-Reply-To: <CAK7LNATO+L4-0SpuWrCnYEUVbxmcQkjOQvMB6PEsFv1b-heJOA@mail.gmail.com>
Hi Masahiro,
On Wed, Oct 17, 2018 at 01:48:46PM +0900, Masahiro Yamada wrote:
> Hi Nathan,
>
>
> On Tue, Oct 16, 2018 at 11:15 AM Nathan Chancellor
> <natechancellor@gmail.com> wrote:
> >
> > There are only a few instances of this warning in an arm64 allyesconfig
> > build but none of them appear useful. I believe the intention of the
> > warning is to avoid situations like this:
> >
> > if (condition);
> > statement;
> >
> > where the user really intended
> >
> > if (condition)
> > statement;
> >
> > However, these instances have already been caught by GCC's warning about
> > misleading indentation
>
>
> Right, the example above is caught by -Wmisleading-indentation.
>
> However, the following is not.
>
> if (condition)
> ;
>
>
>
> So, -Wempty-body is a kind of different thing,
> and still useful in my opinion.
>
>
>
> > so the remaining warnings are about loops that
> > fall into one of three categories:
> >
> > 1. Execute a function unconditionally (avoiding a useless variable to
> > hold the return value):
> >
> > drivers/isdn/hisax/hfc_pci.c:131:34: warning: if statement has empty body
> > [-Wempty-body]
> > if (Read_hfc(cs, HFCPCI_INT_S1));
>
>
> I think this is a real bug,
> then -Wempty-body finally caught it.
> (but -Wmisleading-indentation cannot catch it.)
>
>
>
> It is wrong to enclose a non-effective statement with 'if ();'
> just for suppressing another warning.
>
>
>
> Read_hfc(cs, HFCPCI_INT_S1);
>
> would emit this warning.
>
>
> In file included from drivers/isdn/hisax/hfc_pci.c:20:0:
> drivers/isdn/hisax/hfc_pci.c: In function ‘reset_hfcpci’:
> drivers/isdn/hisax/hfc_pci.h:232:25: warning: statement with no effect
> [-Wunused-value]
> #define Read_hfc(a, b) (*(((u_char *)a->hw.hfcpci.pci_io) + b))
> ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> drivers/isdn/hisax/hfc_pci.c:131:2: note: in expansion of macro ‘Read_hfc’
> Read_hfc(cs, HFCPCI_INT_S1);
> ^~~~~~~~
>
>
>
> The root cause is missing 'volatile'
> while Read_hfc() is supposed to read out a HW register.
>
>
>
> #define Read_hfc(a, b) (*(((volatile u_char *)a->hw.hfcpci.pci_io) + b))
>
> will be a correct fix.
> (or just use a standard accessor like readb(), ioread8(), etc.)
>
>
>
>
> if (Read_hfc(cs, HFCPCI_INT_S1));
>
> is optimized out by the compiler, so it is not working as expected.
>
>
>
> >
> > 2. Advancing a value to be used later on in the function like a pointer
> > or a count:
> >
> > drivers/atm/eni.c:244:48: warning: for loop has empty body
> > [-Wempty-body]
> > for (order = 0; (1 << order) < *size; order++);
> > ^
>
> As you noted in the commit log,
> Clang's -Wempty-body cares the location of a semi-colon,
> while GCC's one does not.
>
>
>
>
>
> for (order = 0; (1 << order) < *size; order++)
> ;
>
> is fine, and more readable in my opinion.
>
>
>
>
> > 3. Busy waiting:
> >
> > drivers/atm/zatm.c:513:7: warning: while loop has empty body
> > [-Wempty-body]
> > zwait;
> > ^
>
>
> Again, Clang is fine with an empty body in while() loop,
> but just picky about the semi-colon location.
>
> For this particular case, how about something like this?
>
>
> #define zwait do {} while (zin(CMR) & uPD98401_BUSY)
>
>
>
>
>
> I think an even better fix is
>
> #define zwait() do {} while (zin(CMR) & uPD98401_BUSY)
>
>
>
> then, fix-up all
>
> zwait;
>
> to
>
> zwait();
>
>
>
>
>
>
> > None of these uses are problematic or need to be addressed.
>
>
> The first pattern is really problematic, and need to be addressed.
>
> I want to keep -Wempty-body enabled
> to find out potential issues.
>
> Please let me know if you see other patterns difficult to fix.
>
>
>
Thank you very much for the quick feedback, this all sounds reasonable.
I will go ahead and dig into these further and send out patches to
address them.
Much appreciated,
Nathan
>
>
> > Clang
> > suggests moving the semi-colon to the next line to silence these
> > warnings but that defeats the purpose of the compact nature of these
> > constructs so just hide the warning behind W=1 so its use can still be
> > audited but it won't polute a regular build.
> >
> > Link: https://github.com/ClangBuiltLinux/linux/issues/42
> > Link: https://github.com/ClangBuiltLinux/linux/issues/66
> > Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
> > ---
> > scripts/Makefile.extrawarn | 2 ++
> > 1 file changed, 2 insertions(+)
> >
> > diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn
> > index cf6cd0ef6975..8709d9d6faf1 100644
> > --- a/scripts/Makefile.extrawarn
> > +++ b/scripts/Makefile.extrawarn
> > @@ -11,6 +11,7 @@
> > # are not supported by all versions of the compiler
> > # ==========================================================================
> >
> > +KBUILD_CFLAGS += $(call cc-disable-warning, empty-body)
> > KBUILD_CFLAGS += $(call cc-disable-warning, packed-not-aligned)
> >
> > ifeq ("$(origin W)", "command line")
> > @@ -32,6 +33,7 @@ warning-1 += $(call cc-option, -Wpacked-not-aligned)
> > warning-1 += $(call cc-option, -Wstringop-truncation)
> > warning-1 += $(call cc-disable-warning, missing-field-initializers)
> > warning-1 += $(call cc-disable-warning, sign-compare)
> > +warning-1 += $(call cc-option, -Wempty-body)
> >
> > warning-2 := -Waggregate-return
> > warning-2 += -Wcast-align
> > --
> > 2.19.1
> >
>
>
> --
> Best Regards
> Masahiro Yamada
prev parent reply other threads:[~2018-10-17 12:56 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-16 2:14 [PATCH] Kbuild: Hide Clang's -Wempty-body behind W=1 Nathan Chancellor
2018-10-17 4:48 ` Masahiro Yamada
2018-10-17 5:02 ` Nathan Chancellor [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181017050255.GA9286@flashbox \
--to=natechancellor@gmail.com \
--cc=keescook@chromium.org \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=michal.lkml@markovi.net \
--cc=ndesaulniers@google.com \
--cc=yamada.masahiro@socionext.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.