summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2019-06-19 23:33:34 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2019-06-19 23:33:34 +0000
commitb03854f8e87e89051da5eae6c267020801fb39a0 (patch)
tree35e2ebd990f6f549f4f84386d390e66226ec7e85 /clang/lib/Analysis
parent24151619a00e7381dd3c3f96d623927c61f87e6c (diff)
downloadbcm5719-llvm-b03854f8e87e89051da5eae6c267020801fb39a0.tar.gz
bcm5719-llvm-b03854f8e87e89051da5eae6c267020801fb39a0.zip
[analyzer] RetainCount: Add support for OSRequiredCast().
It's a new API for custom RTTI in Apple IOKit/DriverKit framework that is similar to OSDynamicCast() that's already supported, but crashes instead of returning null (and therefore causing UB when the cast fails unexpectedly). Kind of like cast_or_null<> as opposed to dyn_cast_or_null<> in LLVM's RTTI. Historically, RetainCountChecker was responsible for modeling OSDynamicCast. This is simply an extension of the same functionality. Differential Revision: https://reviews.llvm.org/D63117 llvm-svn: 363891
Diffstat (limited to 'clang/lib/Analysis')
-rw-r--r--clang/lib/Analysis/RetainSummaryManager.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/Analysis/RetainSummaryManager.cpp b/clang/lib/Analysis/RetainSummaryManager.cpp
index 4f0fced60bf..132053fd2c2 100644
--- a/clang/lib/Analysis/RetainSummaryManager.cpp
+++ b/clang/lib/Analysis/RetainSummaryManager.cpp
@@ -152,6 +152,10 @@ static bool isOSObjectDynamicCast(StringRef S) {
return S == "safeMetaCast";
}
+static bool isOSObjectRequiredCast(StringRef S) {
+ return S == "requiredMetaCast";
+}
+
static bool isOSObjectThisCast(StringRef S) {
return S == "metaCast";
}
@@ -234,7 +238,8 @@ RetainSummaryManager::getSummaryForOSObject(const FunctionDecl *FD,
if (RetTy->isPointerType()) {
const CXXRecordDecl *PD = RetTy->getPointeeType()->getAsCXXRecordDecl();
if (PD && isOSObjectSubclass(PD)) {
- if (isOSObjectDynamicCast(FName) || isOSObjectThisCast(FName))
+ if (isOSObjectDynamicCast(FName) || isOSObjectRequiredCast(FName) ||
+ isOSObjectThisCast(FName))
return getDefaultSummary();
// TODO: Add support for the slightly common *Matching(table) idiom.
@@ -745,6 +750,8 @@ RetainSummaryManager::canEval(const CallExpr *CE, const FunctionDecl *FD,
if (TrackOSObjects) {
if (isOSObjectDynamicCast(FName) && FD->param_size() >= 1) {
return BehaviorSummary::IdentityOrZero;
+ } else if (isOSObjectRequiredCast(FName) && FD->param_size() >= 1) {
+ return BehaviorSummary::Identity;
} else if (isOSObjectThisCast(FName) && isa<CXXMethodDecl>(FD) &&
!cast<CXXMethodDecl>(FD)->isStatic()) {
return BehaviorSummary::IdentityThis;
OpenPOWER on IntegriCloud