From 995335618a1adfa95d382e8f3cd17d3ab5efb6a1 Mon Sep 17 00:00:00 2001 From: Damien Lefortier Date: Mon, 7 Sep 2009 16:41:18 +0200 Subject: [PATCH] Fix some memory leaks. * src/eltlparse/eltlparse.yy: Free the automatop::vec when CHECK_ARITY fails while parsing an automatop. * src/eltltest/acc.cc: Free all constructed formulae. --- ChangeLog | 8 ++++++++ src/eltlparse/eltlparse.yy | 13 +++++++++++-- src/eltltest/acc.cc | 6 ++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index e831e4fd5..cb3bc0511 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-09-07 Damien Lefortier + + Fix some memory leaks. + + * src/eltlparse/eltlparse.yy: Free the automatop::vec when + CHECK_ARITY fails while parsing an automatop. + * src/eltltest/acc.cc: Free all constructed formulae. + 2009-09-07 Alexandre Duret-Lutz Fix a memory leak in reduce_tau03(). diff --git a/src/eltlparse/eltlparse.yy b/src/eltlparse/eltlparse.yy index 080979e59..6bf2ba1df 100644 --- a/src/eltlparse/eltlparse.yy +++ b/src/eltlparse/eltlparse.yy @@ -457,7 +457,17 @@ subformula: ATOMIC_PROP CHECK_EXISTING_NMAP(@1, $1); nfa::ptr np = nmap[*$1]; - CHECK_ARITY(@1, $1, $3->size(), np->arity()); + /// Easily handle deletion of $3 when CHECK_ARITY fails. + int i = $3->size(); + if ($3->size() != np->arity()) + { + automatop::vec::iterator it = $3->begin(); + while (it != $3->end()) + spot::ltl::destroy(*it++); + delete $3; + } + + CHECK_ARITY(@1, $1, i, np->arity()); $$ = automatop::instance(np, $3, false); } delete $1; @@ -484,7 +494,6 @@ subformula: ATOMIC_PROP arg_list: subformula { - // TODO: delete it whenever a parse error occurs on a subformula. $$ = new automatop::vec; $$->push_back($1); } diff --git a/src/eltltest/acc.cc b/src/eltltest/acc.cc index 0c71f7d11..029928ea2 100644 --- a/src/eltltest/acc.cc +++ b/src/eltltest/acc.cc @@ -36,7 +36,10 @@ main(int argc, char** argv) if (spot::eltl::format_parse_errors(std::cerr, p)) { if (f != 0) + { std::cout << f->dump() << std::endl; + spot::ltl::destroy(f); + } return 1; } @@ -46,6 +49,9 @@ main(int argc, char** argv) assert(f != 0); std::cout << f->dump() << std::endl; + spot::ltl::destroy(f); + assert(f2 != 0); std::cout << f2->dump() << std::endl; + spot::ltl::destroy(f2); }