[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