diff options
Diffstat (limited to 'clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.cpp')
-rw-r--r-- | clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.cpp | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.cpp index d747fca6c47..eda8907081a 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.cpp @@ -8,43 +8,63 @@ //===----------------------------------------------------------------------===// #include "NoMallocCheck.h" +#include "../utils/Matchers.h" +#include "../utils/OptionsUtils.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" -#include <iostream> +#include <algorithm> #include <string> +#include <vector> using namespace clang::ast_matchers; +using namespace clang::ast_matchers::internal; namespace clang { namespace tidy { namespace cppcoreguidelines { +namespace { +Matcher<FunctionDecl> hasAnyListedName(const std::string &FunctionNames) { + const std::vector<std::string> NameList = + utils::options::parseStringList(FunctionNames); + return hasAnyName(std::vector<StringRef>(NameList.begin(), NameList.end())); +} +} + +void NoMallocCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "Allocations", AllocList); + Options.store(Opts, "Reallocations", ReallocList); + Options.store(Opts, "Deallocations", DeallocList); +} + void NoMallocCheck::registerMatchers(MatchFinder *Finder) { // C-style memory management is only problematic in C++. if (!getLangOpts().CPlusPlus) return; // Registering malloc, will suggest RAII. - Finder->addMatcher( - callExpr(callee(functionDecl(hasAnyName("::malloc", "::calloc")))) - .bind("aquisition"), - this); + Finder->addMatcher(callExpr(callee(functionDecl(hasAnyListedName(AllocList)))) + .bind("allocation"), + this); // Registering realloc calls, suggest std::vector or std::string. Finder->addMatcher( - callExpr(callee(functionDecl(hasName("::realloc")))).bind("realloc"), + callExpr(callee(functionDecl(hasAnyListedName(ReallocList)))) + .bind("realloc"), this); // Registering free calls, will suggest RAII instead. Finder->addMatcher( - callExpr(callee(functionDecl(hasName("::free")))).bind("free"), this); + callExpr(callee(functionDecl(hasAnyListedName(DeallocList)))) + .bind("free"), + this); } void NoMallocCheck::check(const MatchFinder::MatchResult &Result) { const CallExpr *Call = nullptr; StringRef Recommendation; - if ((Call = Result.Nodes.getNodeAs<CallExpr>("aquisition"))) + if ((Call = Result.Nodes.getNodeAs<CallExpr>("allocation"))) Recommendation = "consider a container or a smart pointer"; else if ((Call = Result.Nodes.getNodeAs<CallExpr>("realloc"))) Recommendation = "consider std::vector or std::string"; |