diff options
author | Ted Kremenek <kremenek@apple.com> | 2011-01-15 02:58:47 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2011-01-15 02:58:47 +0000 |
commit | 610068c8cd2321f90e147b12cf794e1f840b6405 (patch) | |
tree | 575b910632e1a7e9bbfb0a92f42e6cd89973b61c /lib/Sema/AnalysisBasedWarnings.cpp | |
parent | 200fbc877d50da9e53b9aa272b70ca3538ce3a66 (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.cpp | 30 |
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:: |