From: Brian Norris Date: Fri, 7 Dec 2012 05:12:29 +0000 (-0800) Subject: action: add ATOMIC_UNINIT type X-Git-Tag: oopsla2013~456 X-Git-Url: http://demsky.eecs.uci.edu/git/?p=model-checker.git;a=commitdiff_plain;h=b385a968b6b2f2695cceafcba62abcb398f41bb2 action: add ATOMIC_UNINIT type Adding a new type of "uninitialized atomic" action, to serve as a store which, if any load is able to "see" this store, constitutes an uninitialized load - a bug in the user program. It has to act like a store operation, but it triggers a bug (ModelChecker::assert_bug) if any load tries to read from it. --- diff --git a/action.cc b/action.cc index a90878f..576f78a 100644 --- a/action.cc +++ b/action.cc @@ -66,6 +66,8 @@ void ModelAction::copy_from_new(ModelAction *newaction) void ModelAction::set_seq_number(modelclock_t num) { + /* ATOMIC_UNINIT actions should never have non-zero clock */ + ASSERT(!is_uninitialized()); ASSERT(seq_number == ACTION_INITIAL_CLOCK); seq_number = num; } @@ -122,6 +124,11 @@ bool ModelAction::is_failed_trylock() const return (type == ATOMIC_TRYLOCK && value == VALUE_TRYFAILED); } +bool ModelAction::is_uninitialized() const +{ + return type == ATOMIC_UNINIT; +} + bool ModelAction::is_read() const { return type == ATOMIC_READ || type == ATOMIC_RMWR || type == ATOMIC_RMW; @@ -129,7 +136,7 @@ bool ModelAction::is_read() const bool ModelAction::is_write() const { - return type == ATOMIC_WRITE || type == ATOMIC_RMW || type == ATOMIC_INIT; + return type == ATOMIC_WRITE || type == ATOMIC_RMW || type == ATOMIC_INIT || type == ATOMIC_UNINIT; } bool ModelAction::could_be_write() const @@ -346,6 +353,8 @@ void ModelAction::set_try_lock(bool obtainedlock) { void ModelAction::set_read_from(const ModelAction *act) { reads_from = act; + if (act && act->is_uninitialized()) + model->assert_bug("May read from uninitialized atomic\n"); } /** @@ -401,6 +410,9 @@ void ModelAction::print() const case THREAD_FINISH: type_str = "thread finish"; break; + case ATOMIC_UNINIT: + type_str = "uninitialized"; + break; case ATOMIC_READ: type_str = "atomic read"; break; diff --git a/action.h b/action.h index be87eca..86012c1 100644 --- a/action.h +++ b/action.h @@ -45,6 +45,7 @@ typedef enum action_type { THREAD_YIELD, /**< A thread yield action */ THREAD_JOIN, /**< A thread join action */ THREAD_FINISH, /**< A thread completion action */ + ATOMIC_UNINIT, /**< Represents an uninitialized atomic */ ATOMIC_READ, /**< An atomic read action */ ATOMIC_WRITE, /**< An atomic write action */ ATOMIC_RMWR, /**< The read part of an atomic RMW action */ @@ -107,6 +108,7 @@ public: bool is_notify_one() const; bool is_success_lock() const; bool is_failed_trylock() const; + bool is_uninitialized() const; bool is_read() const; bool is_write() const; bool could_be_write() const;