[clang-tools-extra] r207652 - Add a clang-tidy flag to support temporary destructor-aware analysis (workaround for bug 15599).
Alex McCarthy
alexmc at google.com
Wed Apr 30 15:08:43 PDT 2014
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 <richard at metafoo.co.uk>wrote:
> On Wed, Apr 30, 2014 at 7:09 AM, Alex McCarthy <alexmc at google.com> 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
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140430/4064e733/attachment.html>
More information about the cfe-commits
mailing list