summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp
diff options
context:
space:
mode:
authorGeorge Karpenkov <ekarpenkov@apple.com>2018-03-07 02:54:01 +0000
committerGeorge Karpenkov <ekarpenkov@apple.com>2018-03-07 02:54:01 +0000
commit4cbeeb16959e8b1de5237e092a635e2c137d15a1 (patch)
tree07098c0cbe6da873e6848b3f81ed71db9a9a26a3 /clang/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp
parentfdcbcfb0403d092dd5f9e54a8e9a530b785b26af (diff)
downloadbcm5719-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.cpp25
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);
OpenPOWER on IntegriCloud