diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-12-21 10:11:23 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-12-21 10:11:23 +0000 |
commit | 82fbb664657da2f635dc03e1e656649dbdb6c3c0 (patch) | |
tree | c897b797405d774b5c84adf8b0381ce9c7e61c0b | |
parent | 744eb3c3be8be0dae4458e9786296ba6d7dffda6 (diff) | |
download | bcm5719-llvm-82fbb664657da2f635dc03e1e656649dbdb6c3c0.tar.gz bcm5719-llvm-82fbb664657da2f635dc03e1e656649dbdb6c3c0.zip |
Revert rL349876 from cfe/trunk: [analyzer] Perform escaping in RetainCountChecker on type mismatch even for inlined functions
The fix done in D55465 did not previously apply when the function was inlined.
rdar://46889541
Differential Revision: https://reviews.llvm.org/D55976
........
Fixes broken buildbot: http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/14764
llvm-svn: 349894
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp | 51 | ||||
-rw-r--r-- | clang/test/Analysis/osobject-retain-release.cpp | 10 |
2 files changed, 23 insertions, 38 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp index 87c1ad9edb8..488cf6d3eb8 100644 --- a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp @@ -502,25 +502,6 @@ static Optional<RefVal> refValFromRetEffect(RetEffect RE, return None; } -static bool isPointerToObject(QualType QT) { - QualType PT = QT->getPointeeType(); - if (!PT.isNull()) - if (PT->getAsCXXRecordDecl()) - return true; - return false; -} - -/// Whether the tracked value should be escaped on a given call. -/// OSObjects are escaped when passed to void * / etc. -static bool shouldEscapeArgumentOnCall(const CallEvent &CE, unsigned ArgIdx, - const RefVal *TrackedValue) { - if (TrackedValue->getObjKind() != RetEffect::OS) - return false; - if (ArgIdx >= CE.parameters().size()) - return false; - return !isPointerToObject(CE.parameters()[ArgIdx]->getType()); -} - // We don't always get the exact modeling of the function with regards to the // retain count checker even when the function is inlined. For example, we need // to stop tracking the symbols which were marked with StopTrackingHard. @@ -531,16 +512,11 @@ void RetainCountChecker::processSummaryOfInlined(const RetainSummary &Summ, // Evaluate the effect of the arguments. for (unsigned idx = 0, e = CallOrMsg.getNumArgs(); idx != e; ++idx) { - SVal V = CallOrMsg.getArgSVal(idx); - - if (SymbolRef Sym = V.getAsLocSymbol()) { - bool ShouldRemoveBinding = Summ.getArg(idx) == StopTrackingHard; - if (const RefVal *T = getRefBinding(state, Sym)) - if (shouldEscapeArgumentOnCall(CallOrMsg, idx, T)) - ShouldRemoveBinding = true; - - if (ShouldRemoveBinding) + if (Summ.getArg(idx) == StopTrackingHard) { + SVal V = CallOrMsg.getArgSVal(idx); + if (SymbolRef Sym = V.getAsLocSymbol()) { state = removeRefBinding(state, Sym); + } } } @@ -598,6 +574,25 @@ static ProgramStateRef updateOutParameter(ProgramStateRef State, return State; } +static bool isPointerToObject(QualType QT) { + QualType PT = QT->getPointeeType(); + if (!PT.isNull()) + if (PT->getAsCXXRecordDecl()) + return true; + return false; +} + +/// Whether the tracked value should be escaped on a given call. +/// OSObjects are escaped when passed to void * / etc. +static bool shouldEscapeArgumentOnCall(const CallEvent &CE, unsigned ArgIdx, + const RefVal *TrackedValue) { + if (TrackedValue->getObjKind() != RetEffect::OS) + return false; + if (ArgIdx >= CE.parameters().size()) + return false; + return !isPointerToObject(CE.parameters()[ArgIdx]->getType()); +} + void RetainCountChecker::checkSummary(const RetainSummary &Summ, const CallEvent &CallOrMsg, CheckerContext &C) const { diff --git a/clang/test/Analysis/osobject-retain-release.cpp b/clang/test/Analysis/osobject-retain-release.cpp index 0cd9deff0ee..2efd20709bb 100644 --- a/clang/test/Analysis/osobject-retain-release.cpp +++ b/clang/test/Analysis/osobject-retain-release.cpp @@ -90,10 +90,7 @@ struct OSMetaClassBase { static OSObject *safeMetaCast(const OSObject *inst, const OSMetaClass *meta); }; -typedef unsigned long MYTYPE; - void escape(void *); -void escape_with_source(MYTYPE p) {} bool coin(); bool os_consume_violation_two_args(OS_CONSUME OSObject *obj, bool extra) { @@ -142,13 +139,6 @@ void test_escaping_into_voidstar() { escape(obj); } -void test_escape_has_source() { - OSObject *obj = new OSObject; - if (obj) - escape_with_source((MYTYPE)obj); - return; -} - void test_no_infinite_check_recursion(MyArray *arr) { OSObject *input = new OSObject; OSObject *o = arr->generateObject(input); |