19#include "llvm/ADT/SmallString.h"
20#include "llvm/Support/raw_ostream.h"
51 T = QT->getNamedType();
62 return TD->
getName() ==
"string";
92 return TD->
getName() ==
"vector";
106 return TD->
getName() ==
"SmallVector";
115class StringRefCheckerVisitor :
public StmtVisitor<StringRefCheckerVisitor> {
116 const Decl *DeclWithIssue;
123 : DeclWithIssue(declWithIssue), BR(br),
Checker(checker) {}
124 void VisitChildren(
Stmt *S) {
125 for (
Stmt *Child : S->children())
129 void VisitStmt(
Stmt *S) { VisitChildren(S); }
132 void VisitVarDecl(
VarDecl *VD);
138 StringRefCheckerVisitor walker(
D, BR,
Checker);
142void StringRefCheckerVisitor::VisitDeclStmt(
DeclStmt *S) {
145 for (
auto *I : S->decls())
146 if (
VarDecl *VD = dyn_cast<VarDecl>(I))
150void StringRefCheckerVisitor::VisitVarDecl(
VarDecl *VD) {
179 const char *desc =
"StringRef should not be bound to temporary "
180 "std::string that it outlives";
184 VDLoc,
Init->getSourceRange());
201 for (
const auto &BS : R->
bases()) {
204 CXXRecordDecl *baseD = cast<CXXRecordDecl>(baseT->getDecl());
214class ASTFieldVisitor {
223 : Root(root), BR(br),
Checker(checker) {}
235 for (
auto *I : R->
fields()) {
236 ASTFieldVisitor walker(R, BR,
Checker);
242 FieldChain.push_back(
D);
251 for (
auto *I : RD->
fields())
255 FieldChain.pop_back();
258void ASTFieldVisitor::ReportError(
QualType T) {
260 llvm::raw_svector_ostream os(buf);
262 os <<
"AST class '" << Root->getName() <<
"' has a field '"
263 << FieldChain.front()->getName() <<
"' that allocates heap memory";
264 if (FieldChain.size() > 1) {
265 os <<
" via the following chain: ";
268 E=FieldChain.end(); I!=
E; ++I) {
273 os << (*I)->getName();
276 os <<
" (type " << FieldChain.back()->getType() <<
")";
288 "LLVM Conventions", os.str(), L);
296class LLVMConventionsChecker :
public Checker<
297 check::ASTDecl<CXXRecordDecl>,
298 check::ASTCodeBody > {
317bool ento::shouldRegisterLLVMConventionsChecker(
const CheckerManager &mgr) {
Defines the C++ template declaration subclasses.
static bool IsStdVector(QualType T)