When iterating a hash_map, be careful not to delete i->first

before doing ++i to avoid memory issues.

* src/tgba/taatgba.cc, src/tgba/taatgba.hh,
src/tgba/tgbaexplicit.cc, src/tgba/tgbaexplicit.hh: Fix them.
This commit is contained in:
Damien Lefortier 2010-01-20 17:37:25 +01:00
parent 0d6fd3225a
commit 04827ef4a1
5 changed files with 63 additions and 32 deletions

View file

@ -1,3 +1,11 @@
2010-01-20 Damien Lefortier <dam@lrde.epita.fr>
When iterating a hash_map, be careful not to delete i->first
before doing ++i to avoid memory issues.
* src/tgba/taatgba.cc, src/tgba/taatgba.hh,
src/tgba/tgbaexplicit.cc, src/tgba/tgbaexplicit.hh: Fix them.
2010-01-20 Damien Lefortier <dam@lrde.epita.fr> 2010-01-20 Damien Lefortier <dam@lrde.epita.fr>
Minor fixes to compile with GCC 3.3 Minor fixes to compile with GCC 3.3

View file

@ -302,8 +302,13 @@ namespace spot
delete succ_[i]->dst; delete succ_[i]->dst;
delete succ_[i]; delete succ_[i];
} }
for (seen_map::iterator i = seen_.begin(); i != seen_.end(); ++i) for (seen_map::iterator i = seen_.begin(); i != seen_.end();)
delete i->first; {
// Advance the iterator before deleting the formula.
const spot::state_set* s = i->first;
++i;
delete s;
}
} }
void void
@ -350,6 +355,18 @@ namespace spot
| taa_tgba_string | | taa_tgba_string |
`----------------*/ `----------------*/
taa_tgba_string::~taa_tgba_string()
{
ns_map::iterator i;
for (i = name_state_map_.begin(); i != name_state_map_.end(); ++i)
{
taa_tgba::state::iterator i2;
for (i2 = i->second->begin(); i2 != i->second->end(); ++i2)
delete *i2;
delete i->second;
}
}
std::string std::string
taa_tgba_string::label_to_string(const label_t& label) const taa_tgba_string::label_to_string(const label_t& label) const
{ {
@ -370,7 +387,16 @@ namespace spot
{ {
ns_map::iterator i; ns_map::iterator i;
for (i = name_state_map_.begin(); i != name_state_map_.end(); ++i) for (i = name_state_map_.begin(); i != name_state_map_.end(); ++i)
i->first->destroy(); {
taa_tgba::state::iterator i2;
for (i2 = i->second->begin(); i2 != i->second->end(); ++i2)
delete *i2;
// Advance the iterator before deleting the formula.
const ltl::formula* s = i->first;
delete i->second;
++i;
s->destroy();
}
} }
std::string std::string

View file

@ -159,18 +159,6 @@ namespace spot
public: public:
taa_tgba_labelled(bdd_dict* dict) : taa_tgba(dict) {}; taa_tgba_labelled(bdd_dict* dict) : taa_tgba(dict) {};
virtual ~taa_tgba_labelled()
{
typename ns_map::iterator i;
for (i = name_state_map_.begin(); i != name_state_map_.end(); ++i)
{
taa_tgba::state::iterator i2;
for (i2 = i->second->begin(); i2 != i->second->end(); ++i2)
delete *i2;
delete i->second;
}
}
void set_init_state(const label& s) void set_init_state(const label& s)
{ {
std::vector<label> v(1); std::vector<label> v(1);
@ -344,6 +332,7 @@ namespace spot
public: public:
taa_tgba_string(bdd_dict* dict) : taa_tgba_string(bdd_dict* dict) :
taa_tgba_labelled<std::string, string_hash>(dict) {}; taa_tgba_labelled<std::string, string_hash>(dict) {};
~taa_tgba_string();
protected: protected:
virtual std::string label_to_string(const std::string& label) const; virtual std::string label_to_string(const std::string& label) const;
virtual std::string clone_if(const std::string& label) const; virtual std::string clone_if(const std::string& label) const;
@ -355,7 +344,6 @@ namespace spot
public: public:
taa_tgba_formula(bdd_dict* dict) : taa_tgba_formula(bdd_dict* dict) :
taa_tgba_labelled<const ltl::formula*, ltl::formula_ptr_hash>(dict) {}; taa_tgba_labelled<const ltl::formula*, ltl::formula_ptr_hash>(dict) {};
// Labels are pointers here and must be destroyed eventually.
~taa_tgba_formula(); ~taa_tgba_formula();
protected: protected:
virtual std::string label_to_string(const label_t& label) const; virtual std::string label_to_string(const label_t& label) const;

View file

@ -284,6 +284,18 @@ namespace spot
return neg_acceptance_conditions_; return neg_acceptance_conditions_;
} }
tgba_explicit_string::~tgba_explicit_string()
{
ns_map::iterator i;
for (i = name_state_map_.begin(); i != name_state_map_.end(); ++i)
{
tgba_explicit::state::iterator i2;
for (i2 = i->second->begin(); i2 != i->second->end(); ++i2)
delete *i2;
delete i->second;
}
}
tgba_explicit::state* tgba_explicit::state*
tgba_explicit_string::add_default_init() tgba_explicit_string::add_default_init()
{ {
@ -302,9 +314,18 @@ namespace spot
tgba_explicit_formula::~tgba_explicit_formula() tgba_explicit_formula::~tgba_explicit_formula()
{ {
ns_map::iterator i; ns_map::iterator i = name_state_map_.begin();
for (i = name_state_map_.begin(); i != name_state_map_.end(); ++i) while (i != name_state_map_.end())
i->first->destroy(); {
tgba_explicit::state::iterator i2;
for (i2 = i->second->begin(); i2 != i->second->end(); ++i2)
delete *i2;
// Advance the iterator before deleting the formula.
const ltl::formula* s = i->first;
delete i->second;
++i;
s->destroy();
}
} }
tgba_explicit::state* tgba_explicit_formula::add_default_init() tgba_explicit::state* tgba_explicit_formula::add_default_init()

View file

@ -142,11 +142,6 @@ namespace spot
public: public:
tgba_explicit_succ_iterator(const tgba_explicit::state* s, bdd all_acc); tgba_explicit_succ_iterator(const tgba_explicit::state* s, bdd all_acc);
virtual
~tgba_explicit_succ_iterator()
{
}
virtual void first(); virtual void first();
virtual void next(); virtual void next();
virtual bool done() const; virtual bool done() const;
@ -312,14 +307,6 @@ namespace spot
virtual virtual
~tgba_explicit_labelled() ~tgba_explicit_labelled()
{ {
typename ns_map::iterator i;
for (i = name_state_map_.begin(); i != name_state_map_.end(); ++i)
{
tgba_explicit::state::iterator i2;
for (i2 = i->second->begin(); i2 != i->second->end(); ++i2)
delete *i2;
delete i->second;
}
} }
}; };
@ -331,6 +318,7 @@ namespace spot
tgba_explicit_string(bdd_dict* dict): tgba_explicit_string(bdd_dict* dict):
tgba_explicit_labelled<std::string, string_hash>(dict) tgba_explicit_labelled<std::string, string_hash>(dict)
{}; {};
virtual ~tgba_explicit_string();
virtual state* add_default_init(); virtual state* add_default_init();
virtual std::string format_state(const spot::state* s) const; virtual std::string format_state(const spot::state* s) const;
}; };