From: Jason Merrill <jason@redhat.com>
To: Qing Zhao <qing.zhao@oracle.com>,
josmyers@redhat.com, richard.guenther@gmail.com,
siddhesh@gotplt.org
Cc: uecker@tugraz.at, keescook@chromium.org, gcc-patches@gcc.gnu.org
Subject: Re: [PATCH v3 1/4] Allow flexible array members in unions and alone in structures [PR53548]
Date: Tue, 30 Apr 2024 17:27:08 -0400 [thread overview]
Message-ID: <d35a529f-b8a5-4a02-98de-73be142de299@redhat.com> (raw)
In-Reply-To: <20240430145833.1366425-2-qing.zhao@oracle.com>
On 4/30/24 07:58, Qing Zhao wrote:
> The request for GCC to accept that the C99 flexible array member can be
> in a union or alone in a structure has been made a long time ago around 2012
> for supporting several practical cases including glibc.
>
> A GCC PR has been opened for such request at that time:
>
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53548
>
> However, this PR was closed as WONTFIX around 2015 due to the following reason:
>
> "there is an existing extension that makes the requested functionality possible"
> i.e GCC fully supported that the zero-length array can be in a union or alone
> in a structure for a long time. (though I didn't see any official documentation
> on such extension)
>
> It's reasonable to close PR53548 at that time since zero-length array extension
> can be used for such purpose.
>
> However, since GCC13, in order to improve the C/C++ security, we introduced
> -fstrict-flex-arrays=n to gradually eliminate the "fake flexible array"
> usages from C/C++ source code. As a result, zero-length arrays eventually
> will be replaced by C99 flexiable array member completely.
>
> Therefore, GCC needs to explicitly allow such extensions directly for C99
> flexible arrays, since flexable array member in unions or alone in structs
> are common code patterns in active use by the Linux kernel (and other projects).
>
> For example, these do not error by default with GCC:
>
> union one {
> int a;
> int b[0];
> };
>
> union two {
> int a;
> struct {
> struct { } __empty;
> int b[];
> };
> };
>
> But these do:
>
> union three {
> int a;
> int b[];
> };
>
> struct four {
> int b[];
> }
>
> Clang has supported such extensions since March, 2024
> https://github.com/llvm/llvm-project/pull/84428
>
> GCC should also support such extensions. This will allow for
> a seamless transition for code bases away from zero-length arrays without
> losing existing code patterns.
>
> gcc/ChangeLog:
>
> * doc/extend.texi: Add documentation for Flexible Array Members in
> Unions and Flexible Array Members alone in Structures.
> ---
> gcc/doc/extend.texi | 34 ++++++++++++++++++++++++++++++++++
> 1 file changed, 34 insertions(+)
>
> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
> index 7b54a241a7bf..cba98c8aadd7 100644
> --- a/gcc/doc/extend.texi
> +++ b/gcc/doc/extend.texi
> @@ -42,6 +42,8 @@ extensions, accepted by GCC in C90 mode and in C++.
> * Named Address Spaces::Named address spaces.
> * Zero Length:: Zero-length arrays.
> * Empty Structures:: Structures with no members.
> +* Flexible Array Members in Unions:: Unions with Flexible Array Members.
> +* Flexible Array Members alone in Structures:: Structures with only Flexible Array Members.
> * Variable Length:: Arrays whose length is computed at run time.
> * Variadic Macros:: Macros with a variable number of arguments.
> * Escaped Newlines:: Slightly looser rules for escaped newlines.
> @@ -1873,6 +1875,38 @@ The structure has size zero. In C++, empty structures are part
> of the language. G++ treats empty structures as if they had a single
> member of type @code{char}.
>
> +@node Flexible Array Members in Unions
> +@section Unions with Flexible Array Members
> +@cindex unions with flexible array members
> +@cindex unions with FAMs
> +
> +GCC permits a C99 flexible array member (FAM) to be in a union:
> +
> +@smallexample
> +union with_fam @{
> + int a;
> + int b[];
> +@};
> +@end smallexample
> +
> +If all the members of a union are flexible array member, the size of
"If the only member of a union is a flexible array member"
> +such union is zero.
"such a union"
> +
> +@node Flexible Array Members alone in Structures
> +@section Structures with only Flexible Array Members
> +@cindex structures with only flexible array members
> +@cindex structures with only FAMs
> +
> +GCC permits a C99 flexible array member (FAM) to be alone in a structure:
> +
> +@smallexample
> +struct only_fam @{
> + int b[];
> +@};
> +@end smallexample
> +
> +The size of such structure gives the size zero.
"The size of such a structure is zero"
> +
> @node Variable Length
> @section Arrays of Variable Length
> @cindex variable-length arrays
next prev parent reply other threads:[~2024-04-30 21:27 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-30 14:58 [PATCH v3 0/4]Allow " Qing Zhao
2024-04-30 14:58 ` [PATCH v3 1/4] Allow " Qing Zhao
2024-04-30 21:27 ` Jason Merrill [this message]
2024-04-30 21:45 ` Qing Zhao
2024-04-30 21:49 ` Qing Zhao
2024-04-30 21:52 ` Jason Merrill
2024-04-30 21:53 ` Qing Zhao
2024-04-30 21:51 ` Jason Merrill
2024-04-30 23:55 ` Kees Cook
2024-05-01 14:02 ` Qing Zhao
2024-04-30 14:58 ` [PATCH v3 2/4] C and C++ FE changes Qing Zhao
2024-04-30 14:58 ` [PATCH v3 3/4] Add testing cases for flexible array members in unions and alone in structures Qing Zhao
2024-04-30 14:58 ` [PATCH v3 4/4] Update the C FE routine "add_flexible_array_elts_to_size" C++ FE routine "layout_var_decl" to handle the cases when the DECL is union Qing Zhao
2024-04-30 21:29 ` Jason Merrill
2024-04-30 21:36 ` Qing Zhao
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=d35a529f-b8a5-4a02-98de-73be142de299@redhat.com \
--to=jason@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=josmyers@redhat.com \
--cc=keescook@chromium.org \
--cc=qing.zhao@oracle.com \
--cc=richard.guenther@gmail.com \
--cc=siddhesh@gotplt.org \
--cc=uecker@tugraz.at \
/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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).