summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGeorge Karpenkov <ekarpenkov@apple.com>2018-11-30 02:19:03 +0000
committerGeorge Karpenkov <ekarpenkov@apple.com>2018-11-30 02:19:03 +0000
commit98183bd51e1f19fa7f8a617398f85cc454e13139 (patch)
tree8fe7e6fa66ad48c2e9f0936e91509c824137c981 /lib
parentd72e681a0c38cf60710a2f7df30515f8712414c6 (diff)
downloadclang-98183bd51e1f19fa7f8a617398f85cc454e13139.tar.gz
[analyzer] RetainCountChecker: recognize that OSObject can be created directly using an operator "new"
Differential Revision: https://reviews.llvm.org/D55076 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@347949 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp2
-rw-r--r--lib/StaticAnalyzer/Core/RetainSummaryManager.cpp11
2 files changed, 9 insertions, 4 deletions
diff --git a/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp b/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp
index da47513e30..cffbf58dff 100644
--- a/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp
+++ b/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp
@@ -137,6 +137,8 @@ static void generateDiagnosticsForCallLike(
} else {
os << "function call";
}
+ } else if (const auto *NE = dyn_cast<CXXNewExpr>(S)){
+ os << "Operator new";
} else {
assert(isa<ObjCMessageExpr>(S));
CallEventManager &Mgr = CurrSt->getStateManager().getCallEventManager();
diff --git a/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp b/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp
index fc4544f843..357bc67559 100644
--- a/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp
+++ b/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp
@@ -124,10 +124,8 @@ RetainSummaryManager::generateSummary(const FunctionDecl *FD,
}
const IdentifierInfo *II = FD->getIdentifier();
- if (!II)
- return getDefaultSummary();
- StringRef FName = II->getName();
+ StringRef FName = II ? II->getName() : "";
// Strip away preceding '_'. Doing this here will effect all the checks
// down below.
@@ -304,6 +302,9 @@ RetainSummaryManager::generateSummary(const FunctionDecl *FD,
if (FName == "retain")
return getOSSummaryRetainRule(FD);
+
+ if (MD->getOverloadedOperator() == OO_New)
+ return getOSSummaryCreateRule(MD);
}
}
@@ -491,9 +492,11 @@ RetainSummaryManager::getSummary(const CallEvent &Call,
case CE_CXXConstructor:
Summ = getFunctionSummary(cast<CXXConstructorCall>(Call).getDecl());
break;
+ case CE_CXXAllocator:
+ Summ = getFunctionSummary(cast<CXXAllocatorCall>(Call).getDecl());
+ break;
case CE_Block:
case CE_CXXDestructor:
- case CE_CXXAllocator:
// FIXME: These calls are currently unsupported.
return getPersistentStopSummary();
case CE_ObjCMessage: {