1fdb6b69dSkamil# Copyright (c) 2018 The NetBSD Foundation, Inc. 2fdb6b69dSkamil# All rights reserved. 3fdb6b69dSkamil# 4fdb6b69dSkamil# This code is derived from software contributed to The NetBSD Foundation 5fdb6b69dSkamil# by Yang Zheng. 6fdb6b69dSkamil# 7fdb6b69dSkamil# Redistribution and use in source and binary forms, with or without 8fdb6b69dSkamil# modification, are permitted provided that the following conditions 9fdb6b69dSkamil# are met: 10fdb6b69dSkamil# 1. Redistributions of source code must retain the above copyright 11fdb6b69dSkamil# notice, this list of conditions and the following disclaimer. 12fdb6b69dSkamil# 2. Redistributions in binary form must reproduce the above copyright 13fdb6b69dSkamil# notice, this list of conditions and the following disclaimer in the 14fdb6b69dSkamil# documentation and/or other materials provided with the distribution. 15fdb6b69dSkamil# 16fdb6b69dSkamil# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17fdb6b69dSkamil# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18fdb6b69dSkamil# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19fdb6b69dSkamil# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20fdb6b69dSkamil# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21fdb6b69dSkamil# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22fdb6b69dSkamil# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23fdb6b69dSkamil# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24fdb6b69dSkamil# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25fdb6b69dSkamil# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26fdb6b69dSkamil# POSSIBILITY OF SUCH DAMAGE. 27fdb6b69dSkamil# 28fdb6b69dSkamil 29b5b1c9c7Smartintsan_available_archs() 30fdb6b69dSkamil{ 31b5b1c9c7Smartin atf_set "require.arch" "x86_64" 32fdb6b69dSkamil} 33fdb6b69dSkamil 34fdb6b69dSkamilatf_test_case data_race 35fdb6b69dSkamildata_race_head() { 36fdb6b69dSkamil atf_set "descr" "Test thread sanitizer for data race condition" 37fdb6b69dSkamil atf_set "require.progs" "cc paxctl" 38b5b1c9c7Smartin tsan_available_archs 39fdb6b69dSkamil} 40fdb6b69dSkamil 41fdb6b69dSkamilatf_test_case data_race_profile 42fdb6b69dSkamildata_race_profile_head() { 43fdb6b69dSkamil atf_set "descr" "Test thread sanitizer for data race with profiling option" 44fdb6b69dSkamil atf_set "require.progs" "cc paxctl" 45b5b1c9c7Smartin tsan_available_archs 46fdb6b69dSkamil} 47fdb6b69dSkamilatf_test_case data_race_pic 48fdb6b69dSkamildata_race_pic_head() { 49fdb6b69dSkamil atf_set "descr" "Test thread sanitizer for data race with position independent code (PIC) flag" 50fdb6b69dSkamil atf_set "require.progs" "cc paxctl" 51b5b1c9c7Smartin tsan_available_archs 52fdb6b69dSkamil} 53fdb6b69dSkamilatf_test_case data_race_pie 54fdb6b69dSkamildata_race_pie_head() { 55fdb6b69dSkamil atf_set "descr" "Test thread sanitizer for data race with position independent execution (PIE) flag" 56fdb6b69dSkamil atf_set "require.progs" "cc paxctl" 57b5b1c9c7Smartin tsan_available_archs 58fdb6b69dSkamil} 59fdb6b69dSkamil 60fdb6b69dSkamildata_race_body(){ 61fdb6b69dSkamil cat > test.c << EOF 62fdb6b69dSkamil#include <pthread.h> 63fdb6b69dSkamilint GlobalData; pthread_barrier_t barrier; 64fdb6b69dSkamilvoid *Thread(void *a) { pthread_barrier_wait(&barrier); GlobalData = 42; return 0; } 65fdb6b69dSkamilint main() { 66fdb6b69dSkamil pthread_t t; 67fdb6b69dSkamil pthread_barrier_init(&barrier, NULL, 2); 68fdb6b69dSkamil pthread_create(&t, NULL, Thread, NULL); 69fdb6b69dSkamil pthread_barrier_wait(&barrier); 70fdb6b69dSkamil GlobalData = 43; 71fdb6b69dSkamil pthread_join(t, NULL); 72fdb6b69dSkamil return 0; 73fdb6b69dSkamil} 74fdb6b69dSkamilEOF 75fdb6b69dSkamil 76fdb6b69dSkamil cc -fsanitize=thread -o test test.c 77fdb6b69dSkamil paxctl +a test 78fdb6b69dSkamil atf_check -s ignore -o ignore -e match:"WARNING: ThreadSanitizer: data race " ./test 79fdb6b69dSkamil} 80fdb6b69dSkamil 81fdb6b69dSkamildata_race_profile_body(){ 82e5de4f80Sgson atf_expect_fail "PR toolchain/55760" 83fdb6b69dSkamil cat > test.c << EOF 84fdb6b69dSkamil#include <pthread.h> 85fdb6b69dSkamilint GlobalData; pthread_barrier_t barrier; 86fdb6b69dSkamilvoid *Thread(void *a) { pthread_barrier_wait(&barrier); GlobalData = 42; return 0; } 87fdb6b69dSkamilint main() { 88fdb6b69dSkamil pthread_t t; 89fdb6b69dSkamil pthread_barrier_init(&barrier, NULL, 2); 90fdb6b69dSkamil pthread_create(&t, NULL, Thread, NULL); 91fdb6b69dSkamil pthread_barrier_wait(&barrier); 92fdb6b69dSkamil GlobalData = 43; 93fdb6b69dSkamil pthread_join(t, NULL); 94fdb6b69dSkamil return 0; 95fdb6b69dSkamil} 96fdb6b69dSkamilEOF 97fdb6b69dSkamil 98*d3d203ebSskrll cc -fsanitize=thread -static -o test -pg test.c 99fdb6b69dSkamil paxctl +a test 100fdb6b69dSkamil atf_check -s ignore -o ignore -e match:"WARNING: ThreadSanitizer: data race " ./test 101fdb6b69dSkamil} 102fdb6b69dSkamil 103fdb6b69dSkamildata_race_pic_body(){ 104fdb6b69dSkamil cat > test.c << EOF 105fdb6b69dSkamil#include <stdio.h> 106fdb6b69dSkamil#include <stdlib.h> 107fdb6b69dSkamilint help(int); 108fdb6b69dSkamilint main(int argc, char **argv) {return help(argc);} 109fdb6b69dSkamilEOF 110fdb6b69dSkamil 111fdb6b69dSkamil cat > pic.c << EOF 112fdb6b69dSkamil#include <pthread.h> 113fdb6b69dSkamilint GlobalData; pthread_barrier_t barrier; 114fdb6b69dSkamilvoid *Thread(void *a) { pthread_barrier_wait(&barrier); GlobalData = 42; return 0; } 115fdb6b69dSkamilint help(int argc) { 116fdb6b69dSkamil pthread_t t; 117fdb6b69dSkamil pthread_barrier_init(&barrier, NULL, 2); 118fdb6b69dSkamil pthread_create(&t, NULL, Thread, NULL); 119fdb6b69dSkamil pthread_barrier_wait(&barrier); 120fdb6b69dSkamil GlobalData = 43; 121fdb6b69dSkamil pthread_join(t, NULL); 122fdb6b69dSkamil return 0; 123fdb6b69dSkamil} 124fdb6b69dSkamilEOF 125fdb6b69dSkamil 126fdb6b69dSkamil cc -fsanitize=thread -fPIC -shared -o libtest.so pic.c 127fdb6b69dSkamil cc -o test test.c -fsanitize=thread -L. -ltest 128fdb6b69dSkamil paxctl +a test 129fdb6b69dSkamil 130fdb6b69dSkamil export LD_LIBRARY_PATH=. 131fdb6b69dSkamil atf_check -s ignore -o ignore -e match:"WARNING: ThreadSanitizer: data race " ./test 132fdb6b69dSkamil} 133fdb6b69dSkamildata_race_pie_body(){ 134fdb6b69dSkamil 135fdb6b69dSkamil #check whether -pie flag is supported on this architecture 136fdb6b69dSkamil if ! cc -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then 137fdb6b69dSkamil atf_set_skip "cc -pie not supported on this architecture" 138fdb6b69dSkamil fi 139fdb6b69dSkamil cat > test.c << EOF 140fdb6b69dSkamil#include <pthread.h> 141fdb6b69dSkamilint GlobalData; pthread_barrier_t barrier; 142fdb6b69dSkamilvoid *Thread(void *a) { pthread_barrier_wait(&barrier); GlobalData = 42; return 0; } 143fdb6b69dSkamilint main() { 144fdb6b69dSkamil pthread_t t; 145fdb6b69dSkamil pthread_barrier_init(&barrier, NULL, 2); 146fdb6b69dSkamil pthread_create(&t, NULL, Thread, NULL); 147fdb6b69dSkamil pthread_barrier_wait(&barrier); 148fdb6b69dSkamil GlobalData = 43; 149fdb6b69dSkamil pthread_join(t, NULL); 150fdb6b69dSkamil return 0; 151fdb6b69dSkamil} 152fdb6b69dSkamilEOF 153fdb6b69dSkamil 154fdb6b69dSkamil cc -fsanitize=thread -o test -fpie -pie test.c 155fdb6b69dSkamil paxctl +a test 156fdb6b69dSkamil atf_check -s ignore -o ignore -e match:"WARNING: ThreadSanitizer: data race " ./test 157fdb6b69dSkamil} 158fdb6b69dSkamil 159fdb6b69dSkamilatf_init_test_cases() 160fdb6b69dSkamil{ 161fdb6b69dSkamil atf_add_test_case data_race 162fdb6b69dSkamil atf_add_test_case data_race_profile 163fdb6b69dSkamil atf_add_test_case data_race_pie 164fdb6b69dSkamil atf_add_test_case data_race_pic 165fdb6b69dSkamil} 166