1 //===- Calls.cpp - Wrapper for all function and method calls ------*- C++ -*--//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 /// \file This file defines CallEvent and its subclasses, which represent path-
11 /// sensitive instances of different kinds of function and method calls
12 /// (C, C++, and Objective-C).
13 //
14 //===----------------------------------------------------------------------===//
15
16 #include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h"
17 #include "clang/Analysis/ProgramPoint.h"
18 #include "clang/AST/ParentMap.h"
19 #include "llvm/ADT/SmallSet.h"
20 #include "llvm/ADT/StringExtras.h"
21
22 using namespace clang;
23 using namespace ento;
24
getResultType() const25 QualType CallEvent::getResultType() const {
26 const Expr *E = getOriginExpr();
27 assert(E && "Calls without origin expressions do not have results");
28 QualType ResultTy = E->getType();
29
30 ASTContext &Ctx = getState()->getStateManager().getContext();
31
32 // A function that returns a reference to 'int' will have a result type
33 // of simply 'int'. Check the origin expr's value kind to recover the
34 // proper type.
35 switch (E->getValueKind()) {
36 case VK_LValue:
37 ResultTy = Ctx.getLValueReferenceType(ResultTy);
38 break;
39 case VK_XValue:
40 ResultTy = Ctx.getRValueReferenceType(ResultTy);
41 break;
42 case VK_RValue:
43 // No adjustment is necessary.
44 break;
45 }
46
47 return ResultTy;
48 }
49
isCallbackArg(SVal V,QualType T)50 static bool isCallbackArg(SVal V, QualType T) {
51 // If the parameter is 0, it's harmless.
52 if (V.isZeroConstant())
53 return false;
54
55 // If a parameter is a block or a callback, assume it can modify pointer.
56 if (T->isBlockPointerType() ||
57 T->isFunctionPointerType() ||
58 T->isObjCSelType())
59 return true;
60
61 // Check if a callback is passed inside a struct (for both, struct passed by
62 // reference and by value). Dig just one level into the struct for now.
63
64 if (T->isAnyPointerType() || T->isReferenceType())
65 T = T->getPointeeType();
66
67 if (const RecordType *RT = T->getAsStructureType()) {
68 const RecordDecl *RD = RT->getDecl();
69 for (RecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
70 I != E; ++I) {
71 QualType FieldT = I->getType();
72 if (FieldT->isBlockPointerType() || FieldT->isFunctionPointerType())
73 return true;
74 }
75 }
76
77 return false;
78 }
79
hasNonZeroCallbackArg() const80 bool CallEvent::hasNonZeroCallbackArg() const {
81 unsigned NumOfArgs = getNumArgs();
82
83 // If calling using a function pointer, assume the function does not
84 // have a callback. TODO: We could check the types of the arguments here.
85 if (!getDecl())
86 return false;
87
88 unsigned Idx = 0;
89 for (CallEvent::param_type_iterator I = param_type_begin(),
90 E = param_type_end();
91 I != E && Idx < NumOfArgs; ++I, ++Idx) {
92 if (NumOfArgs <= Idx)
93 break;
94
95 if (isCallbackArg(getArgSVal(Idx), *I))
96 return true;
97 }
98
99 return false;
100 }
101
102 /// \brief Returns true if a type is a pointer-to-const or reference-to-const
103 /// with no further indirection.
isPointerToConst(QualType Ty)104 static bool isPointerToConst(QualType Ty) {
105 QualType PointeeTy = Ty->getPointeeType();
106 if (PointeeTy == QualType())
107 return false;
108 if (!PointeeTy.isConstQualified())
109 return false;
110 if (PointeeTy->isAnyPointerType())
111 return false;
112 return true;
113 }
114
115 // Try to retrieve the function declaration and find the function parameter
116 // types which are pointers/references to a non-pointer const.
117 // We will not invalidate the corresponding argument regions.
findPtrToConstParams(llvm::SmallSet<unsigned,1> & PreserveArgs,const CallEvent & Call)118 static void findPtrToConstParams(llvm::SmallSet<unsigned, 1> &PreserveArgs,
119 const CallEvent &Call) {
120 unsigned Idx = 0;
121 for (CallEvent::param_type_iterator I = Call.param_type_begin(),
122 E = Call.param_type_end();
123 I != E; ++I, ++Idx) {
124 if (isPointerToConst(*I))
125 PreserveArgs.insert(Idx);
126 }
127 }
128
invalidateRegions(unsigned BlockCount,ProgramStateRef Orig) const129 ProgramStateRef CallEvent::invalidateRegions(unsigned BlockCount,
130 ProgramStateRef Orig) const {
131 ProgramStateRef Result = (Orig ? Orig : getState());
132
133 SmallVector<const MemRegion *, 8> RegionsToInvalidate;
134 getExtraInvalidatedRegions(RegionsToInvalidate);
135
136 // Indexes of arguments whose values will be preserved by the call.
137 llvm::SmallSet<unsigned, 1> PreserveArgs;
138 if (!argumentsMayEscape())
139 findPtrToConstParams(PreserveArgs, *this);
140
141 for (unsigned Idx = 0, Count = getNumArgs(); Idx != Count; ++Idx) {
142 if (PreserveArgs.count(Idx))
143 continue;
144
145 SVal V = getArgSVal(Idx);
146
147 // If we are passing a location wrapped as an integer, unwrap it and
148 // invalidate the values referred by the location.
149 if (nonloc::LocAsInteger *Wrapped = dyn_cast<nonloc::LocAsInteger>(&V))
150 V = Wrapped->getLoc();
151 else if (!isa<Loc>(V))
152 continue;
153
154 if (const MemRegion *R = V.getAsRegion()) {
155 // Invalidate the value of the variable passed by reference.
156
157 // Are we dealing with an ElementRegion? If the element type is
158 // a basic integer type (e.g., char, int) and the underlying region
159 // is a variable region then strip off the ElementRegion.
160 // FIXME: We really need to think about this for the general case
161 // as sometimes we are reasoning about arrays and other times
162 // about (char*), etc., is just a form of passing raw bytes.
163 // e.g., void *p = alloca(); foo((char*)p);
164 if (const ElementRegion *ER = dyn_cast<ElementRegion>(R)) {
165 // Checking for 'integral type' is probably too promiscuous, but
166 // we'll leave it in for now until we have a systematic way of
167 // handling all of these cases. Eventually we need to come up
168 // with an interface to StoreManager so that this logic can be
169 // appropriately delegated to the respective StoreManagers while
170 // still allowing us to do checker-specific logic (e.g.,
171 // invalidating reference counts), probably via callbacks.
172 if (ER->getElementType()->isIntegralOrEnumerationType()) {
173 const MemRegion *superReg = ER->getSuperRegion();
174 if (isa<VarRegion>(superReg) || isa<FieldRegion>(superReg) ||
175 isa<ObjCIvarRegion>(superReg))
176 R = cast<TypedRegion>(superReg);
177 }
178 // FIXME: What about layers of ElementRegions?
179 }
180
181 // Mark this region for invalidation. We batch invalidate regions
182 // below for efficiency.
183 RegionsToInvalidate.push_back(R);
184 }
185 }
186
187 // Invalidate designated regions using the batch invalidation API.
188 // NOTE: Even if RegionsToInvalidate is empty, we may still invalidate
189 // global variables.
190 return Result->invalidateRegions(RegionsToInvalidate, getOriginExpr(),
191 BlockCount, getLocationContext(),
192 /*Symbols=*/0, this);
193 }
194
getProgramPoint(bool IsPreVisit,const ProgramPointTag * Tag) const195 ProgramPoint CallEvent::getProgramPoint(bool IsPreVisit,
196 const ProgramPointTag *Tag) const {
197 if (const Expr *E = getOriginExpr()) {
198 if (IsPreVisit)
199 return PreStmt(E, getLocationContext(), Tag);
200 return PostStmt(E, getLocationContext(), Tag);
201 }
202
203 const Decl *D = getDecl();
204 assert(D && "Cannot get a program point without a statement or decl");
205
206 SourceLocation Loc = getSourceRange().getBegin();
207 if (IsPreVisit)
208 return PreImplicitCall(D, Loc, getLocationContext(), Tag);
209 return PostImplicitCall(D, Loc, getLocationContext(), Tag);
210 }
211
getArgSVal(unsigned Index) const212 SVal CallEvent::getArgSVal(unsigned Index) const {
213 const Expr *ArgE = getArgExpr(Index);
214 if (!ArgE)
215 return UnknownVal();
216 return getSVal(ArgE);
217 }
218
getArgSourceRange(unsigned Index) const219 SourceRange CallEvent::getArgSourceRange(unsigned Index) const {
220 const Expr *ArgE = getArgExpr(Index);
221 if (!ArgE)
222 return SourceRange();
223 return ArgE->getSourceRange();
224 }
225
dump() const226 void CallEvent::dump() const {
227 dump(llvm::errs());
228 }
229
dump(raw_ostream & Out) const230 void CallEvent::dump(raw_ostream &Out) const {
231 ASTContext &Ctx = getState()->getStateManager().getContext();
232 if (const Expr *E = getOriginExpr()) {
233 E->printPretty(Out, 0, Ctx.getPrintingPolicy());
234 Out << "\n";
235 return;
236 }
237
238 if (const Decl *D = getDecl()) {
239 Out << "Call to ";
240 D->print(Out, Ctx.getPrintingPolicy());
241 return;
242 }
243
244 // FIXME: a string representation of the kind would be nice.
245 Out << "Unknown call (type " << getKind() << ")";
246 }
247
248
isCallStmt(const Stmt * S)249 bool CallEvent::isCallStmt(const Stmt *S) {
250 return isa<CallExpr>(S) || isa<ObjCMessageExpr>(S)
251 || isa<CXXConstructExpr>(S)
252 || isa<CXXNewExpr>(S);
253 }
254
addParameterValuesToBindings(const StackFrameContext * CalleeCtx,CallEvent::BindingsTy & Bindings,SValBuilder & SVB,const CallEvent & Call,CallEvent::param_iterator I,CallEvent::param_iterator E)255 static void addParameterValuesToBindings(const StackFrameContext *CalleeCtx,
256 CallEvent::BindingsTy &Bindings,
257 SValBuilder &SVB,
258 const CallEvent &Call,
259 CallEvent::param_iterator I,
260 CallEvent::param_iterator E) {
261 MemRegionManager &MRMgr = SVB.getRegionManager();
262
263 unsigned Idx = 0;
264 for (; I != E; ++I, ++Idx) {
265 const ParmVarDecl *ParamDecl = *I;
266 assert(ParamDecl && "Formal parameter has no decl?");
267
268 SVal ArgVal = Call.getArgSVal(Idx);
269 if (!ArgVal.isUnknown()) {
270 Loc ParamLoc = SVB.makeLoc(MRMgr.getVarRegion(ParamDecl, CalleeCtx));
271 Bindings.push_back(std::make_pair(ParamLoc, ArgVal));
272 }
273 }
274
275 // FIXME: Variadic arguments are not handled at all right now.
276 }
277
278
param_begin() const279 CallEvent::param_iterator AnyFunctionCall::param_begin() const {
280 const FunctionDecl *D = getDecl();
281 if (!D)
282 return 0;
283
284 return D->param_begin();
285 }
286
param_end() const287 CallEvent::param_iterator AnyFunctionCall::param_end() const {
288 const FunctionDecl *D = getDecl();
289 if (!D)
290 return 0;
291
292 return D->param_end();
293 }
294
getInitialStackFrameContents(const StackFrameContext * CalleeCtx,BindingsTy & Bindings) const295 void AnyFunctionCall::getInitialStackFrameContents(
296 const StackFrameContext *CalleeCtx,
297 BindingsTy &Bindings) const {
298 const FunctionDecl *D = cast<FunctionDecl>(CalleeCtx->getDecl());
299 SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
300 addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
301 D->param_begin(), D->param_end());
302 }
303
argumentsMayEscape() const304 bool AnyFunctionCall::argumentsMayEscape() const {
305 if (hasNonZeroCallbackArg())
306 return true;
307
308 const FunctionDecl *D = getDecl();
309 if (!D)
310 return true;
311
312 const IdentifierInfo *II = D->getIdentifier();
313 if (!II)
314 return true;
315
316 // This set of "escaping" APIs is
317
318 // - 'int pthread_setspecific(ptheread_key k, const void *)' stores a
319 // value into thread local storage. The value can later be retrieved with
320 // 'void *ptheread_getspecific(pthread_key)'. So even thought the
321 // parameter is 'const void *', the region escapes through the call.
322 if (II->isStr("pthread_setspecific"))
323 return true;
324
325 // - xpc_connection_set_context stores a value which can be retrieved later
326 // with xpc_connection_get_context.
327 if (II->isStr("xpc_connection_set_context"))
328 return true;
329
330 // - funopen - sets a buffer for future IO calls.
331 if (II->isStr("funopen"))
332 return true;
333
334 StringRef FName = II->getName();
335
336 // - CoreFoundation functions that end with "NoCopy" can free a passed-in
337 // buffer even if it is const.
338 if (FName.endswith("NoCopy"))
339 return true;
340
341 // - NSXXInsertXX, for example NSMapInsertIfAbsent, since they can
342 // be deallocated by NSMapRemove.
343 if (FName.startswith("NS") && (FName.find("Insert") != StringRef::npos))
344 return true;
345
346 // - Many CF containers allow objects to escape through custom
347 // allocators/deallocators upon container construction. (PR12101)
348 if (FName.startswith("CF") || FName.startswith("CG")) {
349 return StrInStrNoCase(FName, "InsertValue") != StringRef::npos ||
350 StrInStrNoCase(FName, "AddValue") != StringRef::npos ||
351 StrInStrNoCase(FName, "SetValue") != StringRef::npos ||
352 StrInStrNoCase(FName, "WithData") != StringRef::npos ||
353 StrInStrNoCase(FName, "AppendValue") != StringRef::npos ||
354 StrInStrNoCase(FName, "SetAttribute") != StringRef::npos;
355 }
356
357 return false;
358 }
359
360
getDecl() const361 const FunctionDecl *SimpleCall::getDecl() const {
362 const FunctionDecl *D = getOriginExpr()->getDirectCallee();
363 if (D)
364 return D;
365
366 return getSVal(getOriginExpr()->getCallee()).getAsFunctionDecl();
367 }
368
369
getDecl() const370 const FunctionDecl *CXXInstanceCall::getDecl() const {
371 const CallExpr *CE = cast_or_null<CallExpr>(getOriginExpr());
372 if (!CE)
373 return AnyFunctionCall::getDecl();
374
375 const FunctionDecl *D = CE->getDirectCallee();
376 if (D)
377 return D;
378
379 return getSVal(CE->getCallee()).getAsFunctionDecl();
380 }
381
getExtraInvalidatedRegions(RegionList & Regions) const382 void CXXInstanceCall::getExtraInvalidatedRegions(RegionList &Regions) const {
383 if (const MemRegion *R = getCXXThisVal().getAsRegion())
384 Regions.push_back(R);
385 }
386
getCXXThisVal() const387 SVal CXXInstanceCall::getCXXThisVal() const {
388 const Expr *Base = getCXXThisExpr();
389 // FIXME: This doesn't handle an overloaded ->* operator.
390 if (!Base)
391 return UnknownVal();
392
393 SVal ThisVal = getSVal(Base);
394
395 // FIXME: This is only necessary because we can call member functions on
396 // struct rvalues, which do not have regions we can use for a 'this' pointer.
397 // Ideally this should eventually be changed to an assert, i.e. all
398 // non-Unknown, non-null 'this' values should be loc::MemRegionVals.
399 if (isa<DefinedSVal>(ThisVal))
400 if (!ThisVal.getAsRegion() && !ThisVal.isConstant())
401 return UnknownVal();
402
403 return ThisVal;
404 }
405
406
getRuntimeDefinition() const407 RuntimeDefinition CXXInstanceCall::getRuntimeDefinition() const {
408 // Do we have a decl at all?
409 const Decl *D = getDecl();
410 if (!D)
411 return RuntimeDefinition();
412
413 // If the method is non-virtual, we know we can inline it.
414 const CXXMethodDecl *MD = cast<CXXMethodDecl>(D);
415 if (!MD->isVirtual())
416 return AnyFunctionCall::getRuntimeDefinition();
417
418 // Do we know the implicit 'this' object being called?
419 const MemRegion *R = getCXXThisVal().getAsRegion();
420 if (!R)
421 return RuntimeDefinition();
422
423 // Do we know anything about the type of 'this'?
424 DynamicTypeInfo DynType = getState()->getDynamicTypeInfo(R);
425 if (!DynType.isValid())
426 return RuntimeDefinition();
427
428 // Is the type a C++ class? (This is mostly a defensive check.)
429 QualType RegionType = DynType.getType()->getPointeeType();
430 assert(!RegionType.isNull() && "DynamicTypeInfo should always be a pointer.");
431
432 const CXXRecordDecl *RD = RegionType->getAsCXXRecordDecl();
433 if (!RD || !RD->hasDefinition())
434 return RuntimeDefinition();
435
436 // Find the decl for this method in that class.
437 const CXXMethodDecl *Result = MD->getCorrespondingMethodInClass(RD, true);
438 if (!Result) {
439 // We might not even get the original statically-resolved method due to
440 // some particularly nasty casting (e.g. casts to sister classes).
441 // However, we should at least be able to search up and down our own class
442 // hierarchy, and some real bugs have been caught by checking this.
443 assert(!MD->getParent()->isDerivedFrom(RD) && "Bad DynamicTypeInfo");
444 assert(!RD->isDerivedFrom(MD->getParent()) && "Couldn't find known method");
445 return RuntimeDefinition();
446 }
447
448 // Does the decl that we found have an implementation?
449 const FunctionDecl *Definition;
450 if (!Result->hasBody(Definition))
451 return RuntimeDefinition();
452
453 // We found a definition. If we're not sure that this devirtualization is
454 // actually what will happen at runtime, make sure to provide the region so
455 // that ExprEngine can decide what to do with it.
456 if (DynType.canBeASubClass())
457 return RuntimeDefinition(Definition, R->StripCasts());
458 return RuntimeDefinition(Definition, /*DispatchRegion=*/0);
459 }
460
getInitialStackFrameContents(const StackFrameContext * CalleeCtx,BindingsTy & Bindings) const461 void CXXInstanceCall::getInitialStackFrameContents(
462 const StackFrameContext *CalleeCtx,
463 BindingsTy &Bindings) const {
464 AnyFunctionCall::getInitialStackFrameContents(CalleeCtx, Bindings);
465
466 // Handle the binding of 'this' in the new stack frame.
467 SVal ThisVal = getCXXThisVal();
468 if (!ThisVal.isUnknown()) {
469 ProgramStateManager &StateMgr = getState()->getStateManager();
470 SValBuilder &SVB = StateMgr.getSValBuilder();
471
472 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CalleeCtx->getDecl());
473 Loc ThisLoc = SVB.getCXXThis(MD, CalleeCtx);
474
475 // If we devirtualized to a different member function, we need to make sure
476 // we have the proper layering of CXXBaseObjectRegions.
477 if (MD->getCanonicalDecl() != getDecl()->getCanonicalDecl()) {
478 ASTContext &Ctx = SVB.getContext();
479 const CXXRecordDecl *Class = MD->getParent();
480 QualType Ty = Ctx.getPointerType(Ctx.getRecordType(Class));
481
482 // FIXME: CallEvent maybe shouldn't be directly accessing StoreManager.
483 bool Failed;
484 ThisVal = StateMgr.getStoreManager().evalDynamicCast(ThisVal, Ty, Failed);
485 assert(!Failed && "Calling an incorrectly devirtualized method");
486 }
487
488 if (!ThisVal.isUnknown())
489 Bindings.push_back(std::make_pair(ThisLoc, ThisVal));
490 }
491 }
492
493
494
getCXXThisExpr() const495 const Expr *CXXMemberCall::getCXXThisExpr() const {
496 return getOriginExpr()->getImplicitObjectArgument();
497 }
498
499
getCXXThisExpr() const500 const Expr *CXXMemberOperatorCall::getCXXThisExpr() const {
501 return getOriginExpr()->getArg(0);
502 }
503
504
getBlockRegion() const505 const BlockDataRegion *BlockCall::getBlockRegion() const {
506 const Expr *Callee = getOriginExpr()->getCallee();
507 const MemRegion *DataReg = getSVal(Callee).getAsRegion();
508
509 return dyn_cast_or_null<BlockDataRegion>(DataReg);
510 }
511
param_begin() const512 CallEvent::param_iterator BlockCall::param_begin() const {
513 const BlockDecl *D = getBlockDecl();
514 if (!D)
515 return 0;
516 return D->param_begin();
517 }
518
param_end() const519 CallEvent::param_iterator BlockCall::param_end() const {
520 const BlockDecl *D = getBlockDecl();
521 if (!D)
522 return 0;
523 return D->param_end();
524 }
525
getExtraInvalidatedRegions(RegionList & Regions) const526 void BlockCall::getExtraInvalidatedRegions(RegionList &Regions) const {
527 // FIXME: This also needs to invalidate captured globals.
528 if (const MemRegion *R = getBlockRegion())
529 Regions.push_back(R);
530 }
531
getInitialStackFrameContents(const StackFrameContext * CalleeCtx,BindingsTy & Bindings) const532 void BlockCall::getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
533 BindingsTy &Bindings) const {
534 const BlockDecl *D = cast<BlockDecl>(CalleeCtx->getDecl());
535 SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
536 addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
537 D->param_begin(), D->param_end());
538 }
539
540
getCXXThisVal() const541 SVal CXXConstructorCall::getCXXThisVal() const {
542 if (Data)
543 return loc::MemRegionVal(static_cast<const MemRegion *>(Data));
544 return UnknownVal();
545 }
546
getExtraInvalidatedRegions(RegionList & Regions) const547 void CXXConstructorCall::getExtraInvalidatedRegions(RegionList &Regions) const {
548 if (Data)
549 Regions.push_back(static_cast<const MemRegion *>(Data));
550 }
551
getInitialStackFrameContents(const StackFrameContext * CalleeCtx,BindingsTy & Bindings) const552 void CXXConstructorCall::getInitialStackFrameContents(
553 const StackFrameContext *CalleeCtx,
554 BindingsTy &Bindings) const {
555 AnyFunctionCall::getInitialStackFrameContents(CalleeCtx, Bindings);
556
557 SVal ThisVal = getCXXThisVal();
558 if (!ThisVal.isUnknown()) {
559 SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
560 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CalleeCtx->getDecl());
561 Loc ThisLoc = SVB.getCXXThis(MD, CalleeCtx);
562 Bindings.push_back(std::make_pair(ThisLoc, ThisVal));
563 }
564 }
565
566
567
getCXXThisVal() const568 SVal CXXDestructorCall::getCXXThisVal() const {
569 if (Data)
570 return loc::MemRegionVal(DtorDataTy::getFromOpaqueValue(Data).getPointer());
571 return UnknownVal();
572 }
573
getRuntimeDefinition() const574 RuntimeDefinition CXXDestructorCall::getRuntimeDefinition() const {
575 // Base destructors are always called non-virtually.
576 // Skip CXXInstanceCall's devirtualization logic in this case.
577 if (isBaseDestructor())
578 return AnyFunctionCall::getRuntimeDefinition();
579
580 return CXXInstanceCall::getRuntimeDefinition();
581 }
582
583
param_begin() const584 CallEvent::param_iterator ObjCMethodCall::param_begin() const {
585 const ObjCMethodDecl *D = getDecl();
586 if (!D)
587 return 0;
588
589 return D->param_begin();
590 }
591
param_end() const592 CallEvent::param_iterator ObjCMethodCall::param_end() const {
593 const ObjCMethodDecl *D = getDecl();
594 if (!D)
595 return 0;
596
597 return D->param_end();
598 }
599
600 void
getExtraInvalidatedRegions(RegionList & Regions) const601 ObjCMethodCall::getExtraInvalidatedRegions(RegionList &Regions) const {
602 if (const MemRegion *R = getReceiverSVal().getAsRegion())
603 Regions.push_back(R);
604 }
605
getSelfSVal() const606 SVal ObjCMethodCall::getSelfSVal() const {
607 const LocationContext *LCtx = getLocationContext();
608 const ImplicitParamDecl *SelfDecl = LCtx->getSelfDecl();
609 if (!SelfDecl)
610 return SVal();
611 return getState()->getSVal(getState()->getRegion(SelfDecl, LCtx));
612 }
613
getReceiverSVal() const614 SVal ObjCMethodCall::getReceiverSVal() const {
615 // FIXME: Is this the best way to handle class receivers?
616 if (!isInstanceMessage())
617 return UnknownVal();
618
619 if (const Expr *RecE = getOriginExpr()->getInstanceReceiver())
620 return getSVal(RecE);
621
622 // An instance message with no expression means we are sending to super.
623 // In this case the object reference is the same as 'self'.
624 assert(getOriginExpr()->getReceiverKind() == ObjCMessageExpr::SuperInstance);
625 SVal SelfVal = getSelfSVal();
626 assert(SelfVal.isValid() && "Calling super but not in ObjC method");
627 return SelfVal;
628 }
629
isReceiverSelfOrSuper() const630 bool ObjCMethodCall::isReceiverSelfOrSuper() const {
631 if (getOriginExpr()->getReceiverKind() == ObjCMessageExpr::SuperInstance ||
632 getOriginExpr()->getReceiverKind() == ObjCMessageExpr::SuperClass)
633 return true;
634
635 if (!isInstanceMessage())
636 return false;
637
638 SVal RecVal = getSVal(getOriginExpr()->getInstanceReceiver());
639
640 return (RecVal == getSelfSVal());
641 }
642
getSourceRange() const643 SourceRange ObjCMethodCall::getSourceRange() const {
644 switch (getMessageKind()) {
645 case OCM_Message:
646 return getOriginExpr()->getSourceRange();
647 case OCM_PropertyAccess:
648 case OCM_Subscript:
649 return getContainingPseudoObjectExpr()->getSourceRange();
650 }
651 llvm_unreachable("unknown message kind");
652 }
653
654 typedef llvm::PointerIntPair<const PseudoObjectExpr *, 2> ObjCMessageDataTy;
655
getContainingPseudoObjectExpr() const656 const PseudoObjectExpr *ObjCMethodCall::getContainingPseudoObjectExpr() const {
657 assert(Data != 0 && "Lazy lookup not yet performed.");
658 assert(getMessageKind() != OCM_Message && "Explicit message send.");
659 return ObjCMessageDataTy::getFromOpaqueValue(Data).getPointer();
660 }
661
getMessageKind() const662 ObjCMessageKind ObjCMethodCall::getMessageKind() const {
663 if (Data == 0) {
664 ParentMap &PM = getLocationContext()->getParentMap();
665 const Stmt *S = PM.getParent(getOriginExpr());
666 if (const PseudoObjectExpr *POE = dyn_cast_or_null<PseudoObjectExpr>(S)) {
667 const Expr *Syntactic = POE->getSyntacticForm();
668
669 // This handles the funny case of assigning to the result of a getter.
670 // This can happen if the getter returns a non-const reference.
671 if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(Syntactic))
672 Syntactic = BO->getLHS();
673
674 ObjCMessageKind K;
675 switch (Syntactic->getStmtClass()) {
676 case Stmt::ObjCPropertyRefExprClass:
677 K = OCM_PropertyAccess;
678 break;
679 case Stmt::ObjCSubscriptRefExprClass:
680 K = OCM_Subscript;
681 break;
682 default:
683 // FIXME: Can this ever happen?
684 K = OCM_Message;
685 break;
686 }
687
688 if (K != OCM_Message) {
689 const_cast<ObjCMethodCall *>(this)->Data
690 = ObjCMessageDataTy(POE, K).getOpaqueValue();
691 assert(getMessageKind() == K);
692 return K;
693 }
694 }
695
696 const_cast<ObjCMethodCall *>(this)->Data
697 = ObjCMessageDataTy(0, 1).getOpaqueValue();
698 assert(getMessageKind() == OCM_Message);
699 return OCM_Message;
700 }
701
702 ObjCMessageDataTy Info = ObjCMessageDataTy::getFromOpaqueValue(Data);
703 if (!Info.getPointer())
704 return OCM_Message;
705 return static_cast<ObjCMessageKind>(Info.getInt());
706 }
707
708
canBeOverridenInSubclass(ObjCInterfaceDecl * IDecl,Selector Sel) const709 bool ObjCMethodCall::canBeOverridenInSubclass(ObjCInterfaceDecl *IDecl,
710 Selector Sel) const {
711 assert(IDecl);
712 const SourceManager &SM =
713 getState()->getStateManager().getContext().getSourceManager();
714
715 // If the class interface is declared inside the main file, assume it is not
716 // subcassed.
717 // TODO: It could actually be subclassed if the subclass is private as well.
718 // This is probably very rare.
719 SourceLocation InterfLoc = IDecl->getEndOfDefinitionLoc();
720 if (InterfLoc.isValid() && SM.isFromMainFile(InterfLoc))
721 return false;
722
723 // Assume that property accessors are not overridden.
724 if (getMessageKind() == OCM_PropertyAccess)
725 return false;
726
727 // We assume that if the method is public (declared outside of main file) or
728 // has a parent which publicly declares the method, the method could be
729 // overridden in a subclass.
730
731 // Find the first declaration in the class hierarchy that declares
732 // the selector.
733 ObjCMethodDecl *D = 0;
734 while (true) {
735 D = IDecl->lookupMethod(Sel, true);
736
737 // Cannot find a public definition.
738 if (!D)
739 return false;
740
741 // If outside the main file,
742 if (D->getLocation().isValid() && !SM.isFromMainFile(D->getLocation()))
743 return true;
744
745 if (D->isOverriding()) {
746 // Search in the superclass on the next iteration.
747 IDecl = D->getClassInterface();
748 if (!IDecl)
749 return false;
750
751 IDecl = IDecl->getSuperClass();
752 if (!IDecl)
753 return false;
754
755 continue;
756 }
757
758 return false;
759 };
760
761 llvm_unreachable("The while loop should always terminate.");
762 }
763
getRuntimeDefinition() const764 RuntimeDefinition ObjCMethodCall::getRuntimeDefinition() const {
765 const ObjCMessageExpr *E = getOriginExpr();
766 assert(E);
767 Selector Sel = E->getSelector();
768
769 if (E->isInstanceMessage()) {
770
771 // Find the the receiver type.
772 const ObjCObjectPointerType *ReceiverT = 0;
773 bool CanBeSubClassed = false;
774 QualType SupersType = E->getSuperType();
775 const MemRegion *Receiver = 0;
776
777 if (!SupersType.isNull()) {
778 // Super always means the type of immediate predecessor to the method
779 // where the call occurs.
780 ReceiverT = cast<ObjCObjectPointerType>(SupersType);
781 } else {
782 Receiver = getReceiverSVal().getAsRegion();
783 if (!Receiver)
784 return RuntimeDefinition();
785
786 DynamicTypeInfo DTI = getState()->getDynamicTypeInfo(Receiver);
787 QualType DynType = DTI.getType();
788 CanBeSubClassed = DTI.canBeASubClass();
789 ReceiverT = dyn_cast<ObjCObjectPointerType>(DynType);
790
791 if (ReceiverT && CanBeSubClassed)
792 if (ObjCInterfaceDecl *IDecl = ReceiverT->getInterfaceDecl())
793 if (!canBeOverridenInSubclass(IDecl, Sel))
794 CanBeSubClassed = false;
795 }
796
797 // Lookup the method implementation.
798 if (ReceiverT)
799 if (ObjCInterfaceDecl *IDecl = ReceiverT->getInterfaceDecl()) {
800 const ObjCMethodDecl *MD = IDecl->lookupPrivateMethod(Sel);
801 if (CanBeSubClassed)
802 return RuntimeDefinition(MD, Receiver);
803 else
804 return RuntimeDefinition(MD, 0);
805 }
806
807 } else {
808 // This is a class method.
809 // If we have type info for the receiver class, we are calling via
810 // class name.
811 if (ObjCInterfaceDecl *IDecl = E->getReceiverInterface()) {
812 // Find/Return the method implementation.
813 return RuntimeDefinition(IDecl->lookupPrivateClassMethod(Sel));
814 }
815 }
816
817 return RuntimeDefinition();
818 }
819
getInitialStackFrameContents(const StackFrameContext * CalleeCtx,BindingsTy & Bindings) const820 void ObjCMethodCall::getInitialStackFrameContents(
821 const StackFrameContext *CalleeCtx,
822 BindingsTy &Bindings) const {
823 const ObjCMethodDecl *D = cast<ObjCMethodDecl>(CalleeCtx->getDecl());
824 SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
825 addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
826 D->param_begin(), D->param_end());
827
828 SVal SelfVal = getReceiverSVal();
829 if (!SelfVal.isUnknown()) {
830 const VarDecl *SelfD = CalleeCtx->getAnalysisDeclContext()->getSelfDecl();
831 MemRegionManager &MRMgr = SVB.getRegionManager();
832 Loc SelfLoc = SVB.makeLoc(MRMgr.getVarRegion(SelfD, CalleeCtx));
833 Bindings.push_back(std::make_pair(SelfLoc, SelfVal));
834 }
835 }
836
837 CallEventRef<>
getSimpleCall(const CallExpr * CE,ProgramStateRef State,const LocationContext * LCtx)838 CallEventManager::getSimpleCall(const CallExpr *CE, ProgramStateRef State,
839 const LocationContext *LCtx) {
840 if (const CXXMemberCallExpr *MCE = dyn_cast<CXXMemberCallExpr>(CE))
841 return create<CXXMemberCall>(MCE, State, LCtx);
842
843 if (const CXXOperatorCallExpr *OpCE = dyn_cast<CXXOperatorCallExpr>(CE)) {
844 const FunctionDecl *DirectCallee = OpCE->getDirectCallee();
845 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DirectCallee))
846 if (MD->isInstance())
847 return create<CXXMemberOperatorCall>(OpCE, State, LCtx);
848
849 } else if (CE->getCallee()->getType()->isBlockPointerType()) {
850 return create<BlockCall>(CE, State, LCtx);
851 }
852
853 // Otherwise, it's a normal function call, static member function call, or
854 // something we can't reason about.
855 return create<FunctionCall>(CE, State, LCtx);
856 }
857
858
859 CallEventRef<>
getCaller(const StackFrameContext * CalleeCtx,ProgramStateRef State)860 CallEventManager::getCaller(const StackFrameContext *CalleeCtx,
861 ProgramStateRef State) {
862 const LocationContext *ParentCtx = CalleeCtx->getParent();
863 const LocationContext *CallerCtx = ParentCtx->getCurrentStackFrame();
864 assert(CallerCtx && "This should not be used for top-level stack frames");
865
866 const Stmt *CallSite = CalleeCtx->getCallSite();
867
868 if (CallSite) {
869 if (const CallExpr *CE = dyn_cast<CallExpr>(CallSite))
870 return getSimpleCall(CE, State, CallerCtx);
871
872 switch (CallSite->getStmtClass()) {
873 case Stmt::CXXConstructExprClass:
874 case Stmt::CXXTemporaryObjectExprClass: {
875 SValBuilder &SVB = State->getStateManager().getSValBuilder();
876 const CXXMethodDecl *Ctor = cast<CXXMethodDecl>(CalleeCtx->getDecl());
877 Loc ThisPtr = SVB.getCXXThis(Ctor, CalleeCtx);
878 SVal ThisVal = State->getSVal(ThisPtr);
879
880 return getCXXConstructorCall(cast<CXXConstructExpr>(CallSite),
881 ThisVal.getAsRegion(), State, CallerCtx);
882 }
883 case Stmt::CXXNewExprClass:
884 return getCXXAllocatorCall(cast<CXXNewExpr>(CallSite), State, CallerCtx);
885 case Stmt::ObjCMessageExprClass:
886 return getObjCMethodCall(cast<ObjCMessageExpr>(CallSite),
887 State, CallerCtx);
888 default:
889 llvm_unreachable("This is not an inlineable statement.");
890 }
891 }
892
893 // Fall back to the CFG. The only thing we haven't handled yet is
894 // destructors, though this could change in the future.
895 const CFGBlock *B = CalleeCtx->getCallSiteBlock();
896 CFGElement E = (*B)[CalleeCtx->getIndex()];
897 assert(isa<CFGImplicitDtor>(E) && "All other CFG elements should have exprs");
898 assert(!isa<CFGTemporaryDtor>(E) && "We don't handle temporaries yet");
899
900 SValBuilder &SVB = State->getStateManager().getSValBuilder();
901 const CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(CalleeCtx->getDecl());
902 Loc ThisPtr = SVB.getCXXThis(Dtor, CalleeCtx);
903 SVal ThisVal = State->getSVal(ThisPtr);
904
905 const Stmt *Trigger;
906 if (const CFGAutomaticObjDtor *AutoDtor = dyn_cast<CFGAutomaticObjDtor>(&E))
907 Trigger = AutoDtor->getTriggerStmt();
908 else
909 Trigger = Dtor->getBody();
910
911 return getCXXDestructorCall(Dtor, Trigger, ThisVal.getAsRegion(),
912 isa<CFGBaseDtor>(E), State, CallerCtx);
913 }
914