1//= ObjCNoReturn.cpp - Handling of Cocoa APIs known not to return --*- C++ -*--- 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file implements special handling of recognizing ObjC API hooks that 10// do not return but aren't marked as such in API headers. 11// 12//===----------------------------------------------------------------------===// 13 14#include "clang/AST/ASTContext.h" 15#include "clang/AST/ExprObjC.h" 16#include "clang/Analysis/DomainSpecific/ObjCNoReturn.h" 17 18using namespace clang; 19 20static bool isSubclass(const ObjCInterfaceDecl *Class, IdentifierInfo *II) { 21 if (!Class) 22 return false; 23 if (Class->getIdentifier() == II) 24 return true; 25 return isSubclass(Class->getSuperClass(), II); 26} 27 28ObjCNoReturn::ObjCNoReturn(ASTContext &C) 29 : RaiseSel(GetNullarySelector("raise", C)), 30 NSExceptionII(&C.Idents.get("NSException")) 31{ 32 // Generate selectors. 33 SmallVector<IdentifierInfo*, 3> II; 34 35 // raise:format: 36 II.push_back(&C.Idents.get("raise")); 37 II.push_back(&C.Idents.get("format")); 38 NSExceptionInstanceRaiseSelectors[0] = 39 C.Selectors.getSelector(II.size(), &II[0]); 40 41 // raise:format:arguments: 42 II.push_back(&C.Idents.get("arguments")); 43 NSExceptionInstanceRaiseSelectors[1] = 44 C.Selectors.getSelector(II.size(), &II[0]); 45} 46 47 48bool ObjCNoReturn::isImplicitNoReturn(const ObjCMessageExpr *ME) { 49 Selector S = ME->getSelector(); 50 51 if (ME->isInstanceMessage()) { 52 // Check for the "raise" message. 53 return S == RaiseSel; 54 } 55 56 if (const ObjCInterfaceDecl *ID = ME->getReceiverInterface()) { 57 if (isSubclass(ID, NSExceptionII)) { 58 for (unsigned i = 0; i < NUM_RAISE_SELECTORS; ++i) { 59 if (S == NSExceptionInstanceRaiseSelectors[i]) 60 return true; 61 } 62 } 63 } 64 65 return false; 66} 67