11 #include "clang/AST/ASTContext.h"
12 #include "clang/ASTMatchers/ASTMatchFinder.h"
13 #include "clang/ASTMatchers/ASTMatchers.h"
15 using namespace clang::ast_matchers;
22 void StringReferenceMemberCheck::registerMatchers(
23 ast_matchers::MatchFinder *
Finder) {
26 if (!getLangOpts().CPlusPlus)
30 auto String = anyOf(recordDecl(hasName(
"::std::basic_string")),
31 recordDecl(hasName(
"::string")));
32 auto ConstString = qualType(isConstQualified(), hasDeclaration(String));
36 fieldDecl(hasType(references(ConstString)), unless(isInstantiated()))
41 void StringReferenceMemberCheck::check(
const MatchFinder::MatchResult &Result) {
42 const auto *Member = Result.Nodes.getNodeAs<FieldDecl>(
"member");
43 diag(Member->getLocStart(),
"const string& members are dangerous; it is much "
44 "better to use alternatives, such as pointers or "
std::unique_ptr< ast_matchers::MatchFinder > Finder