[cfe-commits] [PATCH][Review Request]CXXDefaultArg handling

Jim Goodnow II jim at thegoodnows.net
Thu Dec 23 03:37:03 PST 2010

At 08:45 PM 12/22/2010, Ted Kremenek wrote:
>Hi Jim,
>First, sorry for the delay in coming back this patch.
>If I understand you correctly, the assumption you are making here is 
>that the default arguments will be evaluated once we do the function 
>call.  That means they are evaluated on the callee's side, not the 
>caller's.  Is this the right thing to do?
>As you know, checkers can monitor function/method calls at the the 
>exact point before and after the call is evaluated. Technically this 
>means that all the parameters, including the default parameters, 
>have been evaluated.  Also, technically the function call may never 
>take place if one of the default arguments introduces control-flow 
>that aborts the call.  For example:
>void halt() __attribute__((noreturn));
>void foo(int x = (halt(), 1));
>void test() {
>   foo(); // the function foo() never actually gets called.
>If we compile this to LLVM bytecode, we get:
>define void @_Z4testv() ssp {
>   call void @_Z4haltv() noreturn
>   unreachable
>                                                   ; No predecessors!
>   call void @_Z3fooi(i32 1)
>   ret void
> From the LLVM bytecode, we can see that technically the default 
> arguments are evaluated in the caller, not the callee.  This means 
> if we are going to truly support default parameters we need to 
> embed CFG support for them in the caller's CFG, not the 
> callee's.  I think the problem with your patch is it really skirts 
> around the issue, and I'd rather we implement support for default 
> parameters for real.  From this design perspective, I also think 
> this has nothing to do with interprocedural 
> analysis.  Intraprocedural analyses will need to be able to reason 
> about default parameters as well.
>What do you think?

I agree. How about this revised patch which displays the actual 
default arguments when the AST is dumped and actually handles the 
argument itself?

Index: lib/AST/StmtDumper.cpp
--- lib/AST/StmtDumper.cpp      (revision 122493)
+++ lib/AST/StmtDumper.cpp      (working copy)
@@ -157,6 +157,7 @@
      // C++
      void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node);
      void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node);
+    void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node);
      void VisitCXXThisExpr(CXXThisExpr *Node);
      void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node);
      void VisitCXXConstructExpr(CXXConstructExpr *Node);
@@ -500,6 +501,12 @@
    OS << " " << (Node->getValue() ? "true" : "false");

+void StmtDumper::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) {
+  DumpExpr(Node);
+  OS << "\n";
+  DumpSubTree(Node->getExpr());
  void StmtDumper::VisitCXXThisExpr(CXXThisExpr *Node) {
    OS << " this";
Index: lib/EntoSA/Checkers/ExprEngine.cpp
--- lib/EntoSA/Checkers/ExprEngine.cpp  (revision 122493)
+++ lib/EntoSA/Checkers/ExprEngine.cpp  (working copy)
@@ -753,7 +753,6 @@
      // C++ stuff we don't support yet.
      case Stmt::CXXBindTemporaryExprClass:
      case Stmt::CXXCatchStmtClass:
-    case Stmt::CXXDefaultArgExprClass:
      case Stmt::CXXDependentScopeMemberExprClass:
      case Stmt::ExprWithCleanupsClass:
      case Stmt::CXXNullPtrLiteralExprClass:
@@ -911,6 +910,12 @@

+    case Stmt::CXXDefaultArgExprClass: {
+      const CXXDefaultArgExpr *DAE = cast<CXXDefaultArgExpr>(S);
+      Visit(DAE->getExpr(), Pred, Dst);
+      break;
+    }
      case Stmt::CXXDeleteExprClass: {
        const CXXDeleteExpr *CDE = cast<CXXDeleteExpr>(S);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: defaultarg.patch
Type: application/octet-stream
Size: 1723 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20101223/09ea2b57/attachment.obj>

More information about the cfe-commits mailing list