diff options
author | George Karpenkov <ekarpenkov@apple.com> | 2018-03-07 02:54:01 +0000 |
---|---|---|
committer | George Karpenkov <ekarpenkov@apple.com> | 2018-03-07 02:54:01 +0000 |
commit | 4cbeeb16959e8b1de5237e092a635e2c137d15a1 (patch) | |
tree | 07098c0cbe6da873e6848b3f81ed71db9a9a26a3 /clang/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp | |
parent | fdcbcfb0403d092dd5f9e54a8e9a530b785b26af (diff) | |
download | bcm5719-llvm-4cbeeb16959e8b1de5237e092a635e2c137d15a1.tar.gz bcm5719-llvm-4cbeeb16959e8b1de5237e092a635e2c137d15a1.zip |
[analyzer] Fix the checker for the performance anti-pattern to accept messages
send to ObjC objects.
Differential Revision: https://reviews.llvm.org/D44170
llvm-svn: 326868
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp index 23ef032bb05..eda7a5fcd17 100644 --- a/clang/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp @@ -111,23 +111,26 @@ void GCDAsyncSemaphoreChecker::checkASTCodeBody(const Decl *D, ) ).bind(WarningBinding)); - auto AcceptsBlockM = - forEachDescendant(callExpr(hasAnyArgument(hasType( + auto HasBlockArgumentM = hasAnyArgument(hasType( hasCanonicalType(blockPointerType()) - )))); + )); - auto BlockSignallingM = - forEachDescendant(callExpr(hasAnyArgument(hasDescendant(callExpr( + auto ArgCallsSignalM = hasArgument(0, hasDescendant(callExpr( allOf( callsName("dispatch_semaphore_signal"), equalsBoundArgDecl(0, SemaphoreBinding) - )))))); + )))); + + auto HasBlockAndCallsSignalM = allOf(HasBlockArgumentM, ArgCallsSignalM); + + auto AcceptsBlockM = + forEachDescendant( + stmt(anyOf( + callExpr(HasBlockAndCallsSignalM), + objcMessageExpr(HasBlockAndCallsSignalM) + ))); - auto FinalM = compoundStmt( - SemaphoreBindingM, - SemaphoreWaitM, - AcceptsBlockM, - BlockSignallingM); + auto FinalM = compoundStmt(SemaphoreBindingM, SemaphoreWaitM, AcceptsBlockM); MatchFinder F; Callback CB(BR, AM.getAnalysisDeclContext(D), this); |