[cfe-commits] r48368 - in /cfe/trunk: Analysis/GRExprEngine.cpp Analysis/GRSimpleVals.cpp Driver/ASTConsumers.cpp include/clang/Analysis/PathSensitive/GRExprEngine.h

Ted Kremenek kremenek at apple.com
Fri Mar 14 11:14:51 PDT 2008


Author: kremenek
Date: Fri Mar 14 13:14:50 2008
New Revision: 48368

URL: http://llvm.org/viewvc/llvm-project?rev=48368&view=rev
Log:
Emit warnings for undefined control-flow.

Modified:
    cfe/trunk/Analysis/GRExprEngine.cpp
    cfe/trunk/Analysis/GRSimpleVals.cpp
    cfe/trunk/Driver/ASTConsumers.cpp
    cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h

Modified: cfe/trunk/Analysis/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/GRExprEngine.cpp?rev=48368&r1=48367&r2=48368&view=diff

==============================================================================
--- cfe/trunk/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/Analysis/GRExprEngine.cpp Fri Mar 14 13:14:50 2008
@@ -1865,6 +1865,7 @@
     AddSources(Src, undef_results_begin(), undef_results_end());
     AddSources(Src, bad_calls_begin(), bad_calls_end());
     AddSources(Src, undef_arg_begin(), undef_arg_end());
+    AddSources(Src, undef_branches_begin(), undef_branches_end());
     
     ViewGraph(&Src[0], &Src[0]+Src.size());
   }

Modified: cfe/trunk/Analysis/GRSimpleVals.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/GRSimpleVals.cpp?rev=48368&r1=48367&r2=48368&view=diff

