diff options
Diffstat (limited to 'include/clang/StaticAnalyzer/Checkers/SValExplainer.h')
-rw-r--r-- | include/clang/StaticAnalyzer/Checkers/SValExplainer.h | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/include/clang/StaticAnalyzer/Checkers/SValExplainer.h b/include/clang/StaticAnalyzer/Checkers/SValExplainer.h index 28cfbef91038..62bb0f666d44 100644 --- a/include/clang/StaticAnalyzer/Checkers/SValExplainer.h +++ b/include/clang/StaticAnalyzer/Checkers/SValExplainer.h @@ -142,6 +142,14 @@ public: // TODO: Explain CXXThisRegion itself, find a way to test it. if (isThisObject(R)) return "'this' object"; + // Objective-C objects are not normal symbolic regions. At least, + // they're always on the heap. + if (R->getSymbol()->getType() + .getCanonicalType()->getAs<ObjCObjectPointerType>()) + return "object at " + Visit(R->getSymbol()); + // Other heap-based symbolic regions are also special. + if (isa<HeapSpaceRegion>(R->getMemorySpace())) + return "heap segment that starts at " + Visit(R->getSymbol()); return "pointee of " + Visit(R->getSymbol()); } @@ -176,6 +184,8 @@ public: std::string Name = VD->getQualifiedNameAsString(); if (isa<ParmVarDecl>(VD)) return "parameter '" + Name + "'"; + else if (VD->hasAttr<BlocksAttr>()) + return "block variable '" + Name + "'"; else if (VD->hasLocalStorage()) return "local variable '" + Name + "'"; else if (VD->isStaticLocal()) @@ -186,6 +196,11 @@ public: llvm_unreachable("A variable is either local or global"); } + std::string VisitObjCIvarRegion(const ObjCIvarRegion *R) { + return "instance variable '" + R->getDecl()->getNameAsString() + "' of " + + Visit(R->getSuperRegion()); + } + std::string VisitFieldRegion(const FieldRegion *R) { return "field '" + R->getDecl()->getNameAsString() + "' of " + Visit(R->getSuperRegion()); |