diff options
Diffstat (limited to 'clang/Driver')
| -rw-r--r-- | clang/Driver/ASTStreamers.cpp | 25 | ||||
| -rw-r--r-- | clang/Driver/ASTStreamers.h | 1 | ||||
| -rw-r--r-- | clang/Driver/clang.cpp | 8 |
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); |

