Commit 66b1630c authored by Alexandre Duret-Lutz's avatar Alexandre Duret-Lutz
Browse files

Homogenize passing of automata as pointers, not references.

Disallow copy for security.

* src/tgba/tgbabddconcrete.hh (tgba_bdd_concrete): Disallow copy.
* src/tgba/tgbaexplicit.hh (tgba_explicit): Likewise.
* src/tgba/tgbaexplicit.cc (tgba_explicit::operator=,
tgba_explicit::tgba_explicit(tgba_explicit)): Remove.
* src/tgba/tgbabddconcreteproduct.cc
(tgba_bdd_concrete_product_factory::tgba_bdd_concrete_product_factory,
product): Take operand automata as pointers.
* src/tgba/tgbabddconcreteproduct.hh (product): Likewise.
* src/tgba/tgbaproduct.cc, src/tgba/tgbaproduct.hh:
(tgba_product): Disallow copy.
(tgba_product::tgba_product): Take operand automata as pointers.
* src/tgbaalgos/dotty.cc (dotty_state, dotty_rec, dotty_reachable):
Take tgba arguments as pointer.
* src/tgbaalgos/dotty.hh (dotty_reachable): Likewise.
* src/tgbaalgos/lbtt.cc (fill_todo, lbtt_reachable): Likewise.
* src/tgbaalgos/lbtt.hh (lbtt_reachable): Likewise.
* src/tgbaalgos/ltl2tgba.cc, src/tgbaalgos/ltl2tgba.hh (ltl_to_tgba):
Likewise.
* src/tgbaalgos/save.cc (save_rec, tgba_save_reachable): Likewise.
* src/tgbaalgos/save.hh (save): Likewise.
* src/tgbatest/explicit.cc, src/tgbatest/explprod.cc,
src/tgbatest/ltl2tgba.cc, src/tgbatest/ltlprod.cc,
src/tgbatest/mixprod.cc, src/tgbatest/readsave.cc,
src/tgbatest/spotlbtt.cc, src/tgbatest/tgbaread.cc,
src/tgbatest/tripprod.cc: Likewise.
parent cab3be97
2003-07-15 Alexandre Duret-Lutz <aduret@src.lip6.fr>
Homogenize passing of automata as pointers, not references.
Disallow copy for security.
* src/tgba/tgbabddconcrete.hh (tgba_bdd_concrete): Disallow copy.
* src/tgba/tgbaexplicit.hh (tgba_explicit): Likewise.
* src/tgba/tgbaexplicit.cc (tgba_explicit::operator=,
tgba_explicit::tgba_explicit(tgba_explicit)): Remove.
* src/tgba/tgbabddconcreteproduct.cc
(tgba_bdd_concrete_product_factory::tgba_bdd_concrete_product_factory,
product): Take operand automata as pointers.
* src/tgba/tgbabddconcreteproduct.hh (product): Likewise.
* src/tgba/tgbaproduct.cc, src/tgba/tgbaproduct.hh:
(tgba_product): Disallow copy.
(tgba_product::tgba_product): Take operand automata as pointers.
* src/tgbaalgos/dotty.cc (dotty_state, dotty_rec, dotty_reachable):
Take tgba arguments as pointer.
* src/tgbaalgos/dotty.hh (dotty_reachable): Likewise.
* src/tgbaalgos/lbtt.cc (fill_todo, lbtt_reachable): Likewise.
* src/tgbaalgos/lbtt.hh (lbtt_reachable): Likewise.
* src/tgbaalgos/ltl2tgba.cc, src/tgbaalgos/ltl2tgba.hh (ltl_to_tgba):
Likewise.
* src/tgbaalgos/save.cc (save_rec, tgba_save_reachable): Likewise.
* src/tgbaalgos/save.hh (save): Likewise.
* src/tgbatest/explicit.cc, src/tgbatest/explprod.cc,
src/tgbatest/ltl2tgba.cc, src/tgbatest/ltlprod.cc,
src/tgbatest/mixprod.cc, src/tgbatest/readsave.cc,
src/tgbatest/spotlbtt.cc, src/tgbatest/tgbaread.cc,
src/tgbatest/tripprod.cc: Likewise.
2003-07-14 Alexandre Duret-Lutz <aduret@src.lip6.fr> 2003-07-14 Alexandre Duret-Lutz <aduret@src.lip6.fr>
Before this change, all automata would construct their own Before this change, all automata would construct their own
......
...@@ -58,6 +58,10 @@ namespace spot ...@@ -58,6 +58,10 @@ namespace spot
protected: protected:
tgba_bdd_core_data data_; ///< Core data associated to the automaton. tgba_bdd_core_data data_; ///< Core data associated to the automaton.
bdd init_; ///< Initial state. bdd init_; ///< Initial state.
private:
// Disallow copy.
tgba_bdd_concrete(const tgba_bdd_concrete&);
tgba_bdd_concrete& tgba_bdd_concrete::operator=(const tgba_bdd_concrete&);
}; };
} }
......
...@@ -11,15 +11,15 @@ namespace spot ...@@ -11,15 +11,15 @@ namespace spot
class tgba_bdd_product_factory: public tgba_bdd_factory class tgba_bdd_product_factory: public tgba_bdd_factory
{ {
public: public:
tgba_bdd_product_factory(const tgba_bdd_concrete& left, tgba_bdd_product_factory(const tgba_bdd_concrete* left,
const tgba_bdd_concrete& right) const tgba_bdd_concrete* right)
: dict_(left.get_dict()), : dict_(left->get_dict()),
left_(left), left_(left),
right_(right), right_(right),
data_(left_.get_core_data(), right_.get_core_data()), data_(left_->get_core_data(), right_->get_core_data()),
init_(left_.get_init_bdd() & right_.get_init_bdd()) init_(left_->get_init_bdd() & right_->get_init_bdd())
{ {
assert(dict_ == right.get_dict()); assert(dict_ == right->get_dict());
} }
virtual virtual
...@@ -47,16 +47,16 @@ namespace spot ...@@ -47,16 +47,16 @@ namespace spot
private: private:
bdd_dict* dict_; bdd_dict* dict_;
const tgba_bdd_concrete& left_; const tgba_bdd_concrete* left_;
const tgba_bdd_concrete& right_; const tgba_bdd_concrete* right_;
tgba_bdd_core_data data_; tgba_bdd_core_data data_;
bdd init_; bdd init_;
}; };
tgba_bdd_concrete tgba_bdd_concrete*
product(const tgba_bdd_concrete& left, const tgba_bdd_concrete& right) product(const tgba_bdd_concrete* left, const tgba_bdd_concrete* right)
{ {
tgba_bdd_product_factory p(left, right); tgba_bdd_product_factory p(left, right);
return tgba_bdd_concrete(p, p.get_init_state()); return new tgba_bdd_concrete(p, p.get_init_state());
} }
} }
...@@ -9,8 +9,8 @@ namespace spot ...@@ -9,8 +9,8 @@ namespace spot
/// ///
/// This function build the resulting product, as another /// This function build the resulting product, as another
/// tgba::tgba_bdd_concrete automaton. /// tgba::tgba_bdd_concrete automaton.
tgba_bdd_concrete tgba_bdd_concrete*
product(const tgba_bdd_concrete& left, const tgba_bdd_concrete& right); product(const tgba_bdd_concrete* left, const tgba_bdd_concrete* right);
} }
#endif // SPOT_TGBA_TGBABDDCONCRETEPRODUCT_HH #endif // SPOT_TGBA_TGBABDDCONCRETEPRODUCT_HH
...@@ -87,31 +87,6 @@ namespace spot ...@@ -87,31 +87,6 @@ namespace spot
{ {
} }
tgba_explicit::tgba_explicit(const tgba_explicit& other)
: tgba(),
name_state_map_(other.name_state_map_),
state_name_map_(other.state_name_map_),
dict_(other.dict_),
init_(other.init_),
all_accepting_conditions_(other.all_accepting_conditions_),
neg_accepting_conditions_(other.neg_accepting_conditions_),
all_accepting_conditions_computed_(other.
all_accepting_conditions_computed_)
{
dict_->register_all_variables_of(&other, this);
}
tgba_explicit&
tgba_explicit::operator=(const tgba_explicit& other)
{
if (&other != this)
{
this->~tgba_explicit();
new (this) tgba_explicit(other);
}
return *this;
}
tgba_explicit::~tgba_explicit() tgba_explicit::~tgba_explicit()
{ {
ns_map::iterator i; ns_map::iterator i;
......
...@@ -17,8 +17,6 @@ namespace spot ...@@ -17,8 +17,6 @@ namespace spot
{ {
public: public:
tgba_explicit(bdd_dict* dict); tgba_explicit(bdd_dict* dict);
tgba_explicit(const tgba_explicit& other);
tgba_explicit& tgba_explicit::operator=(const tgba_explicit& other);
struct transition; struct transition;
typedef std::list<transition*> state; typedef std::list<transition*> state;
...@@ -65,6 +63,11 @@ namespace spot ...@@ -65,6 +63,11 @@ namespace spot
mutable bdd all_accepting_conditions_; mutable bdd all_accepting_conditions_;
bdd neg_accepting_conditions_; bdd neg_accepting_conditions_;
mutable bool all_accepting_conditions_computed_; mutable bool all_accepting_conditions_computed_;
private:
// Disallow copy.
tgba_explicit(const tgba_explicit& other);
tgba_explicit& tgba_explicit::operator=(const tgba_explicit& other);
}; };
......
...@@ -143,10 +143,10 @@ namespace spot ...@@ -143,10 +143,10 @@ namespace spot
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// tgba_product // tgba_product
tgba_product::tgba_product(const tgba& left, const tgba& right) tgba_product::tgba_product(const tgba* left, const tgba* right)
: dict_(left.get_dict()), left_(&left), right_(&right) : dict_(left->get_dict()), left_(left), right_(right)
{ {
assert(dict_ == right.get_dict()); assert(dict_ == right->get_dict());
all_accepting_conditions_ = ((left_->all_accepting_conditions() all_accepting_conditions_ = ((left_->all_accepting_conditions()
& right_->neg_accepting_conditions()) & right_->neg_accepting_conditions())
......
...@@ -87,14 +87,14 @@ namespace spot ...@@ -87,14 +87,14 @@ namespace spot
}; };
/// \brief A lazy product. (States are computed on the fly.) /// \brief A lazy product. (States are computed on the fly.)
class tgba_product : public tgba class tgba_product: public tgba
{ {
public: public:
/// \brief Constructor. /// \brief Constructor.
/// \param left The left automata in the product. /// \param left The left automata in the product.
/// \param right The right automata in the product. /// \param right The right automata in the product.
/// Do not be fooled by these arguments: a product is commutative. /// Do not be fooled by these arguments: a product is commutative.
tgba_product(const tgba& left, const tgba& right); tgba_product(const tgba* left, const tgba* right);
virtual ~tgba_product(); virtual ~tgba_product();
...@@ -116,6 +116,9 @@ namespace spot ...@@ -116,6 +116,9 @@ namespace spot
const tgba* right_; const tgba* right_;
bdd all_accepting_conditions_; bdd all_accepting_conditions_;
bdd neg_accepting_conditions_; bdd neg_accepting_conditions_;
// Disallow copy.
tgba_product(const tgba_product&);
tgba_product& tgba_product::operator=(const tgba_product&);
}; };
} }
......
...@@ -10,7 +10,7 @@ namespace spot ...@@ -10,7 +10,7 @@ namespace spot
/// Output and record a state. /// Output and record a state.
static bool static bool
dotty_state(std::ostream& os, dotty_state(std::ostream& os,
const tgba& g, state* st, seen_map& m, int& node) const tgba* g, state* st, seen_map& m, int& node)
{ {
seen_map::iterator i = m.find(st); seen_map::iterator i = m.find(st);
...@@ -25,24 +25,24 @@ namespace spot ...@@ -25,24 +25,24 @@ namespace spot
m[st] = node; m[st] = node;
os << " " << node << " [label=\"" os << " " << node << " [label=\""
<< g.format_state(st) << "\"]" << std::endl; << g->format_state(st) << "\"]" << std::endl;
return true; return true;
} }
/// Process successors. /// Process successors.
static void static void
dotty_rec(std::ostream& os, dotty_rec(std::ostream& os,
const tgba& g, state* st, seen_map& m, int father) const tgba* g, state* st, seen_map& m, int father)
{ {
tgba_succ_iterator* si = g.succ_iter(st); tgba_succ_iterator* si = g->succ_iter(st);
for (si->first(); !si->done(); si->next()) for (si->first(); !si->done(); si->next())
{ {
int node; int node;
state* s = si->current_state(); state* s = si->current_state();
bool recurse = dotty_state(os, g, s, m, node); bool recurse = dotty_state(os, g, s, m, node);
os << " " << father << " -> " << node << " [label=\""; os << " " << father << " -> " << node << " [label=\"";
bdd_print_set(os, g.get_dict(), si->current_condition()) << "\\n"; bdd_print_set(os, g->get_dict(), si->current_condition()) << "\\n";
bdd_print_set(os, g.get_dict(), si->current_accepting_conditions()) bdd_print_set(os, g->get_dict(), si->current_accepting_conditions())
<< "\"]" << std::endl; << "\"]" << std::endl;
if (recurse) if (recurse)
{ {
...@@ -58,10 +58,10 @@ namespace spot ...@@ -58,10 +58,10 @@ namespace spot
} }
std::ostream& std::ostream&
dotty_reachable(std::ostream& os, const tgba& g) dotty_reachable(std::ostream& os, const tgba* g)
{ {
seen_map m; seen_map m;
state* state = g.get_init_state(); state* state = g->get_init_state();
os << "digraph G {" << std::endl; os << "digraph G {" << std::endl;
os << " size=\"7.26,10.69\"" << std::endl; os << " size=\"7.26,10.69\"" << std::endl;
os << " 0 [label=\"\", style=invis]" << std::endl; os << " 0 [label=\"\", style=invis]" << std::endl;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
namespace spot namespace spot
{ {
/// \brief Print reachable states in dot format. /// \brief Print reachable states in dot format.
std::ostream& dotty_reachable(std::ostream& os, const tgba& g); std::ostream& dotty_reachable(std::ostream& os, const tgba* g);
} }
#endif // SPOT_TGBAALGOS_DOTTY_HH #endif // SPOT_TGBAALGOS_DOTTY_HH
...@@ -130,7 +130,7 @@ namespace spot ...@@ -130,7 +130,7 @@ namespace spot
// a supplementary state, to act as initial state for LBTT.) // a supplementary state, to act as initial state for LBTT.)
void void
fill_todo(todo_set& todo, seen_map& seen, acp_seen_map& acp_seen, fill_todo(todo_set& todo, seen_map& seen, acp_seen_map& acp_seen,
state* state, const tgba& g, state* state, const tgba* g,
minmax_pair& mmp, unsigned& state_number, minmax_pair& mmp, unsigned& state_number,
bool init) bool init)
{ {
...@@ -147,7 +147,7 @@ namespace spot ...@@ -147,7 +147,7 @@ namespace spot
// Browse the successors of STATE to gather accepting // Browse the successors of STATE to gather accepting
// conditions of outgoing transitions. // conditions of outgoing transitions.
bdd_set acc_seen; bdd_set acc_seen;
tgba_succ_iterator* si = g.succ_iter(state); tgba_succ_iterator* si = g->succ_iter(state);
for (si->first(); !si->done(); si->next()) for (si->first(); !si->done(); si->next())
{ {
acc_seen.insert(si->current_accepting_conditions()); acc_seen.insert(si->current_accepting_conditions());
...@@ -176,9 +176,9 @@ namespace spot ...@@ -176,9 +176,9 @@ namespace spot
} }
std::ostream& std::ostream&
lbtt_reachable(std::ostream& os, const tgba& g) lbtt_reachable(std::ostream& os, const tgba* g)
{ {
const bdd_dict* d = g.get_dict(); const bdd_dict* d = g->get_dict();
std::ostringstream body; std::ostringstream body;
seen_map seen; seen_map seen;
...@@ -189,8 +189,8 @@ namespace spot ...@@ -189,8 +189,8 @@ namespace spot
minmax_pair mmp; minmax_pair mmp;
fill_todo(todo, seen, acp_seen, fill_todo(todo, seen, acp_seen,
g.get_init_state(), g, mmp, state_number, true); g->get_init_state(), g, mmp, state_number, true);
accepting_cond_splitter acs(g.all_accepting_conditions()); accepting_cond_splitter acs(g->all_accepting_conditions());
while(! todo.empty()) while(! todo.empty())
{ {
...@@ -209,7 +209,7 @@ namespace spot ...@@ -209,7 +209,7 @@ namespace spot
acs.split(body, sap.second); acs.split(body, sap.second);
body << "-1" << std::endl; body << "-1" << std::endl;
tgba_succ_iterator* si = g.succ_iter(sap.first); tgba_succ_iterator* si = g->succ_iter(sap.first);
for (si->first(); !si->done(); si->next()) for (si->first(); !si->done(); si->next())
{ {
// We have put the accepting conditions on the state, // We have put the accepting conditions on the state,
......
...@@ -28,7 +28,7 @@ namespace spot ...@@ -28,7 +28,7 @@ namespace spot
/// ///
/// \param g The automata to print. /// \param g The automata to print.
/// \param os Where to print. /// \param os Where to print.
std::ostream& lbtt_reachable(std::ostream& os, const tgba& g); std::ostream& lbtt_reachable(std::ostream& os, const tgba* g);
} }
#endif // SPOT_TGBAALGOS_LBTT_HH #endif // SPOT_TGBAALGOS_LBTT_HH
...@@ -230,7 +230,7 @@ namespace spot ...@@ -230,7 +230,7 @@ namespace spot
bool root_; bool root_;
}; };
tgba_bdd_concrete tgba_bdd_concrete*
ltl_to_tgba(const ltl::formula* f, bdd_dict* dict) ltl_to_tgba(const ltl::formula* f, bdd_dict* dict)
{ {
// Normalize the formula. We want all the negations on // Normalize the formula. We want all the negations on
...@@ -249,7 +249,6 @@ namespace spot ...@@ -249,7 +249,6 @@ namespace spot
fact.finish(); fact.finish();
// Finally setup the resulting automaton. // Finally setup the resulting automaton.
tgba_bdd_concrete g(fact, v.result()); return new tgba_bdd_concrete(fact, v.result());
return g;
} }
} }
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
namespace spot namespace spot
{ {
/// Build a spot::tgba_bdd_concrete from an LTL formula. /// Build a spot::tgba_bdd_concrete from an LTL formula.
tgba_bdd_concrete ltl_to_tgba(const ltl::formula* f, bdd_dict* dict); tgba_bdd_concrete* ltl_to_tgba(const ltl::formula* f, bdd_dict* dict);
} }
#endif // SPOT_TGBA_LTL2TGBA_HH #endif // SPOT_TGBA_LTL2TGBA_HH
...@@ -10,18 +10,18 @@ namespace spot ...@@ -10,18 +10,18 @@ namespace spot
/// Process successors. /// Process successors.
static void static void
save_rec(std::ostream& os, const tgba& g, state* st, seen_set& m) save_rec(std::ostream& os, const tgba* g, state* st, seen_set& m)
{ {
m.insert(st); m.insert(st);
std::string cur = g.format_state(st); std::string cur = g->format_state(st);
tgba_succ_iterator* si = g.succ_iter(st); tgba_succ_iterator* si = g->succ_iter(st);
for (si->first(); !si->done(); si->next()) for (si->first(); !si->done(); si->next())
{ {
state* s = si->current_state(); state* s = si->current_state();
os << "\"" << cur << "\", \"" << g.format_state(s) << "\", "; os << "\"" << cur << "\", \"" << g->format_state(s) << "\", ";
bdd_print_sat(os, g.get_dict(), si->current_condition()) << ","; bdd_print_sat(os, g->get_dict(), si->current_condition()) << ",";
bdd_print_acc(os, g.get_dict(), si->current_accepting_conditions()) bdd_print_acc(os, g->get_dict(), si->current_accepting_conditions())
<< ";" << std::endl; << ";" << std::endl;
// Destination already explored? // Destination already explored?
...@@ -40,9 +40,9 @@ namespace spot ...@@ -40,9 +40,9 @@ namespace spot
} }
std::ostream& std::ostream&
tgba_save_reachable(std::ostream& os, const tgba& g) tgba_save_reachable(std::ostream& os, const tgba* g)
{ {
const bdd_dict* d = g.get_dict(); const bdd_dict* d = g->get_dict();
os << "acc ="; os << "acc =";
for (bdd_dict::fv_map::const_iterator ai = d->acc_map.begin(); for (bdd_dict::fv_map::const_iterator ai = d->acc_map.begin();
ai != d->acc_map.end(); ++ai) ai != d->acc_map.end(); ++ai)
...@@ -53,7 +53,7 @@ namespace spot ...@@ -53,7 +53,7 @@ namespace spot
os << ";" << std::endl; os << ";" << std::endl;
seen_set m; seen_set m;
state* state = g.get_init_state(); state* state = g->get_init_state();
save_rec(os, g, state, m); save_rec(os, g, state, m);
// Finally delete all states used as keys in m: // Finally delete all states used as keys in m:
for (seen_set::iterator i = m.begin(); i != m.end(); ++i) for (seen_set::iterator i = m.begin(); i != m.end(); ++i)
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
namespace spot namespace spot
{ {
/// \brief Save reachable states in text format. /// \brief Save reachable states in text format.
std::ostream& tgba_save_reachable(std::ostream& os, const tgba& g); std::ostream& tgba_save_reachable(std::ostream& os, const tgba* g);
} }
#endif // SPOT_TGBAALGOS_SAVE_HH #endif // SPOT_TGBAALGOS_SAVE_HH
...@@ -29,7 +29,7 @@ main() ...@@ -29,7 +29,7 @@ main()
a->add_accepting_condition(t1, e.require("q")); a->add_accepting_condition(t1, e.require("q"));
a->add_accepting_condition(t2, e.require("r")); a->add_accepting_condition(t2, e.require("r"));
spot::dotty_reachable(std::cout, *a); spot::dotty_reachable(std::cout, a);
delete a; delete a;
delete dict; delete dict;
......
...@@ -35,8 +35,8 @@ main(int argc, char** argv) ...@@ -35,8 +35,8 @@ main(int argc, char** argv)
return 2; return 2;
{ {
spot::tgba_product p(*a1, *a2); spot::tgba_product p(a1, a2);
spot::tgba_save_reachable(std::cout, p); spot::tgba_save_reachable(std::cout, &p);
} }
assert(spot::ltl::unop::instance_count() == 0); assert(spot::ltl::unop::instance_count() == 0);
......
...@@ -88,7 +88,7 @@ main(int argc, char** argv) ...@@ -88,7 +88,7 @@ main(int argc, char** argv)
spot::bdd_dict* dict = new spot::bdd_dict(); spot::bdd_dict* dict = new spot::bdd_dict();
if (f) if (f)
{ {
spot::tgba_bdd_concrete a = spot::ltl_to_tgba(f, dict); spot::tgba_bdd_concrete* a = spot::ltl_to_tgba(f, dict);
spot::ltl::destroy(f); spot::ltl::destroy(f);
switch (output) switch (output)
{ {
...@@ -96,23 +96,23 @@ main(int argc, char** argv) ...@@ -96,23 +96,23 @@ main(int argc, char** argv)
spot::dotty_reachable(std::cout, a); spot::dotty_reachable(std::cout, a);
break; break;
case 1: case 1:
spot::bdd_print_dot(std::cout