From 94e6f00da9685bfee5ec89bbf7a455edd0fe0348 Mon Sep 17 00:00:00 2001 From: Xuejun Yang Date: Mon, 20 Jun 2011 19:00:21 -0600 Subject: [PATCH] fix a bug in analyzing effect conflicts between union fields This fixes the runtime crash seen for seed 655329422 --- src/Effect.cpp | 42 ++++++++++++++++++++++++------------------ src/Effect.h | 4 ++-- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/Effect.cpp b/src/Effect.cpp index 9543fcda2..99f1145d8 100644 --- a/src/Effect.cpp +++ b/src/Effect.cpp @@ -438,33 +438,39 @@ Effect::field_is_written(const Variable *v) const } bool -Effect::sibling_field_is_read(const Variable *v) const +Effect::sibling_union_field_is_read(const Variable *v) const { - // check other fields of union/struct - if (v->isFieldVarOf_) { - for (size_t j=0; jisFieldVarOf_->field_vars.size(); j++) { - Variable* field_var = v->isFieldVarOf_->field_vars[j]; - if (field_var == v) continue; - if (is_read(field_var) || field_is_read(field_var)) { - return true; + while (v->isFieldVarOf_) { + // check other fields of the union + if (v->isFieldVarOf_->type->eType == eUnion) { + for (size_t j=0; jisFieldVarOf_->field_vars.size(); j++) { + Variable* field_var = v->isFieldVarOf_->field_vars[j]; + if (field_var == v) continue; + if (is_read(field_var) || field_is_read(field_var)) { + return true; + } } } + v = v->isFieldVarOf_; } return false; } bool -Effect::sibling_field_is_written(const Variable *v) const +Effect::sibling_union_field_is_written(const Variable *v) const { - // check other fields of union/struct - if (v->isFieldVarOf_) { - for (size_t j=0; jisFieldVarOf_->field_vars.size(); j++) { - Variable* field_var = v->isFieldVarOf_->field_vars[j]; - if (field_var == v) continue; - if (is_written(field_var) || field_is_written(field_var)) { - return true; + while (v->isFieldVarOf_) { + // check other fields of the union + if (v->isFieldVarOf_->type->eType == eUnion) { + for (size_t j=0; jisFieldVarOf_->field_vars.size(); j++) { + Variable* field_var = v->isFieldVarOf_->field_vars[j]; + if (field_var == v) continue; + if (is_written(field_var) || field_is_written(field_var)) { + return true; + } } } + v = v->isFieldVarOf_; } return false; } @@ -472,13 +478,13 @@ Effect::sibling_field_is_written(const Variable *v) const bool Effect::is_read_partially(const Variable* v) const { - return is_read(v) || field_is_read(v) || (v->is_union_field() && sibling_field_is_read(v)); + return is_read(v) || field_is_read(v) || sibling_union_field_is_read(v); } bool Effect::is_written_partially(const Variable* v) const { - return is_written(v) || field_is_written(v) || (v->is_union_field() && sibling_field_is_written(v)); + return is_written(v) || field_is_written(v) || sibling_union_field_is_written(v); } /* diff --git a/src/Effect.h b/src/Effect.h index c771a071f..f459188eb 100644 --- a/src/Effect.h +++ b/src/Effect.h @@ -65,8 +65,8 @@ class Effect bool is_written(std::string vname) const; bool field_is_read(const Variable *v) const; bool field_is_written(const Variable *v) const; - bool sibling_field_is_read(const Variable *v) const; - bool sibling_field_is_written(const Variable *v) const; + bool sibling_union_field_is_read(const Variable *v) const; + bool sibling_union_field_is_written(const Variable *v) const; bool is_read_partially(const Variable* v) const; bool is_written_partially(const Variable* v) const; bool union_field_is_read(void) const;