[PATCH v1 4/7] bfd: fix memory leak when default-initializing an OAv2 attribute

Matthieu Longo matthieu.longo@arm.com
Thu Feb 5 16:02:22 GMT 2026


On 05/02/2026 15:39, Jan Beulich wrote:
> On 05.02.2026 16:18, Matthieu Longo wrote:
>> New version using oav2_assign_value().
> 
> Just one question:
> 
>> --- a/bfd/elf-attrs.c
>> +++ b/bfd/elf-attrs.c
>> @@ -1083,33 +1083,30 @@ oav2_attr_overwrite_with_default (const struct bfd_link_info *info,
>>    {
>>      const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
>>
>> +  union obj_attr_value_v2 default_value;
>> +  memset (&default_value, 0, sizeof (default_value));
> 
> Why not via an initializer?
> 
> Jan

I did some research because I remember that last time I had to initialize a union with zero, there was an issue somewhere.
And I found that:

   {0} initializer in C or C++ for unions no longer guarantees clearing of the
   whole union (except for static storage duration initialization), it just
   initializes the first union member to zero. If initialization of the whole
   union including padding bits is desirable, use {} (valid in C23 or C++) or use
   -fzero-init-padding-bits=unions option to restore the old GCC behavior.

   Source: https://gcc.gnu.org/gcc-15/changes.html

We don't want to make C23 a requirement. And at the same time, the code must not be broken if someone wants to use C23.
So neither {0} nor {} would work here in my understanding.
The only alternative I found, without changing a compilation flag, was to use memset(). Or should I use bzero() instead ?

Matthieu


More information about the Binutils mailing list