Oops, good catch, I'll get right on that. (Sorry about that: my C++ is rusty, I forgot that members aren't safely default initialized)
-Alex On Wed, Apr 30, 2014 at 2:51 PM, Richard Smith <[email protected]>wrote: > On Wed, Apr 30, 2014 at 7:09 AM, Alex McCarthy <[email protected]> wrote: > >> Author: alexmc >> Date: Wed Apr 30 09:09:24 2014 >> New Revision: 207652 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=207652&view=rev >> Log: >> Add a clang-tidy flag to support temporary destructor-aware analysis >> (workaround for bug 15599). >> >> Reviewers: alexfh >> >> Subscribers: jordan_rose, klimek, djasper, cfe-commits >> >> Differential Revision: http://reviews.llvm.org/D3556 >> >> Added: >> clang-tools-extra/trunk/test/clang-tidy/temporaries.cpp >> Modified: >> clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp >> clang-tools-extra/trunk/clang-tidy/ClangTidy.h >> clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h >> clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp >> >> Modified: clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp?rev=207652&r1=207651&r2=207652&view=diff >> >> ============================================================================== >> --- clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp (original) >> +++ clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp Wed Apr 30 09:09:24 >> 2014 >> @@ -173,8 +173,9 @@ private: >> } // namespace >> >> ClangTidyASTConsumerFactory::ClangTidyASTConsumerFactory( >> - ClangTidyContext &Context) >> - : Context(Context), CheckFactories(new ClangTidyCheckFactories) { >> + ClangTidyContext &Context, const ClangTidyOptions &Options) >> + : Context(Context), CheckFactories(new ClangTidyCheckFactories), >> + Options(Options) { >> for (ClangTidyModuleRegistry::iterator I = >> ClangTidyModuleRegistry::begin(), >> E = >> ClangTidyModuleRegistry::end(); >> I != E; ++I) { >> @@ -207,16 +208,21 @@ clang::ASTConsumer *ClangTidyASTConsumer >> if (!CheckFactories->empty()) >> Consumers.push_back(Finder.newASTConsumer()); >> >> - AnalyzerOptionsRef Options = Compiler.getAnalyzerOpts(); >> - Options->CheckersControlList = getCheckersControlList(); >> - if (!Options->CheckersControlList.empty()) { >> - Options->AnalysisStoreOpt = RegionStoreModel; >> - Options->AnalysisDiagOpt = PD_NONE; >> - Options->AnalyzeNestedBlocks = true; >> - Options->eagerlyAssumeBinOpBifurcation = true; >> + AnalyzerOptionsRef AnalyzerOptions = Compiler.getAnalyzerOpts(); >> + // FIXME: Remove this option once clang's cfg-temporary-dtors option >> defaults >> + // to true. >> + AnalyzerOptions->Config["cfg-temporary-dtors"] = >> + Options.AnalyzeTemporaryDtors ? "true" : "false"; >> + >> + AnalyzerOptions->CheckersControlList = getCheckersControlList(); >> + if (!AnalyzerOptions->CheckersControlList.empty()) { >> + AnalyzerOptions->AnalysisStoreOpt = RegionStoreModel; >> + AnalyzerOptions->AnalysisDiagOpt = PD_NONE; >> + AnalyzerOptions->AnalyzeNestedBlocks = true; >> + AnalyzerOptions->eagerlyAssumeBinOpBifurcation = true; >> ento::AnalysisASTConsumer *AnalysisConsumer = >> ento::CreateAnalysisConsumer( >> Compiler.getPreprocessor(), >> Compiler.getFrontendOpts().OutputFile, >> - Options, Compiler.getFrontendOpts().Plugins); >> + AnalyzerOptions, Compiler.getFrontendOpts().Plugins); >> AnalysisConsumer->AddDiagnosticConsumer( >> new AnalyzerDiagnosticConsumer(Context)); >> Consumers.push_back(AnalysisConsumer); >> @@ -288,7 +294,7 @@ void ClangTidyCheck::setName(StringRef N >> std::vector<std::string> getCheckNames(const ClangTidyOptions &Options) { >> SmallVector<ClangTidyError, 8> Errors; >> clang::tidy::ClangTidyContext Context(&Errors, Options); >> - ClangTidyASTConsumerFactory Factory(Context); >> + ClangTidyASTConsumerFactory Factory(Context, Options); >> return Factory.getCheckNames(); >> } >> >> @@ -326,7 +332,7 @@ void runClangTidy(const ClangTidyOptions >> ClangTidyASTConsumerFactory *ConsumerFactory; >> }; >> >> - Tool.run(new ActionFactory(new ClangTidyASTConsumerFactory(Context))); >> + Tool.run(new ActionFactory(new ClangTidyASTConsumerFactory(Context, >> Options))); >> } >> >> void handleErrors(SmallVectorImpl<ClangTidyError> &Errors, bool Fix) { >> >> Modified: clang-tools-extra/trunk/clang-tidy/ClangTidy.h >> URL: >> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidy.h?rev=207652&r1=207651&r2=207652&view=diff >> >> ============================================================================== >> --- clang-tools-extra/trunk/clang-tidy/ClangTidy.h (original) >> +++ clang-tools-extra/trunk/clang-tidy/ClangTidy.h Wed Apr 30 09:09:24 >> 2014 >> @@ -94,7 +94,8 @@ class ClangTidyCheckFactories; >> >> class ClangTidyASTConsumerFactory { >> public: >> - ClangTidyASTConsumerFactory(ClangTidyContext &Context); >> + ClangTidyASTConsumerFactory(ClangTidyContext &Context, >> + const ClangTidyOptions &Options); >> ~ClangTidyASTConsumerFactory(); >> >> /// \brief Returns an ASTConsumer that runs the specified clang-tidy >> checks. >> @@ -112,6 +113,7 @@ private: >> ClangTidyContext &Context; >> ast_matchers::MatchFinder Finder; >> std::unique_ptr<ClangTidyCheckFactories> CheckFactories; >> + ClangTidyOptions Options; >> }; >> >> /// \brief Fills the list of check names that are enabled when the >> provided >> >> Modified: clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h >> URL: >> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h?rev=207652&r1=207651&r2=207652&view=diff >> >> ============================================================================== >> --- clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h (original) >> +++ clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h Wed Apr 30 >> 09:09:24 2014 >> @@ -18,6 +18,7 @@ struct ClangTidyOptions { >> ClangTidyOptions() : EnableChecksRegex(".*") {} >> std::string EnableChecksRegex; >> std::string DisableChecksRegex; >> + bool AnalyzeTemporaryDtors; >> > > It looks like default-constructed state of ClangTidyOptions is supposed to > be a valid state. Please update the default constructor to initialize this > member! > > >> }; >> >> } // end namespace tidy >> >> Modified: clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp?rev=207652&r1=207651&r2=207652&view=diff >> >> ============================================================================== >> --- clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp (original) >> +++ clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp Wed Apr 30 >> 09:09:24 2014 >> @@ -46,12 +46,20 @@ static cl::opt<bool> ListChecks("list-ch >> cl::desc("List all enabled checks and >> exit."), >> cl::init(false), >> cl::cat(ClangTidyCategory)); >> >> +static cl::opt<bool> AnalyzeTemporaryDtors( >> + "analyze-temporary-dtors", >> + cl::desc("Enable temporary destructor-aware analysis in >> clang-analyzer- " >> + "checks."), >> + cl::init(false), >> + cl::cat(ClangTidyCategory)); >> + >> int main(int argc, const char **argv) { >> CommonOptionsParser OptionsParser(argc, argv, ClangTidyCategory); >> >> clang::tidy::ClangTidyOptions Options; >> Options.EnableChecksRegex = Checks; >> Options.DisableChecksRegex = DisableChecks; >> + Options.AnalyzeTemporaryDtors = AnalyzeTemporaryDtors; >> >> // FIXME: Allow using --list-checks without positional arguments. >> if (ListChecks) { >> >> Added: clang-tools-extra/trunk/test/clang-tidy/temporaries.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/temporaries.cpp?rev=207652&view=auto >> >> ============================================================================== >> --- clang-tools-extra/trunk/test/clang-tidy/temporaries.cpp (added) >> +++ clang-tools-extra/trunk/test/clang-tidy/temporaries.cpp Wed Apr 30 >> 09:09:24 2014 >> @@ -0,0 +1,26 @@ >> +// RUN: clang-tidy -checks=clang-analyzer-core.NullDereference >> -disable-checks='' -analyze-temporary-dtors %s -- > %t.log >> +// FileCheck complains if the input file is empty, so add a dummy line. >> +// RUN: echo foo >> %t.log >> +// RUN: FileCheck %s < %t.log >> + >> +struct NoReturnDtor { >> + ~NoReturnDtor() __attribute__((noreturn)); >> +}; >> + >> +extern bool check(const NoReturnDtor &); >> + >> +// CHECK-NOT: warning >> +void testNullPointerDereferencePositive() { >> + int *value = 0; >> + // CHECK: [[@LINE+1]]:10: warning: Dereference of null pointer (loaded >> from variable 'value') [clang-analyzer-core.NullDereference] >> + *value = 1; >> +} >> + >> +// CHECK-NOT: warning >> +void testNullPointerDereference() { >> + int *value = 0; >> + if (check(NoReturnDtor())) { >> + // This unreachable code causes a warning if we don't run with >> -analyze-temporary-dtors >> + *value = 1; >> + } >> +} >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
