Fix type_stack leaks in c expression parsing.
authorPhilippe Waroquiers <philippe.waroquiers@skynet.be>
Sat, 9 Feb 2019 14:02:25 +0000 (15:02 +0100)
committerPhilippe Waroquiers <philippe.waroquiers@skynet.be>
Sun, 10 Feb 2019 12:01:35 +0000 (13:01 +0100)
Valgrind detects a bunch of leaks in several tests, such as:

==22905== 40 (24 direct, 16 indirect) bytes in 1 blocks are definitely lost in loss record 531 of 3,268
==22905==    at 0x4C2C4CC: operator new(unsigned long) (vg_replace_malloc.c:344)
==22905==    by 0x5893AD: get_type_stack() (parse.c:1509)
==22905==    by 0x3F4EAD: c_yyparse() (c-exp.y:1223)
==22905==    by 0x3F71BC: c_parse(parser_state*) (c-exp.y:3308)
==22905==    by 0x588CEA: parse_exp_in_context_1(char const**, unsigned long, block const*, int, int, int*) [clone .constprop.89] (parse.c:1205)
==22905==    by 0x588FA1: parse_exp_in_context (parse.c:1108)
==22905==    by 0x588FA1: parse_exp_1 (parse.c:1099)
==22905==    by 0x588FA1: parse_expression(char const*) (parse.c:1247)
...

==22395== 456 (168 direct, 288 indirect) bytes in 7 blocks are definitely lost in loss record 2,658 of 2,978
==22395==    at 0x4C2C4CC: operator new(unsigned long) (vg_replace_malloc.c:344)
==22395==    by 0x5893AD: get_type_stack() (parse.c:1509)
==22395==    by 0x3F4ECF: c_yyparse() (c-exp.y:1230)
==22395==    by 0x3F71BC: c_parse(parser_state*) (c-exp.y:3308)
==22395==    by 0x588CEA: parse_exp_in_context_1(char const**, unsigned long, block const*, int, int, int*) [clone .constprop.89] (parse.c:1205)
==22395==    by 0x588FA1: parse_exp_in_context (parse.c:1108)
==22395==    by 0x588FA1: parse_exp_1 (parse.c:1099)
==22395==    by 0x588FA1: parse_expression(char const*) (parse.c:1247)
==22395==    by 0x67BB9D: whatis_exp(char const*, int) (typeprint.c:515)
...

==22395== VALGRIND_GDB_ERROR_BEGIN
==22395== 144 (24 direct, 120 indirect) bytes in 1 blocks are definitely lost in loss record 1,016 of 2,978
==22395==    at 0x4C2C4CC: operator new(unsigned long) (vg_replace_malloc.c:344)
==22395==    by 0x5893AD: get_type_stack() (parse.c:1509)
==22395==    by 0x3F4E8A: c_yyparse() (c-exp.y:1217)
==22395==    by 0x3F71BC: c_parse(parser_state*) (c-exp.y:3308)
==22395==    by 0x588CEA: parse_exp_in_context_1(char const**, unsigned long, block const*, int, int, int*) [clone .constprop.89] (parse.c:1205)
==22395==    by 0x588FA1: parse_exp_in_context (parse.c:1108)
==22395==    by 0x588FA1: parse_exp_1 (parse.c:1099)
==22395==    by 0x588FA1: parse_expression(char const*) (parse.c:1247)
==22395==    by 0x67BB9D: whatis_exp(char const*, int) (typeprint.c:515)
...

Fix these by storing the allocated type_stack in the cpstate->type_stacks
vector.

Tested on debian/amd64, natively and under valgrind.

gdb/ChangeLog
2019-02-10  Philippe Waroquiers  <philippe.waroquiers@skynet.be>

* c-exp.y (direct_abs_decl): Use emplace_back to record the
type_stack.

gdb/ChangeLog
gdb/c-exp.y

index 3deb474bf55cbe1293bfdbea0c57b74e5c70d067..f4f0c0c939672115404d1638f4246cb206ad392c 100644 (file)
@@ -1,3 +1,8 @@
+2019-02-10  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
+
+       * c-exp.y (direct_abs_decl): Use emplace_back to record the
+       type_stack.
+
 2019-02-10  Joel Brobecker  <brobecker@adacore.com>
 
        * ada-varobj.c (ada_value_is_changeable_p): Add handling of
index f3ef23c75a7ae9384bbff1002cbc1b103b6a15c9..508e9ef28ddc96267da047e93774518314519686 100644 (file)
@@ -1215,12 +1215,14 @@ direct_abs_decl: '(' abs_decl ')'
                          push_type_int ($2);
                          push_type (tp_array);
                          $$ = get_type_stack ();
+                         cpstate->type_stacks.emplace_back ($$);
                        }
        |       array_mod
                        {
                          push_type_int ($1);
                          push_type (tp_array);
                          $$ = get_type_stack ();
+                         cpstate->type_stacks.emplace_back ($$);
                        }
 
        |       direct_abs_decl func_mod
@@ -1228,11 +1230,13 @@ direct_abs_decl: '(' abs_decl ')'
                          push_type_stack ($1);
                          push_typelist ($2);
                          $$ = get_type_stack ();
+                         cpstate->type_stacks.emplace_back ($$);
                        }
        |       func_mod
                        {
                          push_typelist ($1);
                          $$ = get_type_stack ();
+                         cpstate->type_stacks.emplace_back ($$);
                        }
        ;