[PATCH] D22725: [clang-tidy] Add check 'misc-replace-memcpy'

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Sat Jul 23 13:16:41 PDT 2016


On Sat, Jul 23, 2016 at 1:38 PM, Piotr Padlewski
<piotr.padlewski at gmail.com> wrote:
> Prazek added a subscriber: Prazek.
> Prazek added a comment.
>
> Thanks for the contribution. Is it your first check?
>
> Some main issues:
>
> 1. I think it would be much better to move this check to modernize module. I think the name 'modernize-use-copy' would follow the convention, or just
>
> 'modernize-replace-memcpy' also works, maybe it is even better. Your choice.
> Use rename_check.py to rename the check.

Why "modernize"? There's nothing modern about std::copy(), so I don't
see this as really relating to modernizing someone's code base.

Truth be told, I'm not entirely convinced this is a good check to have
-- I'm still wondering if there's a compelling use case where
std::copy() is an improvement over std::memcpy(). I'm guessing one
exists, but I've not seen it stated here.

~Aaron

>
> 2. Please add include fixer that will include <algorithm> if it is not yet included, so the code will compile after changes.
>
> Look at DeprecatedHeadersCheck.cpp or PassByValueCheck ( or grep for registerPPCallbacks)
>
> 3. The extra parens are not ideal thing. Can you describe (with examples) in which situations it would not compile/ something bad would happen if you wouldn't put the parens? I think you could check it in matchers and then apply parens or not.
>
> 4. Have you run the check on LLVM code base? It uses std::copy in many places. If after running with -fix all the memcpys will be gone (check if if finds anything after second run) and the code will compile and tests will not fail then it means that your check fully works!
>
>
> ================
> Comment at: clang-tidy/misc/ReplaceMemcpyCheck.cpp:25
> @@ +24,3 @@
> +void ReplaceMemcpyCheck::registerMatchers(MatchFinder *Finder) {
> +  Finder->addMatcher(
> +      callExpr(callee(functionDecl(hasName("memcpy")))).bind("expr"), this);
> ----------------
> add if here to discard the non c++ calls. (the same as you see in most of the checks)
>
> ================
> Comment at: clang-tidy/misc/ReplaceMemcpyCheck.cpp:26
> @@ +25,3 @@
> +  Finder->addMatcher(
> +      callExpr(callee(functionDecl(hasName("memcpy")))).bind("expr"), this);
> +}
> ----------------
> you can check argument count here.
>
> ================
> Comment at: clang-tidy/misc/ReplaceMemcpyCheck.cpp:40-41
> @@ +39,4 @@
> +
> +  if (MatchedExpr->getNumArgs() != 3)
> +    return;
> +
> ----------------
> so this can be checked in matcher
>
> ================
> Comment at: clang-tidy/misc/ReplaceMemcpyCheck.cpp:55
> @@ +54,3 @@
> +  diag(MatchedExpr->getExprLoc(), "Use std::copy instead of memcyp")
> +      << FixItHint::CreateReplacement(MatchedExpr->getSourceRange(), Insertion);
> +}
> ----------------
> don't make replacement if it is in macro (use .isMacroID on the location).
>
> Also add tests with macros.
>
> ================
> Comment at: clang-tidy/misc/ReplaceMemcpyCheck.h:30
> @@ +29,3 @@
> +
> +  static StringRef GetText(const Expr *Expression, const SourceManager &SM,
> +                           const LangOptions &LangOpts);
> ----------------
> If it is static, then move it to .cpp file.
>
> You could also remove static and arguments that you have access from class and move it to private.
>
> Also I think the function name convention is lowerCamelCase
>
> ================
> Comment at: test/clang-tidy/misc-replace-memcpy.cpp:3-5
> @@ +2,5 @@
> +
> +#include <cstring>
> +#include <algorithm>
> +#include <stdio.h>
> +
> ----------------
> don't include the stl, because it will make the test undebugable (the ast is too big)
>
> Mock the functions that you need - std::copy and std::memcpy. you don't have to give definition, but just make sure the declaration of the functions are the same.
>
>
> Also check if check will add <algorithm> here.
>
>
> Repository:
>   rL LLVM
>
> https://reviews.llvm.org/D22725
>
>
>


More information about the cfe-commits mailing list