]> granicus.if.org Git - clang/commitdiff
Add temporary hack to -Wuninitialize to create a separate CFG (for C++ code) that...
authorTed Kremenek <kremenek@apple.com>
Tue, 1 Feb 2011 17:43:21 +0000 (17:43 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 1 Feb 2011 17:43:21 +0000 (17:43 +0000)
Implicit dtors confuse the ad hoc path-sensitivity of UninitializedValuesV2.cpp.  This isn't
the ideal solution, as it will directly impact compile time, but should significantly reduce
the noise of -Wuninitialized on some code bases.

This immediately "fixes" the false positive reported in PR 9063, although this
isn't the right fix in the long run.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124667 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/AnalysisBasedWarnings.cpp

index 355e114746c3dffc0157a0097687066b58704a2d..3e6cd81b7601082f0290e5c9212fd6bea69d0716 100644 (file)
@@ -519,7 +519,24 @@ AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P,
   
   if (Diags.getDiagnosticLevel(diag::warn_uninit_var, D->getLocStart())
       != Diagnostic::Ignored) {
-    if (CFG *cfg = AC.getCFG()) {
+    ASTContext &ctx = D->getASTContext();
+    llvm::OwningPtr<CFG> tmpCFG;
+    bool useAlternateCFG = false;
+    if (ctx.getLangOptions().CPlusPlus) {
+      // Temporary workaround: implicit dtors in the CFG can confuse
+      // the path-sensitivity in the uninitialized values analysis.
+      // For now create (if necessary) a separate CFG without implicit dtors.
+      // FIXME: We should not need to do this, as it results in multiple
+      // CFGs getting constructed.
+      CFG::BuildOptions B;
+      B.AddEHEdges = false;
+      B.AddImplicitDtors = false;
+      B.AddInitializers = true;
+      tmpCFG.reset(CFG::buildCFG(D, AC.getBody(), &ctx, B));
+      useAlternateCFG = true;
+    }
+    CFG *cfg = useAlternateCFG ? tmpCFG.get() : AC.getCFG();
+    if (cfg) {
       UninitValsDiagReporter reporter(S);
       runUninitializedVariablesAnalysis(*cast<DeclContext>(D), *cfg, AC,
                                         reporter);