1- name : Reusable Thread Sanitizer
1+ name : Reusable Sanitizer
22
33on :
44 workflow_call :
55 inputs :
6+ sanitizer :
7+ required : true
8+ type : string
69 config_hash :
710 required : true
811 type : string
1619 FORCE_COLOR : 1
1720
1821jobs :
19- build-tsan -reusable :
20- name : ' Thread sanitizer'
22+ build-san -reusable :
23+ name : ${{ inputs. sanitizer }}
2124 runs-on : ubuntu-24.04
2225 timeout-minutes : 60
2326 steps :
@@ -30,29 +33,42 @@ jobs:
3033 uses : actions/cache@v4
3134 with :
3235 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 }}
3437 - name : Install dependencies
3538 run : |
3639 sudo ./.github/workflows/posix-deps-apt.sh
37- # Install clang-18
40+ # Install clang
3841 wget https://apt.llvm.org/llvm.sh
3942 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
4857 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"
54- echo "CC=clang" >> "$GITHUB_ENV"
58+ if [ "${SANITIZER}" = "TSan" ]; then
59+ echo "TSAN_OPTIONS=log_path=${GITHUB_WORKSPACE}/san_log suppressions=${GITHUB_WORKSPACE}/Tools/tsan/suppressions${{
60+ fromJSON(inputs.free-threading)
61+ && '_free_threading'
62+ || ''
63+ }}.txt handle_segv=0" >> "$GITHUB_ENV"
64+ echo "CC=clang" >> "$GITHUB_ENV"
65+ else
66+ echo "UBSAN_OPTIONS=log_path=${GITHUB_WORKSPACE}/san_log" >> "$GITHUB_ENV"
67+ echo "CC=clang -fno-sanitize-recover=all" >> "$GITHUB_ENV"
68+ fi
5569 echo "CXX=clang++" >> "$GITHUB_ENV"
70+ env :
71+ SANITIZER : ${{ inputs.sanitizer }}
5672 - name : Add ccache to PATH
5773 run : |
5874 echo "PATH=/usr/lib/ccache:$PATH" >> "$GITHUB_ENV"
@@ -65,30 +81,30 @@ jobs:
6581 run : >-
6682 ./configure
6783 --config-cache
68- --with-thread-sanitizer
84+ ${{ inputs.sanitizer == 'TSan' && ' --with-thread-sanitizer' || '--with-undefined-behavior-sanitizer' }}
6985 --with-pydebug
7086 ${{ fromJSON(inputs.free-threading) && '--disable-gil' || '' }}
7187 - name : Build CPython
7288 run : make -j4
7389 - name : Display build info
7490 run : make pythoninfo
7591 - name : Tests
76- run : ./python -m test --tsan -j4
92+ run : ./python -m test ${{ inputs.sanitizer == 'TSan' && ' --tsan' || '' }} -j4
7793 - name : Parallel tests
7894 if : fromJSON(inputs.free-threading)
7995 run : ./python -m test --tsan-parallel --parallel-threads=4 -j4
80- - name : Display TSAN logs
96+ - name : Display logs
8197 if : always()
82- run : find "${GITHUB_WORKSPACE}" -name 'tsan_log .*' | xargs head -n 1000
83- - name : Archive TSAN logs
98+ run : find "${GITHUB_WORKSPACE}" -name 'san_log .*' | xargs head -n 1000
99+ - name : Archive logs
84100 if : always()
85101 uses : actions/upload-artifact@v4
86102 with :
87103 name : >-
88- tsan -logs-${{
104+ ${{ inputs.sanitizer }} -logs-${{
89105 fromJSON(inputs.free-threading)
90106 && 'free-threading'
91107 || 'default'
92108 }}
93- path : tsan_log .*
109+ path : san_log .*
94110 if-no-files-found : ignore
0 commit comments