[cfe-commits] r95037 - /cfe/trunk/lib/Checker/ReturnStackAddressChecker.cpp

Ted Kremenek kremenek at apple.com
Mon Feb 1 16:13:42 PST 2010


Author: kremenek
Date: Mon Feb  1 18:13:41 2010
New Revision: 95037

URL: http://llvm.org/viewvc/llvm-project?rev=95037&view=rev
Log:
Hoist diagnostic generation in ReturnStackAddressChecker into a separate method.  No functionality change.

Modified:
    cfe/trunk/lib/Checker/ReturnStackAddressChecker.cpp

Modified: cfe/trunk/lib/Checker/ReturnStackAddressChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/ReturnStackAddressChecker.cpp?rev=95037&r1=95036&r2=95037&view=diff

==============================================================================
--- cfe/trunk/lib/Checker/ReturnStackAddressChecker.cpp (original)
+++ cfe/trunk/lib/Checker/ReturnStackAddressChecker.cpp Mon Feb  1 18:13:41 2010
@@ -27,9 +27,11 @@
     public CheckerVisitor<ReturnStackAddressChecker> {      
   BuiltinBug *BT;
 public:
-    ReturnStackAddressChecker() : BT(0) {}
-    static void *getTag();
-    void PreVisitReturnStmt(CheckerContext &C, const ReturnStmt *RS);
+  ReturnStackAddressChecker() : BT(0) {}
+  static void *getTag();
+  void PreVisitReturnStmt(CheckerContext &C, const ReturnStmt *RS);
+private:
+  void EmitStackError(CheckerContext &C, const MemRegion *R, const Expr *RetE);
 };
 }
 
@@ -41,6 +43,68 @@
   static int x = 0; return &x;
 }
 
+void ReturnStackAddressChecker::EmitStackError(CheckerContext &C,
+                                               const MemRegion *R,
+                                               const Expr *RetE) {
+	ExplodedNode *N = C.GenerateSink();
+
+	if (!N)
+		return;
+
+	if (!BT)
+		BT = new BuiltinBug("Return of address to stack-allocated memory");
+
+	// Generate a report for this bug.
+	llvm::SmallString<512> buf;
+	llvm::raw_svector_ostream os(buf);
+	SourceRange range;
+
+	// Get the base region, stripping away fields and elements.
+	R = R->getBaseRegion();
+
+	// Check if the region is a compound literal.
+	if (const CompoundLiteralRegion* CR = dyn_cast<CompoundLiteralRegion>(R)) {    
+		const CompoundLiteralExpr* CL = CR->getLiteralExpr();
+		os << "Address of stack memory associated with a compound literal "
+          "declared on line "
+       << C.getSourceManager().getInstantiationLineNumber(CL->getLocStart())
+       << " returned to caller";    
+		range = CL->getSourceRange();
+	}
+	else if (const AllocaRegion* AR = dyn_cast<AllocaRegion>(R)) {
+		const Expr* ARE = AR->getExpr();
+		SourceLocation L = ARE->getLocStart();
+		range = ARE->getSourceRange();    
+		os << "Address of stack memory allocated by call to alloca() on line "
+       << C.getSourceManager().getInstantiationLineNumber(L)
+       << " returned to caller";
+	}
+	else if (const BlockDataRegion *BR = dyn_cast<BlockDataRegion>(R)) {
+		const BlockDecl *BD = BR->getCodeRegion()->getDecl();
+		SourceLocation L = BD->getLocStart();
+		range = BD->getSourceRange();
+		os << "Address of stack-allocated block declared on line "
+       << C.getSourceManager().getInstantiationLineNumber(L)
+       << " returned to caller";
+	}
+	else if (const VarRegion *VR = dyn_cast<VarRegion>(R)) {
+		os << "Address of stack memory associated with local variable '"
+       << VR->getString() << "' returned";
+		range = VR->getDecl()->getSourceRange();
+	}
+	else {
+		assert(false && "Invalid region in ReturnStackAddressChecker.");
+		return;
+	}
+
+	RangedBugReport *report = new RangedBugReport(*BT, os.str(), N);
+	report->addRange(RetE->getSourceRange());
+	if (range.isValid())
+		report->addRange(range);
+
+	C.EmitReport(report);
+}	
+
 void ReturnStackAddressChecker::PreVisitReturnStmt(CheckerContext &C,
                                                    const ReturnStmt *RS) {
   
@@ -54,61 +118,8 @@
   if (!R || !R->hasStackStorage())
     return;  
   
-  ExplodedNode *N = C.GenerateSink();
-
-  if (!N)
-    return;
-  
-  if (!BT)
-    BT = new BuiltinBug("Return of address to stack-allocated memory");
-  
-  // Generate a report for this bug.
-  llvm::SmallString<100> buf;
-  llvm::raw_svector_ostream os(buf);
-  SourceRange range;
-  
-  // Get the base region, stripping away fields and elements.
-  R = R->getBaseRegion();
-  
-  // Check if the region is a compound literal.
-  if (const CompoundLiteralRegion* CR = dyn_cast<CompoundLiteralRegion>(R)) {    
-    const CompoundLiteralExpr* CL = CR->getLiteralExpr();
-    os << "Address of stack memory associated with a compound literal "
-          "declared on line "
-       << C.getSourceManager().getInstantiationLineNumber(CL->getLocStart())
-       << " returned to caller";    
-    range = CL->getSourceRange();
-  }
-  else if (const AllocaRegion* AR = dyn_cast<AllocaRegion>(R)) {
-    const Expr* ARE = AR->getExpr();
-    SourceLocation L = ARE->getLocStart();
-    range = ARE->getSourceRange();    
-    os << "Address of stack memory allocated by call to alloca() on line "
-       << C.getSourceManager().getInstantiationLineNumber(L)
-       << " returned to caller";
-  }
-  else if (const BlockDataRegion *BR = dyn_cast<BlockDataRegion>(R)) {
-    const BlockDecl *BD = BR->getCodeRegion()->getDecl();
-    SourceLocation L = BD->getLocStart();
-    range = BD->getSourceRange();
-    os << "Address of stack-allocated block declared on line "
-       << C.getSourceManager().getInstantiationLineNumber(L)
-       << " returned to caller";
-  }
-  else if (const VarRegion *VR = dyn_cast<VarRegion>(R)) {
-    os << "Address of stack memory associated with local variable '"
-       << VR->getString() << "' returned";
-    range = VR->getDecl()->getSourceRange();
-  }
-  else {
-    assert(false && "Invalid region in ReturnStackAddressChecker.");
+  if (R->hasStackStorage()) {
+    EmitStackError(C, R, RetE);
     return;
   }
-
-  RangedBugReport *report = new RangedBugReport(*BT, os.str(), N);
-  report->addRange(RetE->getSourceRange());
-  if (range.isValid())
-    report->addRange(range);
-  
-  C.EmitReport(report);
 }





More information about the cfe-commits mailing list