Fix pending in http://reviews.llvm.org/D3578 . Mind taking a look?
Thanks for your keen eyes! -Alex On Wed, Apr 30, 2014 at 3:08 PM, Alex McCarthy <[email protected]> wrote: > 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
