]> git.saurik.com Git - apple/objc4.git/blob - test/badAltHandler.m
objc4-680.tar.gz
[apple/objc4.git] / test / badAltHandler.m
1 // for OBJC2 mac only
2 /* TEST_CONFIG OS=macosx ARCH=x86_64
3 TEST_CRASHES
4
5 TEST_RUN_OUTPUT
6 objc\[\d+\]: objc_removeExceptionHandler\(\) called with unknown alt handler; this is probably a bug in multithreaded AppKit use. Set environment variable OBJC_DEBUG_ALT_HANDLERS=YES or break in objc_alt_handler_error\(\) to debug.
7 CRASHED: SIGILL
8 END
9 */
10
11 #include "test.h"
12
13 #include <objc/objc-exception.h>
14
15 /*
16 rdar://6888838
17 Mail installs an alt handler on one thread and deletes it on another.
18 This confuses the alt handler machinery, which halts the process.
19 */
20
21 uintptr_t Token;
22
23 void handler(id unused __unused, void *context __unused)
24 {
25 }
26
27 int main()
28 {
29 #if __clang__ && __cplusplus
30 // alt handlers need the objc personality
31 // catch (id) workaround forces the objc personality
32 @try {
33 testwarn("rdar://9183014 clang uses wrong exception personality");
34 } @catch (id e __unused) {
35 }
36 #endif
37
38 @try {
39 // Install 4 alt handlers
40 uintptr_t t1, t2, t3, t4;
41 t1 = objc_addExceptionHandler(&handler, NULL);
42 t2 = objc_addExceptionHandler(&handler, NULL);
43 t3 = objc_addExceptionHandler(&handler, NULL);
44 t4 = objc_addExceptionHandler(&handler, NULL);
45
46 // Remove 3 of them.
47 objc_removeExceptionHandler(t1);
48 objc_removeExceptionHandler(t2);
49 objc_removeExceptionHandler(t3);
50
51 // Create an alt handler on another thread
52 // that collides with one of the removed handlers
53 testonthread(^{
54 @try {
55 Token = objc_addExceptionHandler(&handler, NULL);
56 } @catch (...) {
57 }
58 });
59
60 // Incorrectly remove the other thread's handler
61 objc_removeExceptionHandler(Token);
62 // Remove the 4th handler
63 objc_removeExceptionHandler(t4);
64
65 // Install 8 more handlers.
66 // If the other thread's handler was not ignored,
67 // this will fail.
68 objc_addExceptionHandler(&handler, NULL);
69 objc_addExceptionHandler(&handler, NULL);
70 objc_addExceptionHandler(&handler, NULL);
71 objc_addExceptionHandler(&handler, NULL);
72 objc_addExceptionHandler(&handler, NULL);
73 objc_addExceptionHandler(&handler, NULL);
74 objc_addExceptionHandler(&handler, NULL);
75 objc_addExceptionHandler(&handler, NULL);
76 } @catch (...) {
77 }
78
79 // This should have crashed earlier.
80 fail(__FILE__);
81 }