diff --git a/.github/workflows/ci-c-util.yml b/.github/workflows/ci-c-util.yml index 9d7fe72..a42a465 100644 --- a/.github/workflows/ci-c-util.yml +++ b/.github/workflows/ci-c-util.yml @@ -42,6 +42,11 @@ on: description: "Additional arguments to meson setup" required: false type: string + sanitizers: + default: "" + description: "Build and test with specified sanitizers" + required: false + type: string source: default: "." description: "File system path to the source directory relative to the workspace" @@ -88,6 +93,7 @@ jobs: CTX_INPUTS_MACOS: ${{ inputs.macos }} CTX_INPUTS_MATRIXMODE: ${{ inputs.matrixmode }} CTX_INPUTS_MESONARGS: ${{ inputs.mesonargs }} + CTX_INPUTS_SANITIZERS: ${{ inputs.sanitizers }} CTX_INPUTS_SOURCE: ${{ inputs.source }} CTX_INPUTS_VALGRIND: ${{ inputs.valgrind }} CTX_INPUTS_WINDOWS: ${{ inputs.windows }} diff --git a/docker-bake.hcl b/docker-bake.hcl index d2625da..7adedd0 100644 --- a/docker-bake.hcl +++ b/docker-bake.hcl @@ -116,6 +116,7 @@ target "virtual-ci-c-util" { "cargo", "clang", "clang-devel", + "compiler-rt", "coreutils", "curl", "dbus-daemon", diff --git a/src/script/ci-c-util-job.sh b/src/script/ci-c-util-job.sh index d87464f..1ab77e2 100755 --- a/src/script/ci-c-util-job.sh +++ b/src/script/ci-c-util-job.sh @@ -19,6 +19,7 @@ CAB_JOB="none" CAB_M32="false" CAB_MESONARGS="" CAB_NL=$'\n' +CAB_SANITIZERS="" CAB_SOURCE="." CAB_SOURCE_RAW="." CAB_VALGRIND="false" @@ -44,6 +45,7 @@ abspath() { CAB_JOB=$(jq -r .job < <(printf "%s" "${CTX_MATRIX_JOB}")) CAB_M32=$(jq -r .m32 < <(printf "%s" "${CTX_MATRIX_JOB}")) CAB_MESONARGS=$(jq -r .mesonargs < <(printf "%s" "${CTX_MATRIX_JOB}")) +CAB_SANITIZERS=$(jq -r .sanitizers < <(printf "%s" "${CTX_MATRIX_JOB}")) CAB_SOURCE_RAW=$(jq -r .source < <(printf "%s" "${CTX_MATRIX_JOB}")) CAB_VALGRIND=$(jq -r .valgrind < <(printf "%s" "${CTX_MATRIX_JOB}")) @@ -115,6 +117,15 @@ if [[ ! -z "${CAB_MESONARGS}" ]] ; then CAB_CMD_SETUP+=" ${CAB_MESONARGS[@]}" fi +if [[ ! -z ${CAB_SANITIZERS} ]]; then + CAB_CMD_SETUP+=" -Db_sanitizers=$CAB_SANITIZERS" + + # See: https://github.com/mesonbuild/meson/issues/764 + if [[ $CAB_JOB =~ llvm ]]; then + CAB_CMD_SETUP+=" -Db_lundef=false" + fi +fi + CAB_CMD_BUILD="ninja -v" CAB_CMD_TEST_BASIC="meson test --print-errorlogs" @@ -123,6 +134,14 @@ CAB_CMD_DEFAULT="${CAB_CMD_SETUP} . ${CAB_SOURCE}" CAB_CMD_DEFAULT+="${CAB_NL}${CAB_NL}" CAB_CMD_DEFAULT+="${CAB_CMD_BUILD}" CAB_CMD_DEFAULT+="${CAB_NL}${CAB_NL}" + +if [[ ! -z ${CAB_SANITIZERS} ]]; then + CAB_CMD_DEFAULT+="export ASAN_OPTIONS=strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1" + CAB_CMD_DEFAULT+="${CAB_NL}" + CAB_CMD_DEFAULT+="export UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1" + CAB_CMD_DEFAULT+="${CAB_NL}${CAB_NL}" +fi + CAB_CMD_DEFAULT+="${CAB_CMD_TEST_BASIC}" if [[ ${CAB_VALGRIND} == "true" ]] ; then diff --git a/src/script/ci-c-util-suite.sh b/src/script/ci-c-util-suite.sh index a0cb247..aba64bb 100755 --- a/src/script/ci-c-util-suite.sh +++ b/src/script/ci-c-util-suite.sh @@ -23,6 +23,7 @@ CAB_MACOS="false" CAB_MATRIX_M32=() CAB_MATRIXMODE="false" CAB_MESONARGS="" +CAB_SANITIZERS="" CAB_SOURCE="." CAB_VALGRIND="false" CAB_WINDOWS="false" @@ -70,6 +71,7 @@ if [[ ${CTX_INPUTS_WINDOWS} == "true" ]] ; then fi CAB_MESONARGS=$(jq -cRs . < <(printf "%s" "${CTX_INPUTS_MESONARGS}")) +CAB_SANITIZERS=$(jq -cRs . < <(printf "%s" "${CTX_INPUTS_SANITIZERS}")) CAB_SOURCE=$(jq -cRs . < <(printf "%s" "${CTX_INPUTS_SOURCE}")) CAB_MATRIX_M32=("${CAB_M32}") @@ -88,6 +90,7 @@ for CAB_J in "${CAB_MATRIX_M32[@]}" ; do CAB_JSON+="\"job\":\"${CAB_I}\"" CAB_JSON+=",\"m32\":${CAB_J}" CAB_JSON+=",\"mesonargs\":${CAB_MESONARGS}" + CAB_JSON+=",\"sanitizers\":${CAB_SANITIZERS}" CAB_JSON+=",\"source\":${CAB_SOURCE}" CAB_JSON+=",\"valgrind\":${CAB_VALGRIND}" CAB_JSON+="}," @@ -113,6 +116,7 @@ for CAB_J in "${CAB_MATRIX_M32[@]}" ; do CAB_JSON+="\"job\":\"${CAB_I}\"" CAB_JSON+=",\"m32\":${CAB_J}" CAB_JSON+=",\"mesonargs\":${CAB_MESONARGS}" + CAB_JSON+=",\"sanitizers\":${CAB_SANITIZERS}" CAB_JSON+=",\"source\":${CAB_SOURCE}" CAB_JSON+=",\"valgrind\":${CAB_VALGRIND}" CAB_JSON+="}," @@ -138,6 +142,7 @@ for CAB_J in "${CAB_MATRIX_M32[@]}" ; do CAB_JSON+="\"job\":\"${CAB_I}\"" CAB_JSON+=",\"m32\":${CAB_J}" CAB_JSON+=",\"mesonargs\":${CAB_MESONARGS}" + CAB_JSON+=",\"sanitizers\":${CAB_SANITIZERS}" CAB_JSON+=",\"source\":${CAB_SOURCE}" CAB_JSON+=",\"valgrind\":${CAB_VALGRIND}" CAB_JSON+="},"