•ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs...

47
Kuba Mracek, Apple ThreadSanitizer APIs for External Libraries

Transcript of •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs...

Page 1: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Kuba Mracek, Apple

•ThreadSanitizer APIsfor External Libraries

Page 2: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

ThreadSanitizer

Page 3: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

ThreadSanitizer

• Data race detector

Page 4: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

ThreadSanitizer

• Data race detector

• LLVM IR instrumentation:

Page 5: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

ThreadSanitizer

• Data race detector

• LLVM IR instrumentation:

• memory reads and writes

Page 6: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

ThreadSanitizer

• Data race detector

• LLVM IR instrumentation:

• memory reads and writes

• atomic operations (load, store, RMW, CAS)

Page 7: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Thread 1 Thread 2 Thread 3

Page 8: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Thread 1 Thread 2 Thread 3

events eventsevents

Page 9: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

happens-before data race detector

Thread 1 Thread 2 Thread 3

events eventsevents

Page 10: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

happens-before data race detector

Thread 1 Thread 2 Thread 3

events eventsevents Memory reads Memory writes

Synchronization events

Page 11: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

happens-before data race detector

Thread 1 Thread 2 Thread 3

events eventsevents

Page 12: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

happens-before data race detector

Thread 1 Thread 2 Thread 3

events eventsevents

🐞

Page 13: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

happens-before data race detector

Thread 1 Thread 2 Thread 3

events eventsevents

🐞

$ ./racyapp WARNING: ThreadSanitizer: data race (pid=19219) Write of size 4 at 0x7fcf47b21bc0 by thread T1: #0 Thread1 race.c:4 (exe+0x00000000a360)

Previous write of size 4 at 0x7fcf47b21bc0 by main thread: #0 main race.c:10 (exe+0x00000000a3b4)

Page 14: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Libraries and Frameworks

Page 15: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Libraries and Frameworks

• Precompiled code is not instrumented

Page 16: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Libraries and Frameworks

• Precompiled code is not instrumented

instrumented

Page 17: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Libraries and Frameworks

• Precompiled code is not instrumented

call API

instrumented

Page 18: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Libraries and Frameworks

• Precompiled code is not instrumented

call API

.so

instrumented non-instrumented

Page 19: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Libraries and Frameworks

• Precompiled code is not instrumented

call API

.so🐞

instrumented non-instrumented

Page 20: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Libraries and Frameworks

• Precompiled code is not instrumented

call API

.so🐞🚫

instrumented non-instrumented

Page 21: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Libraries and Frameworks

• Precompiled code is not instrumented

call API

.so

instrumented instrumented

Page 22: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Libraries and Frameworks

• Precompiled code is not instrumented

call API

.so🐞

instrumented instrumented

Page 23: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Libraries and Frameworks

• Precompiled code is not instrumented

• APIs expect users to ensure thread safety

call API

.so🐞

instrumented instrumented

Page 24: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Libraries and Frameworks

• Precompiled code is not instrumented

• APIs expect users to ensure thread safety

call API

.so🐞

instrumented

Page 25: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Libraries and Frameworks

• Precompiled code is not instrumented

• APIs expect users to ensure thread safety

call API

.so🐞

instrumented

Page 26: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

New: APIs for Libraries

Page 27: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

New: APIs for Libraries

• ThreadSanitizer provides callbacks for libraries to inform about read/write-like events of high-level objects:

Page 28: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

New: APIs for Libraries

• ThreadSanitizer provides callbacks for libraries to inform about read/write-like events of high-level objects:

__tsan_external_read(void *addr, void *caller_pc, void *tag); __tsan_external_write(void *addr, void *caller_pc, void *tag);

Page 29: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

New: APIs for Libraries

• ThreadSanitizer provides callbacks for libraries to inform about read/write-like events of high-level objects:

• High-level object = basically any object you work with

• array, map, graph node, data object, UI element, …

__tsan_external_read(void *addr, void *caller_pc, void *tag); __tsan_external_write(void *addr, void *caller_pc, void *tag);

Page 30: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Example: CoreFoundation

Page 31: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Example: CoreFoundation

• Provides APIs for basic collections:CFMutableArrayRef CFArrayCreateMutable(/*…*/);void CFArrayAppendValue(CFArrayRef array, /*…*/);CFIndex CFArrayGetCount(CFArrayRef array);

Page 32: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

Example: CoreFoundation

• Provides APIs for basic collections:CFMutableArrayRef CFArrayCreateMutable(/*…*/);void CFArrayAppendValue(CFArrayRef array, /*…*/);CFIndex CFArrayGetCount(CFArrayRef array);

• User must ensure thread safety

Page 33: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

