From ab759ca8db37ffd3e32df5226e0b4ea16a81c849 Mon Sep 17 00:00:00 2001 From: Philippe Waroquiers Date: Sat, 9 Feb 2019 15:02:25 +0100 Subject: [PATCH] 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 * c-exp.y (direct_abs_decl): Use emplace_back to record the type_stack. --- gdb/ChangeLog | 5 +++++ gdb/c-exp.y | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3deb474..f4f0c0c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2019-02-10 Philippe Waroquiers + + * c-exp.y (direct_abs_decl): Use emplace_back to record the + type_stack. + 2019-02-10 Joel Brobecker * ada-varobj.c (ada_value_is_changeable_p): Add handling of 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 ($$); } ; -- 2.7.4