diff options
author | Philippe Waroquiers <philippe.waroquiers@skynet.be> | 2019-02-09 15:02:25 +0100 |
---|---|---|
committer | Philippe Waroquiers <philippe.waroquiers@skynet.be> | 2019-02-10 13:01:35 +0100 |
commit | ab759ca8db37ffd3e32df5226e0b4ea16a81c849 (patch) | |
tree | 7ae1998c3678c7981c1e9fa6893072cbaeb00595 /gdb/c-exp.y | |
parent | aff29d1c738c0327e7b40ba9f6885279b75e3eca (diff) | |
download | gdb-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.y | 4 |
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 ($$); } ; |