From dd706d7847f83ae1cbe3293424f1519965f93c9a Mon Sep 17 00:00:00 2001 From: Alexandre Duret-Lutz Date: Fri, 11 Nov 2016 14:05:58 +0100 Subject: [PATCH] twa: do not set prop_state_acc in set_acceptance Reported by Juraj Major. * spot/twa/twa.hh: check num_sets() in prop_state_acc() so we do not have to set it in set_acceptance(), causing trouble if set_acceptance() is called multiple times. * tests/python/setacc.py: New test case. * tests/Makefile.am: Add it. * THANKS: Add Juraj. * NEWS: Mention the bug. --- NEWS | 4 ++++ THANKS | 1 + spot/twa/twa.hh | 9 ++------- tests/Makefile.am | 1 + tests/python/setacc.py | 26 ++++++++++++++++++++++++++ 5 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 tests/python/setacc.py diff --git a/NEWS b/NEWS index 8148db943..a23c3589e 100644 --- a/NEWS +++ b/NEWS @@ -66,6 +66,10 @@ New in spot 2.1.2.dev (not yet released) * remove_fin() could produce incorrect result on incomplete automata tagged as weak and deterministic. + * calling set_acceptance() several time on an automaton could result + in unexpected behaviors, because set_acceptance(0,...) used to + set the state-based acceptance flag automatically. + New in spot 2.1.2 (2016-10-14) Command-line tools: diff --git a/THANKS b/THANKS index 1cb44319e..99800934b 100644 --- a/THANKS +++ b/THANKS @@ -18,6 +18,7 @@ Jan Strejček Jean-Michel Couvreur Jean-Michel Ilié Joachim Klein +Juraj Major Kristin Y. Rozier Martin Dieguez Lodeiro Matthias Heizmann diff --git a/spot/twa/twa.hh b/spot/twa/twa.hh index 02a3f3a8e..06bbfea8e 100644 --- a/spot/twa/twa.hh +++ b/spot/twa/twa.hh @@ -879,17 +879,12 @@ namespace spot { set_num_sets_(num); acc_.set_acceptance(c); - if (num == 0) - prop_state_acc(true); } /// Copy the acceptance condition of another TωA. void copy_acceptance_of(const const_twa_ptr& a) { acc_ = a->acc(); - unsigned num = acc_.num_sets(); - if (num == 0) - prop_state_acc(true); } /// Copy the atomic propositions of another TωA @@ -915,8 +910,6 @@ namespace spot { set_num_sets_(num); acc_.set_generalized_buchi(); - if (num == 0) - prop_state_acc(true); } /// \brief Set Büchi acceptance. @@ -1092,6 +1085,8 @@ namespace spot /// the acceptance set. trival prop_state_acc() const { + if (num_sets() == 0) + return true; return is.state_based_acc; } diff --git a/tests/Makefile.am b/tests/Makefile.am index adf25ae45..bf8dd110d 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -341,6 +341,7 @@ TESTS_python = \ python/relabel.py \ python/remfin.py \ python/satmin.py \ + python/setacc.py \ python/setxor.py \ python/trival.py \ $(TESTS_ipython) diff --git a/tests/python/setacc.py b/tests/python/setacc.py new file mode 100644 index 000000000..58f0feedd --- /dev/null +++ b/tests/python/setacc.py @@ -0,0 +1,26 @@ +#!/usr/bin/python3 +# -*- mode: python; coding: utf-8 -*- +# Copyright (C) 2016 Laboratoire de Recherche et Développement de +# l'EPITA. +# +# This file is part of Spot, a model checking library. +# +# Spot is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Spot is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +# License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Test case reduced from a report from Juraj Major . +import spot +a = spot.make_twa_graph(spot._bdd_dict) +a.set_acceptance(0, spot.acc_code("t")) +a.set_acceptance(1, spot.acc_code("Fin(0)")) +assert(a.prop_state_acc() == 0); -- GitLab