xref: /netbsd/tests/usr.bin/cc/t_tsan_data_race.sh (revision d3d203eb)
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