aboutsummaryrefslogtreecommitdiff
path: root/gdb/c-exp.y
diff options
context:
space:
mode:
authorPhilippe Waroquiers <philippe.waroquiers@skynet.be>2019-02-09 15:02:25 +0100
committerPhilippe Waroquiers <philippe.waroquiers@skynet.be>2019-02-10 13:01:35 +0100
commitab759ca8db37ffd3e32df5226e0b4ea16a81c849 (patch)
tree7ae1998c3678c7981c1e9fa6893072cbaeb00595 /gdb/c-exp.y
parentaff29d1c738c0327e7b40ba9f6885279b75e3eca (diff)
downloadgdb-ab759ca8db37ffd3e32df5226e0b4ea16a81c849.zip
gdb-ab759ca8db37ffd3e32df5226e0b4ea16a81c849.tar.gz
gdb-ab759ca8db37ffd3e32df5226e0b4ea16a81c849.tar.bz2
Fix type_stack leaks in c expression parsing.
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.
Diffstat (limited to 'gdb/c-exp.y')
-rw-r--r--gdb/c-exp.y4
1 files changed, 4 insertions, 0 deletions
diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index f3ef23c..508e9ef 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -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 ($$);
}
;