[analyzer] Print return values from debug.DumpCalls checker.
authorJordan Rose <jordan_rose@apple.com>
Thu, 21 Mar 2013 18:16:59 +0000 (18:16 +0000)
committerJordan Rose <jordan_rose@apple.com>
Thu, 21 Mar 2013 18:16:59 +0000 (18:16 +0000)
Debug utility only, no functionality change.

llvm-svn: 177649

clang/lib/StaticAnalyzer/Checkers/TraversalChecker.cpp

index 8b24240..57c9ed4 100644 (file)
@@ -61,9 +61,11 @@ void ento::registerTraversalDumper(CheckerManager &mgr) {
 //------------------------------------------------------------------------------
 
 namespace {
-class CallDumper : public Checker< check::PreCall > {
+class CallDumper : public Checker< check::PreCall,
+                                   check::PostCall > {
 public:
   void checkPreCall(const CallEvent &Call, CheckerContext &C) const;
+  void checkPostCall(const CallEvent &Call, CheckerContext &C) const;
 };
 }
 
@@ -80,6 +82,26 @@ void CallDumper::checkPreCall(const CallEvent &Call, CheckerContext &C) const {
   Call.dump(llvm::outs());
 }
 
+void CallDumper::checkPostCall(const CallEvent &Call, CheckerContext &C) const {
+  const Expr *CallE = Call.getOriginExpr();
+  if (!CallE)
+    return;
+
+  unsigned Indentation = 0;
+  for (const LocationContext *LC = C.getLocationContext()->getParent();
+       LC != 0; LC = LC->getParent())
+    ++Indentation;
+
+  // It is mildly evil to print directly to llvm::outs() rather than emitting
+  // warnings, but this ensures things do not get filtered out by the rest of
+  // the static analyzer machinery.
+  llvm::outs().indent(Indentation);
+  if (Call.getResultType()->isVoidType())
+    llvm::outs() << "Returning void\n";
+  else
+    llvm::outs() << "Returning " << C.getSVal(CallE) << "\n";
+}
+
 void ento::registerCallDumper(CheckerManager &mgr) {
   mgr.registerChecker<CallDumper>();
 }