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) {
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 LangOptions &LO) {
Represents a function declaration or definition.
const char *const CoreFoundationObjectiveC
A (possibly-)qualified type.
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
virtual Stmt * getBody() const
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
Stmt - This represents one statement.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee...
Decl - This represents one declaration (or definition), e.g.
The base class of the type hierarchy.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
One of these records is kept for each identifier that is lexed.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
AnalysisDeclContext contains the context data for the function or method under analysis.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
This represents one expression.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
bool isNull() const
Return true if this QualType doesn't point to a type yet.
static StringRef getCalleeName(CallExpr *CE)
static PathDiagnosticLocation createBegin(const Decl *D, const SourceManager &SM)
Create a location for the beginning of the declaration.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant...
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
const Decl * getDecl() const
StringRef getName() const
Return the actual identifier string.
Dataflow Directional Tag Classes.
const Type * getArrayElementTypeNoTypeQual() const
If this is an array type, return the element type of the array, potentially with type qualifiers miss...
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types...
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Defines the clang::TargetInfo interface.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).