r326868 - [analyzer] Fix the checker for the performance anti-pattern to accept messages
George Karpenkov via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 6 18:54:01 PST 2018
Author: george.karpenkov
Date: Tue Mar 6 18:54:01 2018
New Revision: 326868
URL: http://llvm.org/viewvc/llvm-project?rev=326868&view=rev
Log:
[analyzer] Fix the checker for the performance anti-pattern to accept messages
send to ObjC objects.
Differential Revision: https://reviews.llvm.org/D44170
Modified:
cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp
cfe/trunk/test/Analysis/gcdasyncsemaphorechecker_test.m
Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp?rev=326868&r1=326867&r2=326868&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/GCDAsyncSemaphoreChecker.cpp Tue Mar 6 18:54:01 2018
@@ -111,23 +111,26 @@ void GCDAsyncSemaphoreChecker::checkASTC
)
).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);
Modified: cfe/trunk/test/Analysis/gcdasyncsemaphorechecker_test.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/gcdasyncsemaphorechecker_test.m?rev=326868&r1=326867&r2=326868&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/gcdasyncsemaphorechecker_test.m (original)
+++ cfe/trunk/test/Analysis/gcdasyncsemaphorechecker_test.m Tue Mar 6 18:54:01 2018
@@ -177,7 +177,9 @@ void warn_with_cast() {
@interface Test1 : NSObject
-(void)use_method_warn;
+-(void)use_objc_callback_warn;
-(void)testNoWarn;
+-(void)acceptBlock:(block_t)callback;
@end
@implementation Test1
@@ -200,4 +202,33 @@ void warn_with_cast() {
dispatch_semaphore_wait(sema, 100);
}
+-(void)acceptBlock:(block_t) callback {
+ callback();
+}
+
+-(void)use_objc_callback_warn {
+ dispatch_semaphore_t sema = dispatch_semaphore_create(0);
+
+ [self acceptBlock:^{
+ dispatch_semaphore_signal(sema);
+ }];
+ dispatch_semaphore_wait(sema, 100); // expected-warning{{Possible semaphore performance anti-pattern}}
+}
+
+void use_objc_and_c_callback(Test1 *t) {
+ dispatch_semaphore_t sema = dispatch_semaphore_create(0);
+
+ func(^{
+ dispatch_semaphore_signal(sema);
+ });
+ dispatch_semaphore_wait(sema, 100); // expected-warning{{Possible semaphore performance anti-pattern}}
+
+ dispatch_semaphore_t sema1 = dispatch_semaphore_create(0);
+
+ [t acceptBlock:^{
+ dispatch_semaphore_signal(sema1);
+ }];
+ dispatch_semaphore_wait(sema1, 100); // expected-warning{{Possible semaphore performance anti-pattern}}
+}
+
@end
More information about the cfe-commits
mailing list