attribs: Fix valgrind failures on -Wno-attributes* tests [PR112953]

Message ID ZXlqLxcI69T1ypbA@tucnak
State Unresolved
Headers
Series attribs: Fix valgrind failures on -Wno-attributes* tests [PR112953] |

Checks

Context Check Description
snail/gcc-patch-check warning Git am fail log

Commit Message

Jakub Jelinek Dec. 13, 2023, 8:24 a.m. UTC
  Hi!

The r14-6076 change changed the allocation of attribute tables from
table = new attribute_spec[2];
to
table = new attribute_spec { ... };
with
ignored_attributes_table.safe_push (table);
later in both cases, but didn't change the corresponding delete in
free_attr_data, which means valgrind is unhappy about that:
FAIL: c-c++-common/Wno-attributes-2.c  -Wc++-compat  (test for excess errors)
Excess errors:
==974681== Mismatched free() / delete / delete []
==974681==    at 0x484965B: operator delete[](void*) (vg_replace_malloc.c:1103)
==974681==    by 0x707434: free_attr_data() (attribs.cc:318)
==974681==    by 0xCFF8A4: compile_file() (toplev.cc:454)
==974681==    by 0x704D23: do_compile (toplev.cc:2150)
==974681==    by 0x704D23: toplev::main(int, char**) (toplev.cc:2306)
==974681==    by 0x7064BA: main (main.cc:39)
==974681==  Address 0x51dffa0 is 0 bytes inside a block of size 40 alloc'd
==974681==    at 0x4845FF5: operator new(unsigned long) (vg_replace_malloc.c:422)
==974681==    by 0x70A040: handle_ignored_attributes_option(vec<char*, va_heap, vl_ptr>*) (attribs.cc:301)
==974681==    by 0x7FA089: handle_pragma_diagnostic_impl<false, false> (c-pragma.cc:934)
==974681==    by 0x7FA089: handle_pragma_diagnostic(cpp_reader*) (c-pragma.cc:1028)
==974681==    by 0x75814F: c_parser_pragma(c_parser*, pragma_context, bool*) (c-parser.cc:14707)
==974681==    by 0x784A85: c_parser_external_declaration(c_parser*) (c-parser.cc:2027)
==974681==    by 0x785223: c_parser_translation_unit (c-parser.cc:1900)
==974681==    by 0x785223: c_parse_file() (c-parser.cc:26713)
==974681==    by 0x7F6331: c_common_parse_file() (c-opts.cc:1301)
==974681==    by 0xCFF87D: compile_file() (toplev.cc:446)
==974681==    by 0x704D23: do_compile (toplev.cc:2150)
==974681==    by 0x704D23: toplev::main(int, char**) (toplev.cc:2306)
==974681==    by 0x7064BA: main (main.cc:39)

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2023-12-13  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/112953
	* attribs.cc (free_attr_data): Use delete x rather than delete[] x.


	Jakub
  

Comments

Richard Biener Dec. 13, 2023, 8:45 a.m. UTC | #1
On Wed, 13 Dec 2023, Jakub Jelinek wrote:

> Hi!
> 
> The r14-6076 change changed the allocation of attribute tables from
> table = new attribute_spec[2];
> to
> table = new attribute_spec { ... };
> with
> ignored_attributes_table.safe_push (table);
> later in both cases, but didn't change the corresponding delete in
> free_attr_data, which means valgrind is unhappy about that:
> FAIL: c-c++-common/Wno-attributes-2.c  -Wc++-compat  (test for excess errors)
> Excess errors:
> ==974681== Mismatched free() / delete / delete []
> ==974681==    at 0x484965B: operator delete[](void*) (vg_replace_malloc.c:1103)
> ==974681==    by 0x707434: free_attr_data() (attribs.cc:318)
> ==974681==    by 0xCFF8A4: compile_file() (toplev.cc:454)
> ==974681==    by 0x704D23: do_compile (toplev.cc:2150)
> ==974681==    by 0x704D23: toplev::main(int, char**) (toplev.cc:2306)
> ==974681==    by 0x7064BA: main (main.cc:39)
> ==974681==  Address 0x51dffa0 is 0 bytes inside a block of size 40 alloc'd
> ==974681==    at 0x4845FF5: operator new(unsigned long) (vg_replace_malloc.c:422)
> ==974681==    by 0x70A040: handle_ignored_attributes_option(vec<char*, va_heap, vl_ptr>*) (attribs.cc:301)
> ==974681==    by 0x7FA089: handle_pragma_diagnostic_impl<false, false> (c-pragma.cc:934)
> ==974681==    by 0x7FA089: handle_pragma_diagnostic(cpp_reader*) (c-pragma.cc:1028)
> ==974681==    by 0x75814F: c_parser_pragma(c_parser*, pragma_context, bool*) (c-parser.cc:14707)
> ==974681==    by 0x784A85: c_parser_external_declaration(c_parser*) (c-parser.cc:2027)
> ==974681==    by 0x785223: c_parser_translation_unit (c-parser.cc:1900)
> ==974681==    by 0x785223: c_parse_file() (c-parser.cc:26713)
> ==974681==    by 0x7F6331: c_common_parse_file() (c-opts.cc:1301)
> ==974681==    by 0xCFF87D: compile_file() (toplev.cc:446)
> ==974681==    by 0x704D23: do_compile (toplev.cc:2150)
> ==974681==    by 0x704D23: toplev::main(int, char**) (toplev.cc:2306)
> ==974681==    by 0x7064BA: main (main.cc:39)
> 
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
> trunk?

OK.

> 2023-12-13  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR middle-end/112953
> 	* attribs.cc (free_attr_data): Use delete x rather than delete[] x.
> 
> --- gcc/attribs.cc.jj	2023-12-09 10:19:57.809813529 +0100
> +++ gcc/attribs.cc	2023-12-11 09:55:28.894461698 +0100
> @@ -315,7 +315,7 @@ void
>  free_attr_data ()
>  {
>    for (auto x : ignored_attributes_table)
> -    delete[] x;
> +    delete x;
>    ignored_attributes_table.release ();
>  }
>  
> 
> 	Jakub
> 
>
  

Patch

--- gcc/attribs.cc.jj	2023-12-09 10:19:57.809813529 +0100
+++ gcc/attribs.cc	2023-12-11 09:55:28.894461698 +0100
@@ -315,7 +315,7 @@  void
 free_attr_data ()
 {
   for (auto x : ignored_attributes_table)
-    delete[] x;
+    delete x;
   ignored_attributes_table.release ();
 }