3 # SPDX-License-Identifier: BSD-2-Clause
5 # Copyright (c) 2018-2021 Gavin D. Howard and contributors.
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions are met:
10 # * Redistributions of source code must retain the above copyright notice, this
11 # list of conditions and the following disclaimer.
13 # * Redistributions in binary form must reproduce the above copyright notice,
14 # this list of conditions and the following disclaimer in the documentation
15 # and/or other materials provided with the distribution.
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 # POSSIBILITY OF SUCH DAMAGE.
31 printf 'usage: %s [run_tests] [generate_tests] [test_with_clang] [test_with_gcc] \n' "$script"
32 printf ' [run_sanitizers] [run_valgrind] [run_64_bit] [run_gen_script]\n'
33 printf ' [test_c11] [test_128_bit]\n'
43 printf '*******************\n'
46 printf '*******************\n'
56 _configure_CFLAGS="$1"
62 _configure_configure_flags="$1"
65 _configure_GEN_HOST="$1"
68 _configure_LONG_BIT="$1"
71 if [ "$gen_tests" -eq 0 ]; then
72 _configure_configure_flags="-G $_configure_configure_flags"
75 if [ "$_configure_CC" = "clang" ]; then
76 _configure_CFLAGS="$clang_flags $_configure_CFLAGS"
77 elif [ "$_configure_CC" = "gcc" ]; then
78 _configure_CFLAGS="$gcc_flags $_configure_CFLAGS"
81 _configure_header=$(printf 'Running ./configure.sh %s ...' "$_configure_configure_flags")
82 _configure_header=$(printf "$_configure_header\n CC=\"%s\"\n" "$_configure_CC")
83 _configure_header=$(printf "$_configure_header\n CFLAGS=\"%s\"\n" "$_configure_CFLAGS")
84 _configure_header=$(printf "$_configure_header\n LONG_BIT=%s" "$_configure_LONG_BIT")
85 _configure_header=$(printf "$_configure_header\n GEN_HOST=%s" "$_configure_GEN_HOST")
87 header "$_configure_header"
88 CFLAGS="$_configure_CFLAGS" CC="$_configure_CC" GEN_HOST="$_configure_GEN_HOST" \
89 LONG_BIT="$_configure_LONG_BIT" ./configure.sh $_configure_configure_flags > /dev/null
100 _build_configure_flags="$1"
109 configure "$_build_CFLAGS" "$_build_CC" "$_build_configure_flags" "$_build_GEN_HOST" "$_build_LONG_BIT"
111 _build_header=$(printf 'Building...\n CC=%s' "$_build_CC")
112 _build_header=$(printf "$_build_header\n CFLAGS=\"%s\"" "$_build_CFLAGS")
113 _build_header=$(printf "$_build_header\n LONG_BIT=%s" "$_build_LONG_BIT")
114 _build_header=$(printf "$_build_header\n GEN_HOST=%s" "$_build_GEN_HOST")
116 header "$_build_header"
118 do_make > /dev/null 2> "$scriptdir/.test.txt"
120 if [ -s "$scriptdir/.test.txt" ]; then
121 printf '%s generated warning(s):\n' "$_build_CC"
123 cat "$scriptdir/.test.txt"
130 header "Running tests"
132 if [ "$#" -gt 0 ]; then
141 _runconfigtests_CFLAGS="$1"
144 _runconfigtests_CC="$1"
147 _runconfigtests_configure_flags="$1"
150 _runconfigtests_GEN_HOST="$1"
153 _runconfigtests_LONG_BIT="$1"
156 _runconfigtests_run_tests="$1"
159 if [ "$_runconfigtests_run_tests" -ne 0 ]; then
160 _runconfigtests_header=$(printf 'Running tests with configure flags')
162 _runconfigtests_header=$(printf 'Building with configure flags')
165 _runconfigtests_header=$(printf "$_runconfigtests_header \"%s\" ...\n" "$_runconfigtests_configure_flags")
166 _runconfigtests_header=$(printf "$_runconfigtests_header\n CC=%s\n" "$_runconfigseries_CC")
167 _runconfigtests_header=$(printf "$_runconfigtests_header\n CFLAGS=\"%s\"" "$_runconfigseries_CFLAGS")
168 _runconfigtests_header=$(printf "$_runconfigtests_header\n LONG_BIT=%s" "$_runconfigtests_LONG_BIT")
169 _runconfigtests_header=$(printf "$_runconfigtests_header\n GEN_HOST=%s" "$_runconfigtests_GEN_HOST")
171 header "$_runconfigtests_header"
173 build "$_runconfigtests_CFLAGS" "$_runconfigtests_CC" \
174 "$_runconfigtests_configure_flags" "$_runconfigtests_GEN_HOST" \
175 "$_runconfigtests_LONG_BIT"
177 if [ "$_runconfigtests_run_tests" -ne 0 ]; then
183 build "$_runconfigtests_CFLAGS" "$_runconfigtests_CC" \
184 "$_runconfigtests_configure_flags -b" "$_runconfigtests_GEN_HOST" \
185 "$_runconfigtests_LONG_BIT"
187 if [ "$_runconfigtests_run_tests" -ne 0 ]; then
193 build "$_runconfigtests_CFLAGS" "$_runconfigtests_CC" \
194 "$_runconfigtests_configure_flags -d" "$_runconfigtests_GEN_HOST" \
195 "$_runconfigtests_LONG_BIT"
197 if [ "$_runconfigtests_run_tests" -ne 0 ]; then
206 _runconfigseries_CFLAGS="$1"
209 _runconfigseries_CC="$1"
212 _runconfigseries_configure_flags="$1"
215 _runconfigseries_run_tests="$1"
218 if [ "$run_64_bit" -ne 0 ]; then
220 if [ "$test_128_bit" -ne 0 ]; then
221 runconfigtests "$_runconfigseries_CFLAGS" "$_runconfigseries_CC" \
222 "$_runconfigseries_configure_flags" 1 64 "$_runconfigseries_run_tests"
225 if [ "$run_gen_script" -ne 0 ]; then
226 runconfigtests "$_runconfigseries_CFLAGS" "$_runconfigseries_CC" \
227 "$_runconfigseries_configure_flags" 0 64 "$_runconfigseries_run_tests"
230 runconfigtests "$_runconfigseries_CFLAGS -DBC_RAND_BUILTIN=0" "$_runconfigseries_CC" \
231 "$_runconfigseries_configure_flags" 1 64 "$_runconfigseries_run_tests"
235 runconfigtests "$_runconfigseries_CFLAGS" "$_runconfigseries_CC" \
236 "$_runconfigseries_configure_flags" 1 32 "$_runconfigseries_run_tests"
238 if [ "$run_gen_script" -ne 0 ]; then
239 runconfigtests "$_runconfigseries_CFLAGS" "$_runconfigseries_CC" \
240 "$_runconfigseries_configure_flags" 0 32 "$_runconfigseries_run_tests"
246 _runtestseries_CFLAGS="$1"
249 _runtestseries_CC="$1"
252 _runtestseries_configure_flags="$1"
255 _runtestseries_run_tests="$1"
258 _runtestseries_flags="E H N P EH EN EP HN HP NP EHN EHP ENP HNP EHNP"
260 runconfigseries "$_runtestseries_CFLAGS" "$_runtestseries_CC" \
261 "$_runtestseries_configure_flags" "$_runtestseries_run_tests"
263 for f in $_runtestseries_flags; do
264 runconfigseries "$_runtestseries_CFLAGS" "$_runtestseries_CC" \
265 "$_runtestseries_configure_flags -$f" "$_runtestseries_run_tests"
271 _runlibtests_CFLAGS="$1"
277 _runlibtests_configure_flags="$1"
280 _runlibtests_run_tests="$1"
283 _runlibtests_configure_flags="$_runlibtests_configure_flags -a"
285 build "$_runlibtests_CFLAGS" "$_runlibtests_CC" "$_runlibtests_configure_flags" 1 64
287 if [ "$_runlibtests_run_tests" -ne 0 ]; then
291 build "$_runlibtests_CFLAGS" "$_runlibtests_CC" "$_runlibtests_configure_flags" 1 32
293 if [ "$_runlibtests_run_tests" -ne 0 ]; then
300 _runtests_CFLAGS="$1"
306 _runtests_configure_flags="$1"
309 _runtests_run_tests="$1"
312 runtestseries "-std=c99 $_runtests_CFLAGS" "$_runtests_CC" "$_runtests_configure_flags" "$_runtests_run_tests"
314 if [ "$test_c11" -ne 0 ]; then
315 runtestseries "-std=c11 $_runtests_CFLAGS" "$_runtests_CC" "$_runtests_configure_flags" "$_runtests_run_tests"
321 header "Running Karatsuba tests"
322 do_make karatsuba_test
327 header "Running valgrind"
329 if [ "$run_64_bit" -ne 0 ]; then
335 build "$debug" "gcc" "-O0 -gv" "1" "$_vg_bits"
340 build "$debug" "gcc" "-O0 -gvb" "1" "$_vg_bits"
345 build "$debug" "gcc" "-O0 -gvd" "1" "$_vg_bits"
356 _debug_run_tests="$1"
359 runtests "$debug" "$_debug_CC" "-g" "$_debug_run_tests"
361 if [ "$_debug_CC" = "clang" -a "$run_sanitizers" -ne 0 ]; then
362 runtests "$debug -fsanitize=undefined" "$_debug_CC" "-g" "$_debug_run_tests"
365 runlibtests "$debug" "$_debug_CC" "-g" "$_debug_run_tests"
367 if [ "$_debug_CC" = "clang" -a "$run_sanitizers" -ne 0 ]; then
368 runlibtests "$debug -fsanitize=undefined" "$_debug_CC" "-g" "$_debug_run_tests"
377 _release_run_tests="$1"
380 runtests "$release" "$_release_CC" "-O3" "$_release_run_tests"
382 runlibtests "$release" "$_release_CC" "-O3" "$_release_run_tests"
390 _reldebug_run_tests="$1"
393 runtests "$debug" "$_reldebug_CC" "-gO3" "$_reldebug_run_tests"
395 if [ "$_reldebug_CC" = "clang" -a "$run_sanitizers" -ne 0 ]; then
396 runtests "$debug -fsanitize=address" "$_reldebug_CC" "-gO3" "$_reldebug_run_tests"
397 runtests "$debug -fsanitize=memory" "$_reldebug_CC" "-gO3" "$_reldebug_run_tests"
400 runlibtests "$debug" "$_reldebug_CC" "-gO3" "$_reldebug_run_tests"
402 if [ "$_reldebug_CC" = "clang" -a "$run_sanitizers" -ne 0 ]; then
403 runlibtests "$debug -fsanitize=address" "$_reldebug_CC" "-gO3" "$_reldebug_run_tests"
404 runlibtests "$debug -fsanitize=memory" "$_reldebug_CC" "-gO3" "$_reldebug_run_tests"
413 _minsize_run_tests="$1"
416 runtests "$release" "$_minsize_CC" "-Os" "$_minsize_run_tests"
418 runlibtests "$release" "$_minsize_CC" "-Os" "$_minsize_run_tests"
426 _build_set_run_tests="$1"
429 debug "$_build_set_CC" "$_build_set_run_tests"
430 release "$_build_set_CC" "$_build_set_run_tests"
431 reldebug "$_build_set_CC" "$_build_set_run_tests"
432 minsize "$_build_set_CC" "$_build_set_run_tests"
435 clang_flags="-Weverything -Wno-padded -Wno-switch-enum -Wno-format-nonliteral"
436 clang_flags="$clang_flags -Wno-cast-align -Wno-missing-noreturn -Wno-disabled-macro-expansion"
437 clang_flags="$clang_flags -Wno-unreachable-code -Wno-unreachable-code-return"
438 clang_flags="$clang_flags -Wno-implicit-fallthrough"
439 gcc_flags="-Wno-maybe-uninitialized -Wno-clobbered"
441 cflags="-Wall -Wextra -Werror -pedantic -Wno-conditional-uninitialized"
443 debug="$cflags -fno-omit-frame-pointer"
444 release="$cflags -DNDEBUG"
449 scriptdir=$(dirname "$script")
451 if [ "$#" -gt 0 ]; then
458 if [ "$#" -gt 0 ]; then
465 if [ "$#" -gt 0 ]; then
472 if [ "$#" -gt 0 ]; then
479 if [ "$#" -gt 0 ]; then
486 if [ "$#" -gt 0 ]; then
493 if [ "$#" -gt 0 ]; then
500 if [ "$#" -gt 0 ]; then
507 if [ "$#" -gt 0 ]; then
514 if [ "$#" -gt 0 ]; then
521 if [ "$run_64_bit" -ne 0 ]; then
529 if [ "$test_with_clang" -ne 0 ]; then
531 elif [ "$test_with_gcc" -ne 0 ]; then
537 export ASAN_OPTIONS="abort_on_error=1,allocator_may_return_null=1"
538 export UBSAN_OPTIONS="print_stack_trace=1,silence_unsigned_overflow=1"
540 build "$debug" "$defcc" "-g" "1" "$bits"
542 header "Running math library under --standard"
544 printf 'quit\n' | bin/bc -ls
548 if [ "$test_with_clang" -ne 0 ]; then
549 build_set "clang" "$run_tests"
552 if [ "$test_with_gcc" -ne 0 ]; then
553 build_set "gcc" "$run_tests"
556 if [ "$run_tests" -ne 0 ]; then
558 build "$release" "$defcc" "-O3" "1" "$bits"
562 if [ "$run_valgrind" -ne 0 -a "$test_with_gcc" -ne 0 ]; then
567 printf 'Tests successful.\n'
571 command -v afl-gcc > /dev/null 2>&1
576 if [ "$err" -eq 0 ]; then
578 header "Configuring for afl-gcc..."
580 configure "$debug $gcc_flags -DBC_ENABLE_RAND=0" "afl-gcc" "-HNP -gO3" "1" "$bits"
585 printf 'Then run %s/tests/randmath.py and the fuzzer.\n' "$scriptdir"
587 printf 'Then run ASan on the fuzzer test cases with the following build:\n'
589 printf ' CFLAGS="-fsanitize=address -fno-omit-frame-pointer -DBC_ENABLE_RAND=0" ./configure.sh -gO3 -HNPS\n'
592 printf 'Then run the GitHub release script as follows:\n'
594 printf ' <github_release> <version> .gitignore .gitattributes\\\n'
595 printf ' manpage.sh release.sh RELEASE.md tests/afl.py\\\n'
596 printf ' tests/radamsa.sh tests/radamsa.txt tests/randmath.py\\\n'
597 printf ' tests/fuzzing/ tests/bc/scripts/timeconst.bc\n'