1
- name : Reusable Thread Sanitizer
1
+ name : Reusable Sanitizer
2
2
3
3
on :
4
4
workflow_call :
5
5
inputs :
6
+ sanitizer :
7
+ required : true
8
+ type : string
6
9
config_hash :
7
10
required : true
8
11
type : string
16
19
FORCE_COLOR : 1
17
20
18
21
jobs :
19
- build-tsan -reusable :
20
- name : ' Thread sanitizer'
22
+ build-san -reusable :
23
+ name : ${{ inputs. sanitizer }}
21
24
runs-on : ubuntu-24.04
22
25
timeout-minutes : 60
23
26
steps :
@@ -30,29 +33,42 @@ jobs:
30
33
uses : actions/cache@v4
31
34
with :
32
35
path : config.cache
33
- key : ${{ github.job }}-${{ env.IMAGE_OS_VERSION }}-${{ inputs.config_hash }}
36
+ key : ${{ github.job }}-${{ env.IMAGE_OS_VERSION }}-${{ inputs.sanitizer }}-${{ inputs. config_hash }}
34
37
- name : Install dependencies
35
38
run : |
36
39
sudo ./.github/workflows/posix-deps-apt.sh
37
- # Install clang-18
40
+ # Install clang
38
41
wget https://apt.llvm.org/llvm.sh
39
42
chmod +x llvm.sh
40
- sudo ./llvm.sh 17 # gh-121946: llvm-18 package is temporarily broken
41
- sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-17 100
42
- sudo update-alternatives --set clang /usr/bin/clang-17
43
- sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-17 100
44
- sudo update-alternatives --set clang++ /usr/bin/clang++-17
45
- # Reduce ASLR to avoid TSAN crashing
46
- sudo sysctl -w vm.mmap_rnd_bits=28
47
- - name : TSAN option setup
43
+
44
+ if [ "${SANITIZER}" = "TSan" ]; then
45
+ sudo ./llvm.sh 17 # gh-121946: llvm-18 package is temporarily broken
46
+ sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-17 100
47
+ sudo update-alternatives --set clang /usr/bin/clang-17
48
+ sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-17 100
49
+ sudo update-alternatives --set clang++ /usr/bin/clang++-17
50
+ # Reduce ASLR to avoid TSan crashing
51
+ sudo sysctl -w vm.mmap_rnd_bits=28
52
+ else
53
+ sudo ./llvm.sh 20
54
+ fi
55
+
56
+ - name : Sanitizer option setup
48
57
run : |
49
- echo "TSAN_OPTIONS=log_path=${GITHUB_WORKSPACE}/tsan_log suppressions=${GITHUB_WORKSPACE}/Tools/tsan/suppressions${{
50
- fromJSON(inputs.free-threading)
51
- && '_free_threading'
52
- || ''
53
- }}.txt handle_segv=0" >> "$GITHUB_ENV"
58
+ if [ "${SANITIZER}" = "TSan" ]; then
59
+ echo "TSAN_OPTIONS=${SAN_LOG_OPTION} suppressions=${GITHUB_WORKSPACE}/Tools/tsan/suppressions${{
60
+ fromJSON(inputs.free-threading)
61
+ && '_free_threading'
62
+ || ''
63
+ }}.txt handle_segv=0" >> "$GITHUB_ENV"
64
+ else
65
+ echo "UBSAN_OPTIONS=${SAN_LOG_OPTION}" >> "$GITHUB_ENV"
66
+ fi
54
67
echo "CC=clang" >> "$GITHUB_ENV"
55
68
echo "CXX=clang++" >> "$GITHUB_ENV"
69
+ env :
70
+ SANITIZER : ${{ inputs.sanitizer }}
71
+ SAN_LOG_OPTION : log_path=${{ github.workspace }}/san_log
56
72
- name : Add ccache to PATH
57
73
run : |
58
74
echo "PATH=/usr/lib/ccache:$PATH" >> "$GITHUB_ENV"
@@ -65,30 +81,36 @@ jobs:
65
81
run : >-
66
82
./configure
67
83
--config-cache
68
- --with-thread-sanitizer
84
+ ${{
85
+ inputs.sanitizer == 'TSan'
86
+ && '--with-thread-sanitizer'
87
+ || '--with-undefined-behavior-sanitizer'
88
+ }}
69
89
--with-pydebug
70
90
${{ fromJSON(inputs.free-threading) && '--disable-gil' || '' }}
71
91
- name : Build CPython
72
92
run : make -j4
73
93
- name : Display build info
74
94
run : make pythoninfo
75
95
- name : Tests
76
- run : ./python -m test --tsan -j4
96
+ run : ./python -m test ${{ inputs.sanitizer == 'TSan' && ' --tsan' || '' }} -j4
77
97
- name : Parallel tests
78
- if : fromJSON(inputs.free-threading)
98
+ if : >-
99
+ inputs.sanitizer == 'TSan'
100
+ && fromJSON(inputs.free-threading)
79
101
run : ./python -m test --tsan-parallel --parallel-threads=4 -j4
80
- - name : Display TSAN logs
102
+ - name : Display logs
81
103
if : always()
82
- run : find "${GITHUB_WORKSPACE}" -name 'tsan_log .*' | xargs head -n 1000
83
- - name : Archive TSAN logs
104
+ run : find "${GITHUB_WORKSPACE}" -name 'san_log .*' | xargs head -n 1000
105
+ - name : Archive logs
84
106
if : always()
85
107
uses : actions/upload-artifact@v4
86
108
with :
87
109
name : >-
88
- tsan -logs-${{
110
+ ${{ inputs.sanitizer }} -logs-${{
89
111
fromJSON(inputs.free-threading)
90
112
&& 'free-threading'
91
113
|| 'default'
92
114
}}
93
- path : tsan_log .*
115
+ path : san_log .*
94
116
if-no-files-found : ignore
0 commit comments