[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