aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/AnalysisBasedWarnings.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2011-01-15 02:58:47 +0000
committerTed Kremenek <kremenek@apple.com>2011-01-15 02:58:47 +0000
commit610068c8cd2321f90e147b12cf794e1f840b6405 (patch)
tree575b910632e1a7e9bbfb0a92f42e6cd89973b61c /lib/Sema/AnalysisBasedWarnings.cpp
parent200fbc877d50da9e53b9aa272b70ca3538ce3a66 (diff)
Add initial prototype for implementation of
-Wuninitialized based on CFG dataflow analysis. WIP. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123512 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/AnalysisBasedWarnings.cpp')
-rw-r--r--lib/Sema/AnalysisBasedWarnings.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp
index 20a503d6a5..14d75338e0 100644
--- a/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/lib/Sema/AnalysisBasedWarnings.cpp
@@ -25,6 +25,7 @@
#include "clang/Analysis/AnalysisContext.h"
#include "clang/Analysis/CFG.h"
#include "clang/Analysis/Analyses/ReachableCode.h"
+#include "clang/Analysis/Analyses/UninitializedValuesV2.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/Support/Casting.h"
@@ -344,6 +345,23 @@ static void CheckFallThroughForBody(Sema &S, const Decl *D, const Stmt *Body,
}
//===----------------------------------------------------------------------===//
+// -Wuninitialized
+//===----------------------------------------------------------------------===//
+
+namespace {
+class UninitValsDiagReporter : public UninitVariablesHandler {
+ Sema &S;
+public:
+ UninitValsDiagReporter(Sema &S) : S(S) {}
+
+ void handleUseOfUninitVariable(const DeclRefExpr *dr, const VarDecl *vd) {
+ S.Diag(dr->getLocStart(), diag::warn_var_is_uninit)
+ << vd->getDeclName() << dr->getSourceRange();
+ }
+};
+}
+
+//===----------------------------------------------------------------------===//
// AnalysisBasedWarnings - Worker object used by Sema to execute analysis-based
// warnings on a function, method, or block.
//===----------------------------------------------------------------------===//
@@ -406,6 +424,18 @@ AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P,
// Warning: check for unreachable code
if (P.enableCheckUnreachable)
CheckUnreachable(S, AC);
+
+ if (Diags.getDiagnosticLevel(diag::warn_var_is_uninit, D->getLocStart())
+ != Diagnostic::Ignored) {
+ if (!S.getLangOptions().CPlusPlus) {
+ CFG *cfg = AC.getCFG();
+ if (cfg) {
+ UninitValsDiagReporter reporter(S);
+ runUninitializedVariablesAnalysis(*cast<DeclContext>(D), *cfg,
+ reporter);
+ }
+ }
+ }
}
void clang::sema::