Don't let Bison leak memory except when it complains.

* src/files.h (parser_file_name, spec_verbose_file, spec_graph_file):
(spec_defines_file, dir_prefix): Now char *, not const char *,
since they are freed.
* src/files.c: Likewise.
(all_but_ext, all_but_tab_ext, src_extension, header_extension):
Likewise.
(tr): Now operates in-place.  All uses changed.
(compute_exts_from_gf, compute_exts_from_src): Don't leak temporary
values.
(compute_file_name_parts, compute_output_file_names): Don't store
read-only data in variables that will be freed.
(compute_output_file_names): Free all_but_ext, all_but_tab_ext,
src_extension, and header_extension.
(output_file_names_free): New public function to free
spec_verbose_file, spec_graph_file, spec_defines_file,
parser_file_name, and dir_prefix.
* src/getargs.c (getargs): Don't store read-only data in variables that
will be freed.
* src/main.c (main): Invoke output_file_names_free, code_scanner_free
(which previously existed but was unused), and quotearg_free.
* src/muscle_tab.h (muscle_insert): value arg is now a `char const *'.
* src/muscle_tab.c: Likewise.
(muscle_entry): Make the value char const *,
and add a new storage member that is char * and can be freed.
(muscle_entry_free): New private function.
(muscle_init): Use it instead of free.
(muscle_insert, muscle_grow): Update and use new storage member.
(muscle_code_grow): Free the string passed to muscle_grow
since it's not needed anymore.
* src/parse-gram.y (%union): Make `chars' member a `char const *', and
add a new `char *code' member.
("{...}"): Declare semantic type as code.
* src/scan-code.h (translate_rule_action):
(translate_symbol_action, translate_code, translate_action): Return
`char const *' rather than `char *' since external code should not free
these strings.
* src/scan-code.l: Likewise.
* src/scan-gram.l (<SC_BRACED_CODE>): Use val->code for BRACED_CODE,
which is "{...}" in the parser.
* tests/Makefile.am (maintainer-check-valgrind): Set
VALGRIND_OPTS='--leak-check=full --show-reacheable=yes' before invoking
Valgrind.
* tests/calc.at (_AT_DATA_CALC_Y): fclose the FILE* so Valgrind doesn't
complain.
* tests/testsuite.at (AT_CHECK): Redefine so that running Bison and
expecting a non-zero exit status sets --leak-check=summary and
--show-reachable=no for Valgrind.  Bison unabashedly leaks memory in
this case, and we don't want to hear about it.
This commit is contained in:
Paul Eggert
2006-11-08 20:28:57 +00:00
parent ac564be451
commit eb09565001
14 changed files with 174 additions and 75 deletions

View File

@@ -88,6 +88,7 @@ maintainer-check-posix: $(TESTSUITE)
.PHONY: maintainer-check-valgrind
maintainer-check-valgrind: $(TESTSUITE)
test -z '$(VALGRIND)' || \
VALGRIND_OPTS='--leak-check=full --show-reachable=yes' \
$(TESTSUITE) PREBISON='$(VALGRIND) -q' PREPARSER='$(VALGRIND) -q'
.PHONY: maintainer-check

View File

@@ -337,6 +337,7 @@ main (int argc, const char **argv)
]AT_SKEL_CC_IF([], [m4_bmatch([$4], [%debug],
[ yydebug = 1;])])[
status = yyparse (]AT_PARAM_IF([&result, &count])[);
fclose (input);
if (global_result != result)
abort ();
if (global_count != count)

View File

@@ -1,7 +1,7 @@
# Process this file with autom4te to create testsuite. -*- Autotest -*-
# Test suite for GNU Bison. -*- Autotest -*-
# Test suite for GNU Bison.
# Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006 Free Software
# Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -19,6 +19,15 @@
# 02110-1301, USA.
# Bison often leaks memory when its exit status is non-zero, so set
# --leak-check=summary for Valgrind in that case.
m4_pushdef([ORIGINAL_AT_CHECK], m4_defn([AT_CHECK]))
m4_pushdef([AT_CHECK],
[ORIGINAL_AT_CHECK(
m4_if(m4_quote(m4_substr(m4_quote($1), 0, 5)), [bison],
m4_if([$2], [0], [],
[[VALGRIND_OPTS="$VALGRIND_OPTS --leak-check=summary --show-reachable=no"; export VALGRIND_OPTS; ]]))$@)])
# Testing resistance to user bugs.
m4_include([input.at])
@@ -64,3 +73,6 @@ m4_include([c++.at])
m4_include([cxx-type.at])
# Regression tests
m4_include([glr-regression.at])
m4_popdef([AT_CHECK])
m4_popdef([ORIGINAL_AT_CHECK])