diff options
| author | Alexander Kornienko <alexfh@google.com> | 2017-03-02 08:28:55 +0000 |
|---|---|---|
| committer | Alexander Kornienko <alexfh@google.com> | 2017-03-02 08:28:55 +0000 |
| commit | d993e76a18b1ee309153c6c22abad0b0f03977f1 (patch) | |
| tree | 5156bd6a3ae1fb6bf0c198e01d2929d9dca7b16d /clang-tools-extra/clang-tidy/cppcoreguidelines | |
| parent | b8ebcb519758a9acfb934965eaabf3091a2d39ec (diff) | |
| download | bcm5719-llvm-d993e76a18b1ee309153c6c22abad0b0f03977f1.tar.gz bcm5719-llvm-d993e76a18b1ee309153c6c22abad0b0f03977f1.zip | |
[clang-tidy] Function names configurable for cppcoreguidelines-nomalloc - checker
Summary:
Hello everybody,
this is an incremental patch for the NoMalloc-Checker I wrote. It allows to configure the memory-management functions, that are checked,
This might be helpful for a code base with custom functions in use, or non-standard functionality, like posix_memalign.
Reviewers: aaron.ballman, hokein, alexfh
Reviewed By: aaron.ballman, alexfh
Subscribers: sbenza, nemanjai, JDevlieghere
Tags: #clang-tools-extra
Patch by Jonas Toth!
Differential Revision: https://reviews.llvm.org/D28239
llvm-svn: 296734
Diffstat (limited to 'clang-tools-extra/clang-tidy/cppcoreguidelines')
| -rw-r--r-- | clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.cpp | 36 | ||||
| -rw-r--r-- | clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.h | 20 |
2 files changed, 47 insertions, 9 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"; diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.h b/clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.h index cf2a8a27aa1..66b29f7b902 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.h +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.h @@ -27,14 +27,32 @@ namespace cppcoreguidelines { /// http://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines-no-malloc.html class NoMallocCheck : public ClangTidyCheck { public: + /// Construct Checker and read in configuration for function names. NoMallocCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context) {} + : ClangTidyCheck(Name, Context), + AllocList(Options.get("Allocations", "::malloc;::calloc")), + ReallocList(Options.get("Reallocations", "::realloc")), + DeallocList(Options.get("Deallocations", "::free")) {} + + /// Make configuration of checker discoverable. + void storeOptions(ClangTidyOptions::OptionMap &Opts) override; /// Registering for malloc, calloc, realloc and free calls. void registerMatchers(ast_matchers::MatchFinder *Finder) override; /// Checks matched function calls and gives suggestion to modernize the code. void check(const ast_matchers::MatchFinder::MatchResult &Result) override; + +private: + /// Semicolon-seperated list of fully qualified names of memory allocation + /// functions the check warns about. Defaults to `::malloc;::calloc`. + const std::string AllocList; + /// Semicolon-seperated list of fully qualified names of memory reallocation + /// functions the check warns about. Defaults to `::realloc`. + const std::string ReallocList; + /// Semicolon-seperated list of fully qualified names of memory deallocation + /// functions the check warns about. Defaults to `::free`. + const std::string DeallocList; }; } // namespace cppcoreguidelines |