// Modifies the array void CFArrayAppendValue(CFArrayRef array, /*…*/) { __tsan_external_write(array, CALLER_PC, tag); /*…*/ }

// Reads the array CFIndex CFArrayGetCount(CFArrayRef array) { __tsan_external_read(array, CALLER_PC, tag); /*…*/ }

Page 34: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

// Modifies the array void CFArrayAppendValue(CFArrayRef array, /*…*/) { if (is_tsan_present) __tsan_external_write(array, CALLER_PC, tag); /*…*/ }

// Reads the array CFIndex CFArrayGetCount(CFArrayRef array) { if (is_tsan_present) __tsan_external_read(array, CALLER_PC, tag); /*…*/ }

Page 35: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

================== WARNING: ThreadSanitizer: race on a library object Read-only access of CFMutableArray at 0x7b0c00046b30 by thread T2: #0 CFArrayGetCount (CoreFoundation:x86_64) #1 Thread1 main.m:16 (demoapp:x86_64)

Previous modifying access of CFMutableArray at 0x7b0c00046b30 by thread T3: #0 CFArrayAppendValue (CoreFoundation:x86_64) #1 Thread2 main.m:21 (demoapp:x86_64)

Location is heap block of size 40 at 0x7b0c00046b30 allocated by main thread: …

SUMMARY: ThreadSanitizer: race on a library object main.m:16 in Thread1 ==================

Page 36: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

================== WARNING: ThreadSanitizer: race on a library object Read-only access of CFMutableArray at 0x7b0c00046b30 by thread T2: #0 CFArrayGetCount (CoreFoundation:x86_64) #1 Thread1 main.m:16 (demoapp:x86_64)

Previous modifying access of CFMutableArray at 0x7b0c00046b30 by thread T3: #0 CFArrayAppendValue (CoreFoundation:x86_64) #1 Thread2 main.m:21 (demoapp:x86_64)

Location is heap block of size 40 at 0x7b0c00046b30 allocated by main thread: …

SUMMARY: ThreadSanitizer: race on a library object main.m:16 in Thread1 ==================

report description

Page 37: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

================== WARNING: ThreadSanitizer: race on a library object Read-only access of CFMutableArray at 0x7b0c00046b30 by thread T2: #0 CFArrayGetCount (CoreFoundation:x86_64) #1 Thread1 main.m:16 (demoapp:x86_64)

Previous modifying access of CFMutableArray at 0x7b0c00046b30 by thread T3: #0 CFArrayAppendValue (CoreFoundation:x86_64) #1 Thread2 main.m:21 (demoapp:x86_64)

Location is heap block of size 40 at 0x7b0c00046b30 allocated by main thread: …

SUMMARY: ThreadSanitizer: race on a library object main.m:16 in Thread1 ==================

type of the object

report description

Page 38: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

================== WARNING: ThreadSanitizer: race on a library object Read-only access of CFMutableArray at 0x7b0c00046b30 by thread T2: #0 CFArrayGetCount (CoreFoundation:x86_64) #1 Thread1 main.m:16 (demoapp:x86_64)

Previous modifying access of CFMutableArray at 0x7b0c00046b30 by thread T3: #0 CFArrayAppendValue (CoreFoundation:x86_64) #1 Thread2 main.m:21 (demoapp:x86_64)

Location is heap block of size 40 at 0x7b0c00046b30 allocated by main thread: …

SUMMARY: ThreadSanitizer: race on a library object main.m:16 in Thread1 ==================

type of the object

report description

API call

Page 39: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

More Details

Page 40: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

More Details

• Tags to identify the type of the object

Page 41: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

More Details

• Tags to identify the type of the object

• Provide caller PC

Page 42: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

More Details

• Tags to identify the type of the object

• Provide caller PC

• Weak imports

Page 43: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

More Details

• Tags to identify the type of the object

• Provide caller PC

• Weak imports

• Detect ThreadSanitizer at initialization time

Page 44: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

More Details

• Tags to identify the type of the object

• Provide caller PC

• Weak imports

• Detect ThreadSanitizer at initialization time

• Contact me or [email protected] mailing list

Page 45: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

More Details

• Tags to identify the type of the object

• Provide caller PC

• Weak imports

• Detect ThreadSanitizer at initialization time

• Contact me or [email protected] mailing list

• Already used by Foundation, CoreFoundation and Swift

Page 46: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks

If you’re developing a popular library used in multithreaded programs,

consider adopting these APIs!

Page 47: •ThreadSanitizer APIs for External Librariesllvm.org/devmtg/2017-10/slides/Mracek-TSan APIs for... · 2019-10-30 · New: APIs for Libraries • ThreadSanitizer provides callbacks