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.
This commit is contained in:
parent
aff29d1c73
commit
ab759ca8db
|
@ -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
|
||||
|
|
|
@ -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 ($$);
|
||||
}
|
||||
;
|
||||
|
||||
|
|
Loading…
Reference in New Issue