Skip to content

Commit

Permalink
fix a bug in analyzing effect conflicts between union fields
Browse files Browse the repository at this point in the history
This fixes the runtime crash seen for seed 655329422
  • Loading branch information
Xuejun Yang committed Jun 21, 2011
1 parent 7e33250 commit 94e6f00
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 20 deletions.
42 changes: 24 additions & 18 deletions src/Effect.cpp
Expand Up @@ -438,47 +438,53 @@ 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; j<v->isFieldVarOf_->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; j<v->isFieldVarOf_->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; j<v->isFieldVarOf_->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; j<v->isFieldVarOf_->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;
}

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);
}

/*
Expand Down
4 changes: 2 additions & 2 deletions src/Effect.h
Expand Up @@ -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;
Expand Down

0 comments on commit 94e6f00

Please sign in to comment.