Index: clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp +++ clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp @@ -204,6 +204,17 @@ } } +static void setStaticAnalyzerCheckerOpts(const ClangTidyOptions &Opts, + AnalyzerOptionsRef AnalyzerOptions) { + StringRef AnalyzerPrefix(AnalyzerCheckNamePrefix); + for (const auto &Opt : Opts.CheckOptions) { + StringRef OptName(Opt.first); + if (!OptName.startswith(AnalyzerPrefix)) + continue; + AnalyzerOptions->Config[OptName.substr(AnalyzerPrefix.size())] = Opt.second; + } +} + std::unique_ptr ClangTidyASTConsumerFactory::CreateASTConsumer( clang::CompilerInstance &Compiler, StringRef File) { @@ -241,6 +252,7 @@ GlobList &Filter = Context.getChecksFilter(); AnalyzerOptions->CheckersControlList = getCheckersControlList(Filter); if (!AnalyzerOptions->CheckersControlList.empty()) { + setStaticAnalyzerCheckerOpts(Context.getOptions(), AnalyzerOptions); AnalyzerOptions->AnalysisStoreOpt = RegionStoreModel; AnalyzerOptions->AnalysisDiagOpt = PD_NONE; AnalyzerOptions->AnalyzeNestedBlocks = true; Index: clang-tools-extra/trunk/test/clang-tidy/static-analyzer-config.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/static-analyzer-config.cpp +++ clang-tools-extra/trunk/test/clang-tidy/static-analyzer-config.cpp @@ -0,0 +1,19 @@ +// RUN: clang-tidy %s -checks='-*,clang-analyzer-unix.Malloc' -config='{CheckOptions: [{ key: "clang-analyzer-unix.Malloc:Optimistic", value: true}]}' -- | FileCheck %s +typedef __typeof(sizeof(int)) size_t; +void *malloc(size_t); +void free(void *); +void __attribute((ownership_returns(malloc))) *my_malloc(size_t); +void __attribute((ownership_takes(malloc, 1))) my_free(void *); + +void f1() { + void *p = malloc(12); + return; + // CHECK: warning: Potential leak of memory pointed to by 'p' [clang-analyzer-unix.Malloc] +} + +void af2() { + void *p = my_malloc(12); + my_free(p); + free(p); + // CHECK: warning: Attempt to free released memory [clang-analyzer-unix.Malloc] +}