[cfe-commits] r126734 - in /cfe/trunk: include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp lib/StaticAnalyzer/Core/SVals.cpp
Argyrios Kyrtzidis
akyrtzi at gmail.com
Mon Feb 28 17:47:48 PST 2011
Author: akirtzidis
Date: Mon Feb 28 19:47:48 2011
New Revision: 126734
URL: http://llvm.org/viewvc/llvm-project?rev=126734&view=rev
Log:
[analyzer] Remove SVal::getAsVarDecl() and reason about MemRegions, not Decls. Suggestion by Ted!
Modified:
cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
cfe/trunk/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp
cfe/trunk/lib/StaticAnalyzer/Core/SVals.cpp
Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h?rev=126734&r1=126733&r2=126734&view=diff
==============================================================================
--- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h (original)
+++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h Mon Feb 28 19:47:48 2011
@@ -125,10 +125,6 @@
/// Otherwise return 0.
const FunctionDecl* getAsFunctionDecl() const;
- /// \brief If this SVal is a MemRegionVal and wraps a VarDecl,
- /// return that VarDecl. Otherwise return 0.
- const VarDecl* getAsVarDecl() const;
-
/// getAsLocSymbol - If this SVal is a location (subclasses Loc) and
/// wraps a symbol, return that SymbolRef. Otherwise return NULL.
SymbolRef getAsLocSymbol() const;
Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp?rev=126734&r1=126733&r2=126734&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp Mon Feb 28 19:47:48 2011
@@ -28,8 +28,8 @@
using namespace clang;
using namespace ento;
-static bool IsNSError(const ParmVarDecl *PD, IdentifierInfo *II);
-static bool IsCFError(const ParmVarDecl *PD, IdentifierInfo *II);
+static bool IsNSError(QualType T, IdentifierInfo *II);
+static bool IsCFError(QualType T, IdentifierInfo *II);
//===----------------------------------------------------------------------===//
// NSErrorMethodChecker
@@ -62,7 +62,7 @@
bool hasNSError = false;
for (ObjCMethodDecl::param_iterator
I = D->param_begin(), E = D->param_end(); I != E; ++I) {
- if (IsNSError(*I, II)) {
+ if (IsNSError((*I)->getType(), II)) {
hasNSError = true;
break;
}
@@ -108,7 +108,7 @@
bool hasCFError = false;
for (FunctionDecl::param_const_iterator
I = D->param_begin(), E = D->param_end(); I != E; ++I) {
- if (IsCFError(*I, II)) {
+ if (IsCFError((*I)->getType(), II)) {
hasCFError = true;
break;
}
@@ -191,6 +191,17 @@
C.addTransition(state->set<T>(sym, true));
}
+static QualType parameterTypeFromSVal(SVal val) {
+ if (const loc::MemRegionVal* X = dyn_cast<loc::MemRegionVal>(&val)) {
+ const MemRegion* R = X->getRegion();
+ if (const VarRegion *VR = R->getAs<VarRegion>())
+ if (VR->hasStackParametersStorage())
+ return VR->getValueType();
+ }
+
+ return QualType();
+}
+
void NSOrCFErrorDerefChecker::checkLocation(SVal loc, bool isLoad,
CheckerContext &C) const {
if (!isLoad)
@@ -198,6 +209,7 @@
if (loc.isUndef() || !isa<Loc>(loc))
return;
+ ASTContext &Ctx = C.getASTContext();
const GRState *state = C.getState();
// If we are loading from NSError**/CFErrorRef* parameter, mark the resulting
@@ -205,23 +217,22 @@
// ImplicitNullDerefEvent event.
// FIXME: Cumbersome! Maybe add hook at construction of SVals at start of
// function ?
-
- const VarDecl *VD = loc.getAsVarDecl();
- if (!VD) return;
- const ParmVarDecl *PD = dyn_cast<ParmVarDecl>(VD);
- if (!PD) return;
+
+ QualType parmT = parameterTypeFromSVal(loc);
+ if (parmT.isNull())
+ return;
if (!NSErrorII)
- NSErrorII = &PD->getASTContext().Idents.get("NSError");
+ NSErrorII = &Ctx.Idents.get("NSError");
if (!CFErrorII)
- CFErrorII = &PD->getASTContext().Idents.get("CFErrorRef");
+ CFErrorII = &Ctx.Idents.get("CFErrorRef");
- if (ShouldCheckNSError && IsNSError(PD, NSErrorII)) {
+ if (ShouldCheckNSError && IsNSError(parmT, NSErrorII)) {
setFlag<NSErrorOut>(state, state->getSVal(cast<Loc>(loc)), C);
return;
}
- if (ShouldCheckCFError && IsCFError(PD, CFErrorII)) {
+ if (ShouldCheckCFError && IsCFError(parmT, CFErrorII)) {
setFlag<CFErrorOut>(state, state->getSVal(cast<Loc>(loc)), C);
return;
}
@@ -267,9 +278,9 @@
BR.EmitReport(report);
}
-static bool IsNSError(const ParmVarDecl *PD, IdentifierInfo *II) {
+static bool IsNSError(QualType T, IdentifierInfo *II) {
- const PointerType* PPT = PD->getType()->getAs<PointerType>();
+ const PointerType* PPT = T->getAs<PointerType>();
if (!PPT)
return false;
@@ -288,8 +299,8 @@
return false;
}
-static bool IsCFError(const ParmVarDecl *PD, IdentifierInfo *II) {
- const PointerType* PPT = PD->getType()->getAs<PointerType>();
+static bool IsCFError(QualType T, IdentifierInfo *II) {
+ const PointerType* PPT = T->getAs<PointerType>();
if (!PPT) return false;
const TypedefType* TT = PPT->getPointeeType()->getAs<TypedefType>();
Modified: cfe/trunk/lib/StaticAnalyzer/Core/SVals.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/SVals.cpp?rev=126734&r1=126733&r2=126734&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/SVals.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/SVals.cpp Mon Feb 28 19:47:48 2011
@@ -60,16 +60,6 @@
return NULL;
}
-const VarDecl* SVal::getAsVarDecl() const {
- if (const loc::MemRegionVal* X = dyn_cast<loc::MemRegionVal>(this)) {
- const MemRegion* R = X->getRegion();
- if (const VarRegion *VR = R->getAs<VarRegion>())
- return cast<VarDecl>(VR->getDecl());
- }
-
- return NULL;
-}
-
/// getAsLocSymbol - If this SVal is a location (subclasses Loc) and
/// wraps a symbol, return that SymbolRef. Otherwise return 0.
// FIXME: should we consider SymbolRef wrapped in CodeTextRegion?
More information about the cfe-commits
mailing list