public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
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


  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).