From: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
To: Ilya Maximets <i.maximets@ovn.org>
Cc: linux-sparse@vger.kernel.org, ovs-dev@openvswitch.org,
Ian Stokes <ian.stokes@intel.com>,
Aaron Conole <aconole@redhat.com>
Subject: Re: [PATCH] flex-array: allow arrays of unions with flexible members.
Date: Fri, 9 Oct 2020 17:39:52 +0200 [thread overview]
Message-ID: <20201009153952.io6hdo4srfc653z5@ltop.local> (raw)
In-Reply-To: <c1d215cc-b498-c48f-dc91-b98ad0627c2d@ovn.org>
On Thu, Oct 08, 2020 at 08:36:02AM +0200, Ilya Maximets wrote:
> On 10/8/20 1:09 AM, Luc Van Oostenryck wrote:
> > On Wed, Oct 07, 2020 at 01:52:34PM +0200, Ilya Maximets wrote:
> >> There is a common pattern on how to allocate memory for a flexible-size
> >> structure, e.g.
> >>
> >> union {
> >> struct flex f; /* Structure that contains a flexible array. */
> >> char buf[MAX_SIZE]; /* Memeory buffer for structure 'flex' and
> >> its flexible array. */
> >> };
> >>
> >> There is another exmaple of such thing in CMSG manpage with the
> >> alignment purposes:
> >>
> >> union { /* Ancillary data buffer, wrapped in a union
> >> in order to ensure it is suitably aligned */
> >> char buf[CMSG_SPACE(sizeof(myfds))];
> >> struct cmsghdr align;
> >> } u;
> >>
> >> Such unions could form an array in case user wants multiple
> >> instances of them. For example, if you want receive up to
> >> 32 network packets via recvmmsg(), you will need 32 unions like 'u'.
> >> Open vSwitch does exactly that and fails the check.
> >>
> >> Disabling this check by default for unions. Adding new option
> >> -Wflex-union-array to enable it back. This option works only
> >> if -Wflex-array-array enabled (which is default behavior).
> >>
> >> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
> >> ---
> >>
> >> Not sure if this is a best way to fix the issue, but it works fine for
> >> openvswitch project. The actual code in question that makes sparse fail
> >> OVS build could be found here:
> >> https://github.com/openvswitch/ovs/blob/39fbd2c3f0392811689ec780f09baf90faceb877/lib/netdev-linux.c#L1238
> >
> > This fixes your problem for -Wflexible-array-array but the same
> > will happen with -Wflexible-array-sizeof (and you're using sizeof()
> > on such flexible unions) and -Wflexible-array-nested.
>
> I thought that it will fail some other checks too, but for some reason
> it doesn't. But, yes, you're right, It sounds safer to disable all
> of them to avoid possible issues in the future since we're actually
> using these unions.
Thanks for giving it a try.
> > options.c | 2 ++
> > options.h | 1 +
> > sparse.1 | 9 +++++++++
> > symbol.c | 2 +-
> > validation/flex-union-array-no.c | 9 +++++++++
> > validation/flex-union-array-yes.c | 11 +++++++++++
> > validation/flex-union-array.h | 11 +++++++++++
> > 7 files changed, 44 insertions(+), 1 deletion(-)
> > create mode 100644 validation/flex-union-array-no.c
> > create mode 100644 validation/flex-union-array-yes.c
> > create mode 100644 validation/flex-union-array.h
>
> Since you renamed the option, it might make sense to rename
> files to 'flex-array-union...'.
Well yes, I left them more or less on purpose but renamed them now.
-- Luc
next prev parent reply other threads:[~2020-10-09 15:39 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-07 11:52 [PATCH] flex-array: allow arrays of unions with flexible members Ilya Maximets
2020-10-07 23:09 ` Luc Van Oostenryck
2020-10-08 6:36 ` Ilya Maximets
2020-10-09 15:39 ` Luc Van Oostenryck [this message]
2020-10-07 23:15 ` Luc Van Oostenryck
2020-10-08 9:13 ` Ilya Maximets
2020-10-08 10:04 ` Ilya Maximets
2020-10-09 16:01 ` Luc Van Oostenryck
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=20201009153952.io6hdo4srfc653z5@ltop.local \
--to=luc.vanoostenryck@gmail.com \
--cc=aconole@redhat.com \
--cc=i.maximets@ovn.org \
--cc=ian.stokes@intel.com \
--cc=linux-sparse@vger.kernel.org \
--cc=ovs-dev@openvswitch.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox