All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Marek Behún" <kabel@kernel.org>
To: Arnd Bergmann <arnd@arndb.de>
Cc: Linux Kbuild mailing list <linux-kbuild@vger.kernel.org>,
	Nathan Chancellor <natechancellor@gmail.com>,
	Masahiro Yamada <masahiroy@kernel.org>,
	Andrew Lunn <andrew@lunn.ch>, Networking <netdev@vger.kernel.org>
Subject: Re: [PATCH kbuild] Makefile.extrawarn: disable -Woverride-init in W=1
Date: Wed, 7 Apr 2021 16:49:08 +0200	[thread overview]
Message-ID: <20210407164908.3f07f8c2@thinkpad> (raw)
In-Reply-To: <CAK8P3a0_ruZSMv-kLMY7Jja7wq0K3aNNDviYqQPmN-3UayiHaQ@mail.gmail.com>

On Wed, 7 Apr 2021 09:14:29 +0200
Arnd Bergmann <arnd@arndb.de> wrote:

> On Wed, Apr 7, 2021 at 2:24 AM Marek Behún <kabel@kernel.org> wrote:
> >
> > The -Wextra flag enables -Woverride-init in newer versions of GCC.
> >
> > This causes the compiler to warn when a value is written twice in a
> > designated initializer, for example:
> >   int x[1] = {
> >     [0] = 3,
> >     [0] = 3,
> >   };
> >
> > Note that for clang, this was disabled from the beginning with
> > -Wno-initializer-overrides in commit a1494304346a3 ("kbuild: add all
> > Clang-specific flags unconditionally").
> >
> > This prevents us from implementing complex macros for compile-time
> > initializers.  
> 
> I think this is generally a useful warning, and it has found a number
> of real bugs. I would want this to be enabled in both gcc and clang
> by default, and I have previously sent both bugfixes and patches to
> disable it locally.
> 
> > For example a macro of the form INITIALIZE_BITMAP(bits...) that can be
> > used as
> >   static DECLARE_BITMAP(bm, 64) = INITIALIZE_BITMAP(0, 1, 32, 33);
> > can only be implemented by allowing a designated initializer to
> > initialize the same members multiple times (because the compiler
> > complains even if the multiple initializations initialize to the same
> > value).  
> 
> We don't have this kind of macro at the moment, and this may just mean
> you need to try harder to come up with a definition that only initializes
> each member once if you want to add this.
> 
> How do you currently define it?
> 
>             Arnd

You can look at the current definition in this patch
https://git.kernel.org/pub/scm/linux/kernel/git/kabel/linux.git/commit/?h=marvell10g-updates&id=a4ba5e6563ac4d9e352f55fbae8431339001acf1

And the previous patch, adding variadic-macro.h
https://git.kernel.org/pub/scm/linux/kernel/git/kabel/linux.git/commit/?h=marvell10g-updates&id=d5f8438024b688e96bdd16349f717e5469183362

I fear it won't be possible to expand a macro in such a way to
initialize each member only once, without giving it the number of array
members it has to fill as a constant, i.e. if the bitmap is 100 bits on
a 32 bit machine, it has to fill up to 4 longs, so we would need to
give 4 as an argument:
  ... = INITIALIZE_BITMAP(4, ...);
but DIV_ROUND_UP(100, BITS_PER_LONG) won't work.

Another way around this is to use _Pragma to disable this specific
warning for a specific part of code. Unfortunately it seems that this
_Pragma operator cannot be used withing the designated initializer, it
has to be outside the expression declaring the variable, i.e.
  _Pragma("GCC diagnostic ignored \"-Woverride-init\"")
  ... = INITIALIZE_BITMAP(...);

What I am frustrated about is why doesn't the compiler have the option
to warn only if designated initializer initializes the same member to a
different value...

Marek

  reply	other threads:[~2021-04-07 14:49 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-07  0:24 [PATCH kbuild] Makefile.extrawarn: disable -Woverride-init in W=1 Marek Behún
2021-04-07  7:14 ` Arnd Bergmann
2021-04-07 14:49   ` Marek Behún [this message]
2021-04-07 20:44   ` Marek Behún

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=20210407164908.3f07f8c2@thinkpad \
    --to=kabel@kernel.org \
    --cc=andrew@lunn.ch \
    --cc=arnd@arndb.de \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=masahiroy@kernel.org \
    --cc=natechancellor@gmail.com \
    --cc=netdev@vger.kernel.org \
    /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.