This revision was automatically updated to reflect the committed changes. Closed by commit rGea93d7d64216: [CFG] Add an option to expand CXXDefaultInitExpr into aggregate initialization (authored by xazax.hun).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D71642/new/ https://reviews.llvm.org/D71642 Files: clang/include/clang/Analysis/CFG.h clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def clang/lib/Analysis/CFG.cpp clang/lib/StaticAnalyzer/Core/AnalysisManager.cpp clang/test/Analysis/aggrinit-cfg-output.cpp clang/test/Analysis/analyzer-config.c
Index: clang/test/Analysis/analyzer-config.c =================================================================== --- clang/test/Analysis/analyzer-config.c +++ clang/test/Analysis/analyzer-config.c @@ -19,6 +19,7 @@ // CHECK-NEXT: c++-temp-dtor-inlining = true // CHECK-NEXT: c++-template-inlining = true // CHECK-NEXT: cfg-conditional-static-initializers = true +// CHECK-NEXT: cfg-expand-default-aggr-inits = false // CHECK-NEXT: cfg-implicit-dtors = true // CHECK-NEXT: cfg-lifetime = false // CHECK-NEXT: cfg-loopexit = false @@ -98,4 +99,4 @@ // CHECK-NEXT: unroll-loops = false // CHECK-NEXT: widen-loops = false // CHECK-NEXT: [stats] -// CHECK-NEXT: num-entries = 95 +// CHECK-NEXT: num-entries = 96 Index: clang/test/Analysis/aggrinit-cfg-output.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/aggrinit-cfg-output.cpp @@ -0,0 +1,28 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpCFG -analyzer-config cfg-expand-default-aggr-inits=true %s > %t 2>&1 +// RUN: FileCheck --input-file=%t %s + +static char a[] = "foobar"; + +struct StringRef { + const char *member = nullptr; + int len = 3; +}; + +int main() { + StringRef s{a}; + (void)s; +} + +// CHECK: [B1] +// CHECK-NEXT: 1: a +// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, ArrayToPointerDecay, char *) +// CHECK-NEXT: 3: [B1.2] (ImplicitCastExpr, NoOp, const char *) +// CHECK-NEXT: 4: 3 +// CHECK-NEXT: 5: +// CHECK-NEXT: 6: {[B1.1]} +// CHECK-NEXT: 7: StringRef s{a}; +// CHECK-NEXT: 8: s +// CHECK-NEXT: 9: (void)[B1.8] (CStyleCastExpr, ToVoid, void) +// CHECK-NEXT: Preds (1): B2 +// CHECK-NEXT: Succs (1): B0 + Index: clang/lib/StaticAnalyzer/Core/AnalysisManager.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/AnalysisManager.cpp +++ clang/lib/StaticAnalyzer/Core/AnalysisManager.cpp @@ -44,6 +44,8 @@ options(Options) { AnaCtxMgr.getCFGBuildOptions().setAllAlwaysAdd(); AnaCtxMgr.getCFGBuildOptions().OmitImplicitValueInitializers = true; + AnaCtxMgr.getCFGBuildOptions().AddCXXDefaultInitExprInAggregates = + Options.ShouldIncludeDefaultInitForAggregates; } AnalysisManager::~AnalysisManager() { Index: clang/lib/Analysis/CFG.cpp =================================================================== --- clang/lib/Analysis/CFG.cpp +++ clang/lib/Analysis/CFG.cpp @@ -542,6 +542,7 @@ private: // Visitors to walk an AST and construct the CFG. + CFGBlock *VisitInitListExpr(InitListExpr *ILE, AddStmtChoice asc); CFGBlock *VisitAddrLabelExpr(AddrLabelExpr *A, AddStmtChoice asc); CFGBlock *VisitBinaryOperator(BinaryOperator *B, AddStmtChoice asc); CFGBlock *VisitBreakStmt(BreakStmt *B); @@ -2140,6 +2141,9 @@ return Block; return VisitStmt(S, asc); + case Stmt::InitListExprClass: + return VisitInitListExpr(cast<InitListExpr>(S), asc); + case Stmt::AddrLabelExprClass: return VisitAddrLabelExpr(cast<AddrLabelExpr>(S), asc); @@ -2346,15 +2350,37 @@ // Visit the children in their reverse order so that they appear in // left-to-right (natural) order in the CFG. reverse_children RChildren(S); - for (reverse_children::iterator I = RChildren.begin(), E = RChildren.end(); - I != E; ++I) { - if (Stmt *Child = *I) + for (Stmt *Child : RChildren) { + if (Child) if (CFGBlock *R = Visit(Child)) B = R; } return B; } +CFGBlock *CFGBuilder::VisitInitListExpr(InitListExpr *ILE, AddStmtChoice asc) { + if (asc.alwaysAdd(*this, ILE)) { + autoCreateBlock(); + appendStmt(Block, ILE); + } + CFGBlock *B = Block; + + reverse_children RChildren(ILE); + for (Stmt *Child : RChildren) { + if (!Child) + continue; + if (CFGBlock *R = Visit(Child)) + B = R; + if (BuildOpts.AddCXXDefaultInitExprInAggregates) { + if (auto *DIE = dyn_cast<CXXDefaultInitExpr>(Child)) + if (Stmt *Child = DIE->getExpr()) + if (CFGBlock *R = Visit(Child)) + B = R; + } + } + return B; +} + CFGBlock *CFGBuilder::VisitAddrLabelExpr(AddrLabelExpr *A, AddStmtChoice asc) { AddressTakenLabels.insert(A->getLabel()); Index: clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def =================================================================== --- clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def +++ clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def @@ -112,6 +112,12 @@ bool, ShouldIncludeScopesInCFG, "cfg-scopes", "Whether or not scope information should be included in the CFG.", false) +ANALYZER_OPTION(bool, ShouldIncludeDefaultInitForAggregates, + "cfg-expand-default-aggr-inits", + "Whether or not inline CXXDefaultInitializers for aggregate " + "initialization in the CFG.", + false) + ANALYZER_OPTION( bool, MayInlineTemplateFunctions, "c++-template-inlining", "Whether or not templated functions may be considered for inlining.", true) Index: clang/include/clang/Analysis/CFG.h =================================================================== --- clang/include/clang/Analysis/CFG.h +++ clang/include/clang/Analysis/CFG.h @@ -1248,6 +1248,7 @@ bool AddStaticInitBranches = false; bool AddCXXNewAllocator = false; bool AddCXXDefaultInitExprInCtors = false; + bool AddCXXDefaultInitExprInAggregates = false; bool AddRichCXXConstructors = false; bool MarkElidedCXXConstructors = false; bool AddVirtualBaseBranches = false;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits