-
Notifications
You must be signed in to change notification settings - Fork 76
/
script
executable file
·160 lines (124 loc) · 5.39 KB
/
script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#!/bin/sh
#**************************************************************************
#* *
#* OCaml *
#* *
#* Damien Doligez, Xavier Leroy, projet Gallium, INRIA Paris *
#* *
#* Copyright 2018 Institut National de Recherche en Informatique et *
#* en Automatique. *
#* *
#* All rights reserved. This file is distributed under the terms of *
#* the GNU Lesser General Public License version 2.1, with the *
#* special exception on linking described in the file LICENSE. *
#* *
#**************************************************************************
# This script is run on Inria's continuous-integration servers to recompile
# from scratch, adding more run-time checks ("sanitizers") to the C code,
# and run the test suite.
# In this context, it is necessary to skip a few tests whose behaviour
# is modified by the instrumentation:
export OCAMLTEST_SKIP_TESTS="tests/afl-instrumentation/afltest.ml \
tests/afl-instrumentation/afl-fuzz-test.ml \
tests/runtime-errors/stackoverflow.ml"
jobs=-j8
make=make
#########################################################################
# Print each command before its execution
set -x
# stop on error
set -e
# Tell gcc to use only ASCII in its diagnostic outputs.
export LC_ALL=C
# How to run the test suite
if test -n "$jobs" && test -x /usr/bin/parallel; then
export PARALLEL="$jobs $PARALLEL"
run_testsuite="$make -C testsuite parallel"
else
run_testsuite="$make -C testsuite all"
fi
# A tool that makes error backtraces nicer
# Need to pick the one that matches clang-14 and is named "llvm-symbolizer"
# (/usr/bin/llvm-symbolizer-14 doesn't work, that would be too easy)
export ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-14/bin/llvm-symbolizer
export TSAN_SYMBOLIZER_PATH="$ASAN_SYMBOLIZER_PATH"
#########################################################################
echo "======== clang 14, address sanitizer, UB sanitizer =========="
git clean -q -f -d -x
# # Use clang 14
# These are the undefined behaviors we want to check
# Others occur on purpose e.g. signed arithmetic overflow
ubsan="\
bool,\
builtin,\
bounds,\
enum,\
nonnull-attribute,\
nullability,\
object-size,\
pointer-overflow,\
returns-nonnull-attribute,\
shift-exponent,\
unreachable"
# Select address sanitizer and UB sanitizer, with trap-on-error behavior
sanitizers="-fsanitize=address -fsanitize-trap=$ubsan"
# Don't optimize too much to get better backtraces of errors
./configure \
CC=clang-14 \
CFLAGS="-O1 -fno-omit-frame-pointer $sanitizers" \
--disable-stdlib-manpages --enable-dependency-generation
# Build the system. We want to check for memory leaks, hence
# 1- force ocamlrun to free memory before exiting
# 2- add an exception for ocamlyacc, which doesn't free memory
#OCAMLRUNPARAM="c=1" \
#LSAN_OPTIONS="suppressions=$(pwd)/tools/ci/inria/sanitizers/lsan-suppr.txt" \
#make $jobs
# TEMPORARY: cleanup-at-exit mode is broken in 5.0, so turn off leak
# detection entirely
ASAN_OPTIONS="detect_leaks=0,use_sigaltstack=0" make $jobs
# Run the testsuite.
# We deactivate leak detection for two reasons:
# - The suppressed leak detections related to ocamlyacc mess up the
# output of the tests and are reported as failures by ocamltest.
# - The Ocaml runtime does not free the memory when a fatal error
# occurs.
# We already use sigaltstack for signal handling. Our use might
# interact with ASAN's. Hence, we tell ASAN not to use it.
ASAN_OPTIONS="detect_leaks=0,use_sigaltstack=0" $run_testsuite
#########################################################################
# Run the testsuite with ThreadSanitizer support (--enable-tsan) enabled.
# Initially intended to detect data races in OCaml programs and C stubs, it has
# proved effective at also detecting races in the runtime (see #11040).
echo "======== clang 14, thread sanitizer =========="
git clean -q -f -d -x
./configure \
CC=clang-14 \
--enable-tsan \
CFLAGS="-DTSAN_INSTRUMENT_ALL" \
--disable-stdlib-manpages --enable-dependency-generation
# Build the system
make $jobs
# Run the testsuite.
TSAN_OPTIONS="" $run_testsuite
#########################################################################
# This is a failed attempt at using the memory sanitizer
# (to detect reads from uninitialized memory).
# Some alarms are reported that look like false positive
# and are impossible to debug.
# echo "======== clang 6.0, memory sanitizer =========="
# git clean -q -f -d -x
# # Use clang 6.0
# # Memory sanitizer doesn't like the static data generated by ocamlopt,
# # hence build bytecode only
# # Select memory sanitizer
# # Don't optimize at all to get better backtraces of errors
# ./configure \
# CC=clang-9 \
# CFLAGS="-O0 -g -fno-omit-frame-pointer -fsanitize=memory" \
# --disable-native-compiler
# # A tool that makes error backtraces nicer
# # Need to pick the one that matches clang-6.0
# export MSAN_SYMBOLIZER_PATH=/usr/lib/llvm-6.0/bin/llvm-symbolizer
# # Build the system (bytecode only) and test
# make $jobs
# $run_testsuite