Skip to content

Commit

Permalink
[analyzer] Make isSubRegionOf reflexive
Browse files Browse the repository at this point in the history
All usages of isSubRegionOf separately check for reflexive case, and in
any case, set theory tells us that each set is a subset of itself.

Differential Revision: https://reviews.llvm.org/D42140

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@322752 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
George Karpenkov committed Jan 17, 2018
1 parent b97e2a8 commit 8d0e135
Show file tree
Hide file tree
Showing 6 changed files with 8 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ class MemRegion : public llvm::FoldingSetNode {
const MemRegion *getBaseRegion() const;

/// Check if the region is a subregion of the given region.
/// Each region is a subregion of itself.
virtual bool isSubRegionOf(const MemRegion *R) const;

const MemRegion *StripCasts(bool StripBaseCasts = true) const;
Expand Down
2 changes: 0 additions & 2 deletions lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,6 @@ static ProgramStateRef removeFromState(ProgramStateRef State,
const MemRegion *Region) {
if (!Region)
return State;
// Note: The isSubRegionOf function is not reflexive.
State = State->remove<TrackedRegionMap>(Region);
for (auto &E : State->get<TrackedRegionMap>()) {
if (E.first->isSubRegionOf(Region))
State = State->remove<TrackedRegionMap>(E.first);
Expand Down
2 changes: 1 addition & 1 deletion lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1838,7 +1838,7 @@ UndefOrNullArgVisitor::VisitNode(const ExplodedNode *N,
const MemRegion *ArgReg = Call->getArgSVal(Idx).getAsRegion();

// Are we tracking the argument or its subregion?
if ( !ArgReg || (ArgReg != R && !R->isSubRegionOf(ArgReg->StripCasts())))
if ( !ArgReg || !R->isSubRegionOf(ArgReg->StripCasts()))
continue;

// Check the function parameter type.
Expand Down
6 changes: 3 additions & 3 deletions lib/StaticAnalyzer/Core/MemRegion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,15 +103,15 @@ MemRegionManager::~MemRegionManager() {
//===----------------------------------------------------------------------===//

bool SubRegion::isSubRegionOf(const MemRegion* R) const {
const MemRegion* r = getSuperRegion();
while (r != nullptr) {
const MemRegion* r = this;
do {
if (r == R)
return true;
if (const SubRegion* sr = dyn_cast<SubRegion>(r))
r = sr->getSuperRegion();
else
break;
}
} while (r != nullptr);
return false;
}

Expand Down
3 changes: 1 addition & 2 deletions lib/StaticAnalyzer/Core/ProgramState.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -781,8 +781,7 @@ bool ProgramState::isTainted(SymbolRef Sym, TaintTagType Kind) const {
// complete. For example, this would not currently identify
// overlapping fields in a union as tainted. To identify this we can
// check for overlapping/nested byte offsets.
if (Kind == I.second &&
(R == I.first || R->isSubRegionOf(I.first)))
if (Kind == I.second && R->isSubRegionOf(I.first))
return true;
}
}
Expand Down
4 changes: 2 additions & 2 deletions lib/StaticAnalyzer/Core/RegionStore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -871,7 +871,7 @@ collectSubRegionBindings(SmallVectorImpl<BindingPair> &Bindings,

} else if (NextKey.hasSymbolicOffset()) {
const MemRegion *Base = NextKey.getConcreteOffsetRegion();
if (Top->isSubRegionOf(Base)) {
if (Top->isSubRegionOf(Base) && Top != Base) {
// Case 3: The next key is symbolic and we just changed something within
// its concrete region. We don't know if the binding is still valid, so
// we'll be conservative and include it.
Expand All @@ -881,7 +881,7 @@ collectSubRegionBindings(SmallVectorImpl<BindingPair> &Bindings,
} else if (const SubRegion *BaseSR = dyn_cast<SubRegion>(Base)) {
// Case 4: The next key is symbolic, but we changed a known
// super-region. In this case the binding is certainly included.
if (Top == Base || BaseSR->isSubRegionOf(Top))
if (BaseSR->isSubRegionOf(Top))
if (isCompatibleWithFields(NextKey, FieldsInSymbolicSubregions))
Bindings.push_back(*I);
}
Expand Down

0 comments on commit 8d0e135

Please sign in to comment.