Go to the documentation of this file.
20 #include "llvm/ADT/SmallString.h"
21 #include "llvm/Support/raw_ostream.h"
23 using namespace clang;
29 const CheckerBase *Checker;
35 inline bool isPointerSize(
const Type *T) {
44 inline bool hasPointerToPointerSizedType(
const Expr *E) {
55 if (isPointerSize(TElem))
63 return isPointerSize(TElem);
68 return static_cast<bool>(
74 : BR(br), Checker(checker), AC(ac), ASTC(AC->getASTContext()),
75 PtrWidth(ASTC.getTargetInfo().getPointerWidth(0)) {}
78 void VisitChildren(
Stmt *S);
79 void VisitStmt(
Stmt *S) { VisitChildren(S); }
96 void WalkAST::VisitCallExpr(
CallExpr *CE) {
101 const Expr *Arg =
nullptr;
104 if (Name.equals(
"CFArrayCreate") || Name.equals(
"CFSetCreate")) {
109 if (hasPointerToPointerSizedType(Arg))
111 }
else if (Name.equals(
"CFDictionaryCreate")) {
117 if (hasPointerToPointerSizedType(Arg)) {
121 if (hasPointerToPointerSizedType(Arg))
128 assert(ArgNum == 1 || ArgNum == 2);
131 llvm::raw_svector_ostream OsName(BufName);
132 OsName <<
" Invalid use of '" << Name <<
"'" ;
135 llvm::raw_svector_ostream Os(Buf);
138 Os <<
" The " << ((ArgNum == 1) ?
"second" :
"third") <<
" argument to '"
139 << Name <<
"' must be a C array of pointer-sized values, not '"
142 PathDiagnosticLocation CELoc =
144 BR.EmitBasicReport(AC->
getDecl(), Checker, OsName.str(),
153 void WalkAST::VisitChildren(
Stmt *S) {
154 for (
Stmt *Child : S->children())
160 class ObjCContainersASTChecker :
public Checker<check::ASTCodeBody> {
163 void checkASTCodeBody(
const Decl *D, AnalysisManager& Mgr,
164 BugReporter &BR)
const {
165 WalkAST walker(BR,
this, Mgr.getAnalysisDeclContext(D));
171 void ento::registerObjCContainersASTChecker(CheckerManager &mgr) {
172 mgr.registerChecker<ObjCContainersASTChecker>();
175 bool ento::shouldRegisterObjCContainersASTChecker(
const CheckerManager &mgr) {
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
const Type * getArrayElementTypeNoTypeQual() const
If this is an array type, return the element type of the array, potentially with type qualifiers miss...
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
A (possibly-)qualified type.
AnalysisDeclContext contains the context data for the function, method or block under analysis.
The base class of the type hierarchy.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
const char *const CoreFoundationObjectiveC
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Decl - This represents one declaration (or definition), e.g.
One of these records is kept for each identifier that is lexed.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
virtual Stmt * getBody() const
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
StringRef getName() const
Return the actual identifier string.
const Decl * getDecl() const
Stmt - This represents one statement.
static PathDiagnosticLocation createBegin(const Decl *D, const SourceManager &SM)
Create a location for the beginning of the declaration.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
static StringRef getCalleeName(CallExpr *CE)
This represents one expression.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
Represents a function declaration or definition.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).