diff options
author | Kuba Mracek <mracek@apple.com> | 2017-03-26 20:59:23 +0000 |
---|---|---|
committer | Kuba Mracek <mracek@apple.com> | 2017-03-26 20:59:23 +0000 |
commit | ea0ff516f0343d98f338c2403566f68a131b07e3 (patch) | |
tree | 2fd5fe111e09f14040f6ad3e64f7d2e799d40dc1 /test/tsan/Darwin | |
parent | 96ccf181c8c1bf446bae8fc738b3dc8da5a65cfe (diff) | |
download | compiler-rt-ea0ff516f0343d98f338c2403566f68a131b07e3.tar.gz |
[tsan] Only Acquire/Release GCD queues if they're not NULL
While it's usually a bug to call GCD APIs, such as dispatch_after, with NULL as a queue, this often "somehow" works and TSan should maintain binary compatibility with existing code. This patch makes sure we don't try to call Acquire and Release on NULL queues, and add one such testcase for dispatch_after.
Differential Revision: https://reviews.llvm.org/D31355
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@298820 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/tsan/Darwin')
-rw-r--r-- | test/tsan/Darwin/gcd-after-null.mm | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/test/tsan/Darwin/gcd-after-null.mm b/test/tsan/Darwin/gcd-after-null.mm new file mode 100644 index 000000000..7c9913c0f --- /dev/null +++ b/test/tsan/Darwin/gcd-after-null.mm @@ -0,0 +1,23 @@ +// Regression test to make sure we don't crash when dispatch_after is called with a NULL queue. + +// RUN: %clang_tsan %s -o %t -framework Foundation +// RUN: %run %t 2>&1 | FileCheck %s + +#import <Foundation/Foundation.h> + +int main(int argc, const char *argv[]) { + fprintf(stderr, "start\n"); + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_MSEC)), NULL, ^{ + dispatch_async(dispatch_get_main_queue(), ^{ + CFRunLoopStop(CFRunLoopGetMain()); + }); + }); + CFRunLoopRun(); + + fprintf(stderr, "done\n"); + return 0; +} + +// CHECK: start +// CHECK: done |