summaryrefslogtreecommitdiffstats
path: root/clang/Driver
diff options
context:
space:
mode:
Diffstat (limited to 'clang/Driver')
-rw-r--r--clang/Driver/ASTStreamers.cpp25
-rw-r--r--clang/Driver/ASTStreamers.h1
-rw-r--r--clang/Driver/clang.cpp8
3 files changed, 33 insertions, 1 deletions
diff --git a/clang/Driver/ASTStreamers.cpp b/clang/Driver/ASTStreamers.cpp
index 124b9e2e51e..cce19e795aa 100644
--- a/clang/Driver/ASTStreamers.cpp
+++ b/clang/Driver/ASTStreamers.cpp
@@ -210,7 +210,7 @@ ASTConsumer *clang::CreateLiveVarAnalyzer() {
}
//===----------------------------------------------------------------------===//
-// RunDeadStores - run checker to locate dead stores in a function
+// DeadStores - run checker to locate dead stores in a function
namespace {
class DeadStoreVisitor : public CFGVisitor {
@@ -232,6 +232,29 @@ ASTConsumer *clang::CreateDeadStoreChecker(Diagnostic &Diags) {
}
//===----------------------------------------------------------------------===//
+// Unitialized Values - run checker to flag potential uses of uninitalized
+// variables.
+
+namespace {
+ class UninitValsVisitor : public CFGVisitor {
+ Diagnostic &Diags;
+ ASTContext *Ctx;
+ public:
+ UninitValsVisitor(Diagnostic &diags) : Diags(diags) {}
+ virtual void Initialize(ASTContext &Context, unsigned MainFileID) {
+ Ctx = &Context;
+ }
+
+ virtual void VisitCFG(CFG& C) { CheckUninitializedValues(C, *Ctx, Diags); }
+ virtual bool printFuncDeclStart() { return false; }
+ };
+} // end anonymous namespace
+
+ASTConsumer *clang::CreateUnitValsChecker(Diagnostic &Diags) {
+ return new UninitValsVisitor(Diags);
+}
+
+//===----------------------------------------------------------------------===//
// LLVM Emitter
#include "clang/Basic/Diagnostic.h"
diff --git a/clang/Driver/ASTStreamers.h b/clang/Driver/ASTStreamers.h
index d9ea3bdcf3c..2d4a18fdc21 100644
--- a/clang/Driver/ASTStreamers.h
+++ b/clang/Driver/ASTStreamers.h
@@ -24,6 +24,7 @@ ASTConsumer *CreateASTDumper();
ASTConsumer *CreateCFGDumper(bool ViewGraphs = false);
ASTConsumer *CreateLiveVarAnalyzer();
ASTConsumer *CreateDeadStoreChecker(Diagnostic &Diags);
+ASTConsumer *CreateUnitValsChecker(Diagnostic &Diags);
ASTConsumer *CreateLLVMEmitter(Diagnostic &Diags);
} // end clang namespace
diff --git a/clang/Driver/clang.cpp b/clang/Driver/clang.cpp
index 40518067182..a69041396ec 100644
--- a/clang/Driver/clang.cpp
+++ b/clang/Driver/clang.cpp
@@ -58,6 +58,7 @@ enum ProgActions {
ParseCFGView, // Parse ASTS. Build CFGs. View CFGs.
AnalysisLiveVariables, // Print results of live-variable analysis.
WarnDeadStores, // Run DeadStores checker on parsed ASTs.
+ WarnUninitVals, // Run UnitializedVariables checker.
ParsePrintCallbacks, // Parse and print each callback.
ParseSyntaxOnly, // Parse and perform semantic analysis.
ParseNoop, // Parse with noop callbacks.
@@ -98,6 +99,8 @@ ProgAction(llvm::cl::desc("Choose output type:"), llvm::cl::ZeroOrMore,
"Print results of live variable analysis."),
clEnumValN(WarnDeadStores, "check-dead-stores",
"Flag warnings of stores to dead variables."),
+ clEnumValN(WarnUninitVals, "check-unit-vals",
+ "Flag warnings of uses of unitialized variables."),
clEnumValN(EmitLLVM, "emit-llvm",
"Build ASTs then convert to LLVM, emit .ll file"),
clEnumValEnd));
@@ -870,6 +873,11 @@ static void ProcessInputFile(Preprocessor &PP, unsigned MainFileID,
ParseAST(PP, MainFileID, *C.get(), Stats);
break;
}
+ case WarnUninitVals: {
+ std::auto_ptr<ASTConsumer> C(CreateUnitValsChecker(PP.getDiagnostics()));
+ ParseAST(PP, MainFileID, *C.get(), Stats);
+ break;
+ }
case EmitLLVM: {
std::auto_ptr<ASTConsumer> C(CreateLLVMEmitter(PP.getDiagnostics()));
ParseAST(PP, MainFileID, *C.get(), Stats);
OpenPOWER on IntegriCloud