{'fraction_non_alphanumeric': 0.011670313639679067, 'fraction_numerical': 0.0, 'mean_word_length': 5.264840182648402, 'pattern_counts': {'":': 0, '<': 0, '<?xml version=': 0, '>': 0, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
Simplified semantics and debugging of concurrent programs via targeted race detection

The shared memory paradigm is the de facto standard for programming parallel server and desktop applications. In this paradigm, a program is made up of a collection of threads that cooperate to perform a task and communicate by accessing a shared memory space. In order to exhibit predictable behavior, threads sharing memory must be carefully synchronized in order to avoid leaving shared memory in an inconsistent state. A data race is a common flaw in shared memory concurrent programs which occurs when multiple threads access the same memory location without synchronization. 
Data races lead to insidious bugs that are difficult to find and fix. Modern optimizing compilers and hardware further complicate the situation by exposing memory models that do not guarantee sequentially consistent semantics. In such a setting, a data race can lead to behavior that is unintuitive and difficult to explain. 
Precisely detecting data races at runtime could alleviate these problems. Unfortunately, precise data race detection is prohibitively expensive. This dissertation presents a variety of strategies that can be used to detect only certain races at runtime with very low overhead while still providing simple, strong guarantees to programmers of shared memory, concurrent systems.