==============================================================================
--- cfe/trunk/Analysis/GRSimpleVals.cpp (original)
+++ cfe/trunk/Analysis/GRSimpleVals.cpp Fri Mar 14 13:14:50 2008
@@ -23,22 +23,33 @@
 namespace clang {
 
 template <typename ITERATOR>
-static inline const PostStmt& GetLocation(ITERATOR I) {
-  return cast<PostStmt>((*I)->getLocation());
+static inline ProgramPoint GetLocation(ITERATOR I) {
+  return (*I)->getLocation();
 }
   
 template <>
-inline const PostStmt& GetLocation(GRExprEngine::undef_arg_iterator I) {
-  return cast<PostStmt>(I->first->getLocation());
+inline ProgramPoint GetLocation(GRExprEngine::undef_arg_iterator I) {
+  return I->first->getLocation();
+}
+  
+static inline Stmt* GetStmt(const ProgramPoint& P) {
+  if (const PostStmt* PS = dyn_cast<PostStmt>(&P)) {
+    return PS->getStmt();
+  }
+  else if (const BlockEdge* BE = dyn_cast<BlockEdge>(&P)) {
+    return BE->getSrc()->getTerminator();
+  }
+
+  assert (false && "Unsupported ProgramPoint.");
+  return NULL;
 }
 
 template <typename ITERATOR>
 static void EmitDiag(Diagnostic& Diag, SourceManager& SrcMgr,
                      unsigned ErrorDiag, ITERATOR I) {  
   
-  Expr* Exp = cast<Expr>(GetLocation(I).getStmt());
-  cast<Expr>(GetLocation(I).getStmt());  
-  Diag.Report(FullSourceLoc(Exp->getExprLoc(), SrcMgr), ErrorDiag);    
+  Stmt* S = GetStmt(GetLocation(I));
+  Diag.Report(FullSourceLoc(S->getLocStart(), SrcMgr), ErrorDiag);    
 }
 
 
@@ -46,10 +57,10 @@
 static void EmitDiag(Diagnostic& Diag, SourceManager& SrcMgr,
                      unsigned ErrorDiag, GRExprEngine::undef_arg_iterator I) {
 
-  Expr* E1 = cast<Expr>(GetLocation(I).getStmt());
+  Stmt* S1 = GetStmt(GetLocation(I));
   Expr* E2 = cast<Expr>(I->second);
   
-  SourceLocation Loc = E1->getExprLoc();
+  SourceLocation Loc = S1->getLocStart();
   SourceRange R = E2->getSourceRange();
   Diag.Report(FullSourceLoc(Loc, SrcMgr), ErrorDiag, 0, 0, &R, 1);
 }
@@ -139,6 +150,11 @@
               CheckerState->undef_arg_begin(),
               CheckerState->undef_arg_end(),
       "Pass-by-value argument in function or message expression is undefined.");
+  
+  EmitWarning(Diag, SrcMgr,
+              CheckerState->undef_branches_begin(),
+              CheckerState->undef_branches_end(),
+      "Branch condition evaluates to an uninitialized value.");
       
 #ifndef NDEBUG
   if (Visualize) CheckerState->ViewGraph(TrimGraph);
@@ -161,7 +177,8 @@
   BasicValueFactory& BasicVals = Eng.getBasicVals();
   
   llvm::APSInt V = cast<nonlval::ConcreteInt>(X).getValue();
-  V.setIsUnsigned(T->isUnsignedIntegerType() || T->isPointerType());
+  V.setIsUnsigned(T->isUnsignedIntegerType() || T->isPointerType() 
+                  || T->isObjCQualifiedIdType());
   V.extOrTrunc(Eng.getContext().getTypeSize(T));
   
   if (T->isPointerType())
@@ -174,7 +191,7 @@
 
 RVal GRSimpleVals::EvalCast(GRExprEngine& Eng, LVal X, QualType T) {
   
-  if (T->isPointerType() || T->isReferenceType())
+  if (T->isPointerType() || T->isReferenceType() || T->isObjCQualifiedIdType())
     return X;
   
   assert (T->isIntegerType());

Modified: cfe/trunk/Driver/ASTConsumers.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/ASTConsumers.cpp?rev=48368&r1=48367&r2=48368&view=diff

==============================================================================
--- cfe/trunk/Driver/ASTConsumers.cpp (original)
+++ cfe/trunk/Driver/ASTConsumers.cpp Fri Mar 14 13:14:50 2008
@@ -505,6 +505,9 @@
     
     if (!MD->getBody())
       return;
+      
+    if (FName.size() > 0 && FName != MD->getSelector().getName())
+      return;
     
     if (printFuncDeclStart()) {
       DeclPrinter().PrintObjCMethodDecl(MD);
@@ -649,11 +652,11 @@
 void GRSimpleValsVisitor::VisitCFG(CFG& C, Decl& CD) {
   
   SourceLocation Loc = CD.getLocation();
-  
+
   if (!Loc.isFileID() ||
        Loc.getFileID() != Ctx->getSourceManager().getMainFileID())
     return;
-  
+
   if (!Visualize) {
     
     if (FunctionDecl *FD = dyn_cast<FunctionDecl>(&CD)) {
@@ -662,8 +665,8 @@
                  << ' ';
     }
     else if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(&CD)) {
-      llvm::cerr << "ANALYZE (ObjC Method): "
-        << MD->getSelector().getName() << ' '
+      llvm::cerr << "ANALYZE (ObjC Method): '"
+        << MD->getSelector().getName() << "' "
         << Ctx->getSourceManager().getSourceName(MD->getLocation())
         << ' ';
     }

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h?rev=48368&r1=48367&r2=48368&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h Fri Mar 14 13:14:50 2008
@@ -204,6 +204,10 @@
            UndefArgs.find(const_cast<NodeTy*>(N)) != UndefArgs.end();
   }
   
+  typedef UndefBranchesTy::iterator undef_branch_iterator;
+  undef_branch_iterator undef_branches_begin() { return UndefBranches.begin(); }
+  undef_branch_iterator undef_branches_end() { return UndefBranches.end(); }  
+  
   typedef BadDerefTy::iterator null_deref_iterator;
   null_deref_iterator null_derefs_begin() { return ExplicitNullDeref.begin(); }
   null_deref_iterator null_derefs_end() { return ExplicitNullDeref.end(); }





More information about the cfe-commits mailing list