* [PATCH] build: Use meson b_sanitize option for sanitizers
@ 2026-06-23 15:46 Nabih Estefan
2026-06-23 15:56 ` Daniel P. Berrangé
2026-06-23 16:53 ` Richard Henderson
0 siblings, 2 replies; 5+ messages in thread
From: Nabih Estefan @ 2026-06-23 15:46 UTC (permalink / raw)
To: pbonzini
Cc: alex.bennee, laurent, deller, pierrick.bouvier, marcandre.lureau,
berrange, philmd, zhao1.liu, qemu-devel, Nabih Estefan
Refactor sanitizer configuration to use Meson's built-in `b_sanitize`
option instead of manually adding flags to `qemu_cflags` and `qemu_ldflags`.
This ensures that sanitizer flags are correctly passed to both C and Rust
targets, fixing linker errors when Rust and UBSan are both enabled.
Explicitly parse `--enable-ubsan`, `--enable-asan`, and `--enable-tsan`
in `configure` and map them to `-Db_sanitize` meson option. Remove
redundant custom options from `meson_options.txt`.
How to test:
`./configure --target-list=aarch64-softmmu --enable-ubsan --enable-rust
&& make -j all`
Before this change it will fail at the end of make, since the linker will have
different flags, after this change it will link properly
Signed-off-by: Nabih Estefan <nabihestefan@google.com>
---
configure | 35 ++++++++++++++++++
linux-user/meson.build | 6 +++-
meson.build | 55 +++++++++++++----------------
meson_options.txt | 7 +---
scripts/meson-buildoptions.sh | 9 -----
tests/functional/x86_64/meson.build | 2 +-
tests/unit/meson.build | 2 +-
7 files changed, 67 insertions(+), 49 deletions(-)
diff --git a/configure b/configure
index d8bc10060e..579df2f2c8 100755
--- a/configure
+++ b/configure
@@ -281,6 +281,9 @@ cfi="false"
# which requires knowing whether --static is enabled.
pie=""
static="no"
+ubsan="false"
+asan="false"
+tsan="false"
# Preferred compiler:
# ${CC} (if set)
@@ -746,6 +749,18 @@ for opt do
;;
--wasm64-32bit-address-limit)
;;
+ --enable-ubsan) ubsan="true"
+ ;;
+ --disable-ubsan) ubsan="false"
+ ;;
+ --enable-asan) asan="true"
+ ;;
+ --disable-asan) asan="false"
+ ;;
+ --enable-tsan) tsan="true"
+ ;;
+ --disable-tsan) tsan="false"
+ ;;
# everything else has the same name in configure and meson
--*) meson_option_parse "$opt" "$optarg"
;;
@@ -1939,6 +1954,26 @@ if test "$skip_meson" = no; then
# QEMU options
test "$rust" != "disabled" && meson_option_add "-Drust=$rust"
+
+ # Translate asan/ubsan/tsan to b_sanitize
+ sanitizers=""
+ if test "$ubsan" = "true" && test "$asan" = "true"; then
+ sanitizers="undefined,address"
+ elif test "$ubsan" = "true"; then
+ sanitizers="undefined"
+ elif test "$asan" = "true"; then
+ sanitizers="address"
+ fi
+ if test "$tsan" = "true"; then
+ if test -n "$sanitizers"; then
+ error_exit "TSAN is not supported with other sanitizers"
+ fi
+ sanitizers="thread"
+ fi
+ if test -n "$sanitizers"; then
+ meson_option_add "-Db_sanitize=$sanitizers"
+ fi
+
test "$cfi" != false && meson_option_add "-Dcfi=$cfi" "-Db_lto=$cfi"
test "$docs" != auto && meson_option_add "-Ddocs=$docs"
test -n "${LIB_FUZZING_ENGINE+xxx}" && meson_option_add "-Dfuzzing_engine=$LIB_FUZZING_ENGINE"
diff --git a/linux-user/meson.build b/linux-user/meson.build
index 332847a621..d48887efb6 100644
--- a/linux-user/meson.build
+++ b/linux-user/meson.build
@@ -34,8 +34,12 @@ endif
syscall_nr_generators = {}
+# gen-vdso doesn't play well with sanitizers. It originally didn't get them due
+# to the way we passed sanitizer flags. Now that they're being passed through
+# meson wen need to override it.
gen_vdso_exe = executable('gen-vdso', 'gen-vdso.c',
- native: true, build_by_default: false)
+ native: true, build_by_default: false,
+ override_options: ['b_sanitize=none'])
gen_vdso = generator(gen_vdso_exe, output: '@BASENAME@.c.inc',
arguments: ['-o', '@OUTPUT@', '@EXTRA_ARGS@', '@INPUT@'])
diff --git a/meson.build b/meson.build
index e026851309..417c27002c 100644
--- a/meson.build
+++ b/meson.build
@@ -541,43 +541,35 @@ if get_option('safe_stack') and coroutine_backend != 'ucontext'
error('SafeStack is only supported with the ucontext coroutine backend')
endif
-if get_option('asan')
- if cc.has_argument('-fsanitize=address')
- qemu_cflags = ['-fsanitize=address'] + qemu_cflags
- qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags
- else
- error('Your compiler does not support -fsanitize=address')
- endif
+sanitize = get_option('b_sanitize')
+
+if sanitize.contains('address')
+ # Meson handles -fsanitize=address automatically
endif
-if get_option('ubsan')
+if sanitize.contains('undefined')
# Detect static linking issue with ubsan:
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
- if cc.links('int main(int argc, char **argv) { return argc + 1; }',
- args: [qemu_ldflags, '-fsanitize=undefined'])
- qemu_cflags += ['-fsanitize=undefined']
- qemu_ldflags += ['-fsanitize=undefined']
-
- # Suppress undefined behaviour from function call to mismatched type.
- # In addition, tcg prologue does not emit function type prefix
- # required by function call sanitizer.
- if cc.has_argument('-fno-sanitize=function')
- qemu_cflags += ['-fno-sanitize=function']
- endif
- else
+ if not cc.links('int main(int argc, char **argv) { return argc + 1; }',
+ args: [qemu_ldflags, '-fsanitize=undefined'])
error('Your compiler does not support -fsanitize=undefined')
endif
+
+ # Suppress undefined behaviour from function call to mismatched type.
+ # In addition, tcg prologue does not emit function type prefix
+ # required by function call sanitizer.
+ if cc.has_argument('-fno-sanitize=function')
+ qemu_cflags += ['-fno-sanitize=function']
+ endif
endif
-# Thread sanitizer is, for now, much noisier than the other sanitizers;
-# keep it separate until that is not the case.
-if get_option('tsan')
- if get_option('asan') or get_option('ubsan')
+if sanitize.contains('thread')
+ if sanitize.contains('address') or sanitize.contains('undefined')
error('TSAN is not supported with other sanitizers')
endif
if not cc.has_function('__tsan_create_fiber',
- args: '-fsanitize=thread',
- prefix: '#include <sanitizer/tsan_interface.h>')
+ args: '-fsanitize=thread',
+ prefix: '#include <sanitizer/tsan_interface.h>')
error('Cannot enable TSAN due to missing fiber annotation interface')
endif
tsan_warn_suppress = []
@@ -588,8 +580,7 @@ if get_option('tsan')
if cc.has_argument('-Wno-tsan')
tsan_warn_suppress = ['-Wno-tsan']
endif
- qemu_cflags = ['-fsanitize=thread'] + tsan_warn_suppress + qemu_cflags
- qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
+ qemu_cflags += tsan_warn_suppress
endif
# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
@@ -2482,7 +2473,7 @@ if have_tcg
config_host_data.set('CONFIG_TCG_INTERPRETER', tcg_arch == 'tci')
endif
config_host_data.set('CONFIG_TPM', have_tpm)
-config_host_data.set('CONFIG_TSAN', get_option('tsan'))
+config_host_data.set('CONFIG_TSAN', sanitize.contains('thread'))
config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
config_host_data.set('CONFIG_VDE', vde.found())
config_host_data.set('CONFIG_VHOST', have_vhost)
@@ -2639,7 +2630,7 @@ if rdma.found()
endif
have_asan_fiber = false
-if get_option('asan') and \
+if sanitize.contains('address') and \
not cc.has_function('__sanitizer_start_switch_fiber',
args: '-fsanitize=address',
prefix: '#include <sanitizer/asan_interface.h>')
@@ -4768,7 +4759,9 @@ summary_info += {'memory allocator': get_option('malloc')}
summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
summary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
summary_info += {'gcov': get_option('b_coverage')}
-summary_info += {'thread sanitizer': get_option('tsan')}
+summary_info += {'address sanitizer': sanitize.contains('address')}
+summary_info += {'undefined behavior sanitizer': sanitize.contains('undefined')}
+summary_info += {'thread sanitizer': sanitize.contains('thread')}
summary_info += {'CFI support': get_option('cfi')}
if get_option('cfi')
summary_info += {'CFI debug support': get_option('cfi_debug')}
diff --git a/meson_options.txt b/meson_options.txt
index a07cb47d35..d61c0241cc 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -99,12 +99,7 @@ option('tcg_interpreter', type: 'boolean', value: false,
description: 'TCG with bytecode interpreter (slow)')
option('safe_stack', type: 'boolean', value: false,
description: 'SafeStack Stack Smash Protection (requires clang/llvm and coroutine backend ucontext)')
-option('asan', type: 'boolean', value: false,
- description: 'enable address sanitizer')
-option('ubsan', type: 'boolean', value: false,
- description: 'enable undefined behaviour sanitizer')
-option('tsan', type: 'boolean', value: false,
- description: 'enable thread sanitizer')
+
option('stack_protector', type: 'feature', value: 'auto',
description: 'compiler-provided stack protection')
option('cfi', type: 'boolean', value: false,
diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
index c003985047..8d3b992ed7 100644
--- a/scripts/meson-buildoptions.sh
+++ b/scripts/meson-buildoptions.sh
@@ -21,7 +21,6 @@ meson_options_help() {
printf "%s\n" ' --disable-relocatable toggle relocatable install'
printf "%s\n" ' --docdir=VALUE Base directory for documentation installation'
printf "%s\n" ' (can be empty) [share/doc]'
- printf "%s\n" ' --enable-asan enable address sanitizer'
printf "%s\n" ' --enable-block-drv-whitelist-in-tools'
printf "%s\n" ' use block whitelist also in tools instead of only'
printf "%s\n" ' QEMU'
@@ -54,8 +53,6 @@ meson_options_help() {
printf "%s\n" ' --enable-trace-backends=CHOICES'
printf "%s\n" ' Set available tracing backends [log] (choices:'
printf "%s\n" ' dtrace/ftrace/log/nop/simple/syslog/ust)'
- printf "%s\n" ' --enable-tsan enable thread sanitizer'
- printf "%s\n" ' --enable-ubsan enable undefined behaviour sanitizer'
printf "%s\n" ' --firmwarepath=VALUES search PATH for firmware files [share/qemu-'
printf "%s\n" ' firmware]'
printf "%s\n" ' --iasl=VALUE Path to ACPI disassembler'
@@ -238,8 +235,6 @@ _meson_option_parse() {
--disable-af-xdp) printf "%s" -Daf_xdp=disabled ;;
--enable-alsa) printf "%s" -Dalsa=enabled ;;
--disable-alsa) printf "%s" -Dalsa=disabled ;;
- --enable-asan) printf "%s" -Dasan=true ;;
- --disable-asan) printf "%s" -Dasan=false ;;
--enable-attr) printf "%s" -Dattr=enabled ;;
--disable-attr) printf "%s" -Dattr=disabled ;;
--audio-drv-list=*) quote_sh "-Daudio_drv_list=$2" ;;
@@ -521,14 +516,10 @@ _meson_option_parse() {
--disable-tpm) printf "%s" -Dtpm=disabled ;;
--enable-trace-backends=*) quote_sh "-Dtrace_backends=$2" ;;
--with-trace-file=*) quote_sh "-Dtrace_file=$2" ;;
- --enable-tsan) printf "%s" -Dtsan=true ;;
- --disable-tsan) printf "%s" -Dtsan=false ;;
--enable-u2f) printf "%s" -Du2f=enabled ;;
--disable-u2f) printf "%s" -Du2f=disabled ;;
--enable-uadk) printf "%s" -Duadk=enabled ;;
--disable-uadk) printf "%s" -Duadk=disabled ;;
- --enable-ubsan) printf "%s" -Dubsan=true ;;
- --disable-ubsan) printf "%s" -Dubsan=false ;;
--enable-usb-redir) printf "%s" -Dusb_redir=enabled ;;
--disable-usb-redir) printf "%s" -Dusb_redir=disabled ;;
--enable-valgrind) printf "%s" -Dvalgrind=enabled ;;
diff --git a/tests/functional/x86_64/meson.build b/tests/functional/x86_64/meson.build
index 1ed10ad6c2..54af748f15 100644
--- a/tests/functional/x86_64/meson.build
+++ b/tests/functional/x86_64/meson.build
@@ -24,7 +24,7 @@ tests_x86_64_system_quick = [
# interacts badly with the sanitizer; this means the memlock
# test (which checks via /proc for whether pages were locked)
# will always fail on a sanitizer build, so don't run it.
-if not get_option('asan')
+if not sanitize.contains('address')
tests_x86_64_system_quick += [ 'memlock' ]
endif
diff --git a/tests/unit/meson.build b/tests/unit/meson.build
index 01cc540a45..b0ba64d0ec 100644
--- a/tests/unit/meson.build
+++ b/tests/unit/meson.build
@@ -147,7 +147,7 @@ if have_system
# Some tests: test-char, test-qdev-global-props, and test-qga,
# are not runnable under TSan due to a known issue.
# https://github.com/google/sanitizers/issues/1116
- if not get_option('tsan')
+ if not sanitize.contains('thread')
if host_os != 'windows'
tests += {
'test-char': ['socket-helpers.c', qom, io, chardev]
--
2.55.0.rc0.786.g65d90a0328-goog
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] build: Use meson b_sanitize option for sanitizers
2026-06-23 15:46 [PATCH] build: Use meson b_sanitize option for sanitizers Nabih Estefan
@ 2026-06-23 15:56 ` Daniel P. Berrangé
2026-06-23 16:53 ` Richard Henderson
1 sibling, 0 replies; 5+ messages in thread
From: Daniel P. Berrangé @ 2026-06-23 15:56 UTC (permalink / raw)
To: Nabih Estefan
Cc: pbonzini, alex.bennee, laurent, deller, pierrick.bouvier,
marcandre.lureau, philmd, zhao1.liu, qemu-devel
On Tue, Jun 23, 2026 at 03:46:59PM +0000, Nabih Estefan wrote:
> Refactor sanitizer configuration to use Meson's built-in `b_sanitize`
> option instead of manually adding flags to `qemu_cflags` and `qemu_ldflags`.
> This ensures that sanitizer flags are correctly passed to both C and Rust
> targets, fixing linker errors when Rust and UBSan are both enabled.
Our clang-user and clang-system CI jobs both build with --enable-ubsan
but don't enable Rust. I wonder if we can / should enable Rust in those
CI jobs to validate this scenario.
>
> Explicitly parse `--enable-ubsan`, `--enable-asan`, and `--enable-tsan`
> in `configure` and map them to `-Db_sanitize` meson option. Remove
> redundant custom options from `meson_options.txt`.
>
> How to test:
> `./configure --target-list=aarch64-softmmu --enable-ubsan --enable-rust
> && make -j all`
>
> Before this change it will fail at the end of make, since the linker will have
> different flags, after this change it will link properly
>
> Signed-off-by: Nabih Estefan <nabihestefan@google.com>
> ---
> configure | 35 ++++++++++++++++++
> linux-user/meson.build | 6 +++-
> meson.build | 55 +++++++++++++----------------
> meson_options.txt | 7 +---
> scripts/meson-buildoptions.sh | 9 -----
> tests/functional/x86_64/meson.build | 2 +-
> tests/unit/meson.build | 2 +-
> 7 files changed, 67 insertions(+), 49 deletions(-)
>
> diff --git a/configure b/configure
> index d8bc10060e..579df2f2c8 100755
> --- a/configure
> +++ b/configure
> @@ -281,6 +281,9 @@ cfi="false"
> # which requires knowing whether --static is enabled.
> pie=""
> static="no"
> +ubsan="false"
> +asan="false"
> +tsan="false"
>
> # Preferred compiler:
> # ${CC} (if set)
> @@ -746,6 +749,18 @@ for opt do
> ;;
> --wasm64-32bit-address-limit)
> ;;
> + --enable-ubsan) ubsan="true"
> + ;;
> + --disable-ubsan) ubsan="false"
> + ;;
> + --enable-asan) asan="true"
> + ;;
> + --disable-asan) asan="false"
> + ;;
> + --enable-tsan) tsan="true"
> + ;;
> + --disable-tsan) tsan="false"
> + ;;
> # everything else has the same name in configure and meson
> --*) meson_option_parse "$opt" "$optarg"
> ;;
> @@ -1939,6 +1954,26 @@ if test "$skip_meson" = no; then
>
> # QEMU options
> test "$rust" != "disabled" && meson_option_add "-Drust=$rust"
> +
> + # Translate asan/ubsan/tsan to b_sanitize
> + sanitizers=""
> + if test "$ubsan" = "true" && test "$asan" = "true"; then
> + sanitizers="undefined,address"
> + elif test "$ubsan" = "true"; then
> + sanitizers="undefined"
> + elif test "$asan" = "true"; then
> + sanitizers="address"
> + fi
> + if test "$tsan" = "true"; then
> + if test -n "$sanitizers"; then
> + error_exit "TSAN is not supported with other sanitizers"
> + fi
> + sanitizers="thread"
> + fi
> + if test -n "$sanitizers"; then
> + meson_option_add "-Db_sanitize=$sanitizers"
> + fi
> +
> test "$cfi" != false && meson_option_add "-Dcfi=$cfi" "-Db_lto=$cfi"
> test "$docs" != auto && meson_option_add "-Ddocs=$docs"
> test -n "${LIB_FUZZING_ENGINE+xxx}" && meson_option_add "-Dfuzzing_engine=$LIB_FUZZING_ENGINE"
> diff --git a/linux-user/meson.build b/linux-user/meson.build
> index 332847a621..d48887efb6 100644
> --- a/linux-user/meson.build
> +++ b/linux-user/meson.build
> @@ -34,8 +34,12 @@ endif
>
> syscall_nr_generators = {}
>
> +# gen-vdso doesn't play well with sanitizers. It originally didn't get them due
> +# to the way we passed sanitizer flags. Now that they're being passed through
> +# meson wen need to override it.
> gen_vdso_exe = executable('gen-vdso', 'gen-vdso.c',
> - native: true, build_by_default: false)
> + native: true, build_by_default: false,
> + override_options: ['b_sanitize=none'])
> gen_vdso = generator(gen_vdso_exe, output: '@BASENAME@.c.inc',
> arguments: ['-o', '@OUTPUT@', '@EXTRA_ARGS@', '@INPUT@'])
>
> diff --git a/meson.build b/meson.build
> index e026851309..417c27002c 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -541,43 +541,35 @@ if get_option('safe_stack') and coroutine_backend != 'ucontext'
> error('SafeStack is only supported with the ucontext coroutine backend')
> endif
>
> -if get_option('asan')
> - if cc.has_argument('-fsanitize=address')
> - qemu_cflags = ['-fsanitize=address'] + qemu_cflags
> - qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags
> - else
> - error('Your compiler does not support -fsanitize=address')
> - endif
> +sanitize = get_option('b_sanitize')
> +
> +if sanitize.contains('address')
> + # Meson handles -fsanitize=address automatically
> endif
>
> -if get_option('ubsan')
> +if sanitize.contains('undefined')
> # Detect static linking issue with ubsan:
> # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
> - if cc.links('int main(int argc, char **argv) { return argc + 1; }',
> - args: [qemu_ldflags, '-fsanitize=undefined'])
> - qemu_cflags += ['-fsanitize=undefined']
> - qemu_ldflags += ['-fsanitize=undefined']
> -
> - # Suppress undefined behaviour from function call to mismatched type.
> - # In addition, tcg prologue does not emit function type prefix
> - # required by function call sanitizer.
> - if cc.has_argument('-fno-sanitize=function')
> - qemu_cflags += ['-fno-sanitize=function']
> - endif
> - else
> + if not cc.links('int main(int argc, char **argv) { return argc + 1; }',
> + args: [qemu_ldflags, '-fsanitize=undefined'])
> error('Your compiler does not support -fsanitize=undefined')
> endif
> +
> + # Suppress undefined behaviour from function call to mismatched type.
> + # In addition, tcg prologue does not emit function type prefix
> + # required by function call sanitizer.
> + if cc.has_argument('-fno-sanitize=function')
> + qemu_cflags += ['-fno-sanitize=function']
> + endif
> endif
>
> -# Thread sanitizer is, for now, much noisier than the other sanitizers;
> -# keep it separate until that is not the case.
> -if get_option('tsan')
> - if get_option('asan') or get_option('ubsan')
> +if sanitize.contains('thread')
> + if sanitize.contains('address') or sanitize.contains('undefined')
> error('TSAN is not supported with other sanitizers')
> endif
> if not cc.has_function('__tsan_create_fiber',
> - args: '-fsanitize=thread',
> - prefix: '#include <sanitizer/tsan_interface.h>')
> + args: '-fsanitize=thread',
> + prefix: '#include <sanitizer/tsan_interface.h>')
> error('Cannot enable TSAN due to missing fiber annotation interface')
> endif
> tsan_warn_suppress = []
> @@ -588,8 +580,7 @@ if get_option('tsan')
> if cc.has_argument('-Wno-tsan')
> tsan_warn_suppress = ['-Wno-tsan']
> endif
> - qemu_cflags = ['-fsanitize=thread'] + tsan_warn_suppress + qemu_cflags
> - qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
> + qemu_cflags += tsan_warn_suppress
> endif
>
> # Detect support for PT_GNU_RELRO + DT_BIND_NOW.
> @@ -2482,7 +2473,7 @@ if have_tcg
> config_host_data.set('CONFIG_TCG_INTERPRETER', tcg_arch == 'tci')
> endif
> config_host_data.set('CONFIG_TPM', have_tpm)
> -config_host_data.set('CONFIG_TSAN', get_option('tsan'))
> +config_host_data.set('CONFIG_TSAN', sanitize.contains('thread'))
> config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
> config_host_data.set('CONFIG_VDE', vde.found())
> config_host_data.set('CONFIG_VHOST', have_vhost)
> @@ -2639,7 +2630,7 @@ if rdma.found()
> endif
>
> have_asan_fiber = false
> -if get_option('asan') and \
> +if sanitize.contains('address') and \
> not cc.has_function('__sanitizer_start_switch_fiber',
> args: '-fsanitize=address',
> prefix: '#include <sanitizer/asan_interface.h>')
> @@ -4768,7 +4759,9 @@ summary_info += {'memory allocator': get_option('malloc')}
> summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
> summary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
> summary_info += {'gcov': get_option('b_coverage')}
> -summary_info += {'thread sanitizer': get_option('tsan')}
> +summary_info += {'address sanitizer': sanitize.contains('address')}
> +summary_info += {'undefined behavior sanitizer': sanitize.contains('undefined')}
> +summary_info += {'thread sanitizer': sanitize.contains('thread')}
> summary_info += {'CFI support': get_option('cfi')}
> if get_option('cfi')
> summary_info += {'CFI debug support': get_option('cfi_debug')}
> diff --git a/meson_options.txt b/meson_options.txt
> index a07cb47d35..d61c0241cc 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -99,12 +99,7 @@ option('tcg_interpreter', type: 'boolean', value: false,
> description: 'TCG with bytecode interpreter (slow)')
> option('safe_stack', type: 'boolean', value: false,
> description: 'SafeStack Stack Smash Protection (requires clang/llvm and coroutine backend ucontext)')
> -option('asan', type: 'boolean', value: false,
> - description: 'enable address sanitizer')
> -option('ubsan', type: 'boolean', value: false,
> - description: 'enable undefined behaviour sanitizer')
> -option('tsan', type: 'boolean', value: false,
> - description: 'enable thread sanitizer')
> +
> option('stack_protector', type: 'feature', value: 'auto',
> description: 'compiler-provided stack protection')
> option('cfi', type: 'boolean', value: false,
> diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
> index c003985047..8d3b992ed7 100644
> --- a/scripts/meson-buildoptions.sh
> +++ b/scripts/meson-buildoptions.sh
> @@ -21,7 +21,6 @@ meson_options_help() {
> printf "%s\n" ' --disable-relocatable toggle relocatable install'
> printf "%s\n" ' --docdir=VALUE Base directory for documentation installation'
> printf "%s\n" ' (can be empty) [share/doc]'
> - printf "%s\n" ' --enable-asan enable address sanitizer'
> printf "%s\n" ' --enable-block-drv-whitelist-in-tools'
> printf "%s\n" ' use block whitelist also in tools instead of only'
> printf "%s\n" ' QEMU'
> @@ -54,8 +53,6 @@ meson_options_help() {
> printf "%s\n" ' --enable-trace-backends=CHOICES'
> printf "%s\n" ' Set available tracing backends [log] (choices:'
> printf "%s\n" ' dtrace/ftrace/log/nop/simple/syslog/ust)'
> - printf "%s\n" ' --enable-tsan enable thread sanitizer'
> - printf "%s\n" ' --enable-ubsan enable undefined behaviour sanitizer'
> printf "%s\n" ' --firmwarepath=VALUES search PATH for firmware files [share/qemu-'
> printf "%s\n" ' firmware]'
> printf "%s\n" ' --iasl=VALUE Path to ACPI disassembler'
> @@ -238,8 +235,6 @@ _meson_option_parse() {
> --disable-af-xdp) printf "%s" -Daf_xdp=disabled ;;
> --enable-alsa) printf "%s" -Dalsa=enabled ;;
> --disable-alsa) printf "%s" -Dalsa=disabled ;;
> - --enable-asan) printf "%s" -Dasan=true ;;
> - --disable-asan) printf "%s" -Dasan=false ;;
> --enable-attr) printf "%s" -Dattr=enabled ;;
> --disable-attr) printf "%s" -Dattr=disabled ;;
> --audio-drv-list=*) quote_sh "-Daudio_drv_list=$2" ;;
> @@ -521,14 +516,10 @@ _meson_option_parse() {
> --disable-tpm) printf "%s" -Dtpm=disabled ;;
> --enable-trace-backends=*) quote_sh "-Dtrace_backends=$2" ;;
> --with-trace-file=*) quote_sh "-Dtrace_file=$2" ;;
> - --enable-tsan) printf "%s" -Dtsan=true ;;
> - --disable-tsan) printf "%s" -Dtsan=false ;;
> --enable-u2f) printf "%s" -Du2f=enabled ;;
> --disable-u2f) printf "%s" -Du2f=disabled ;;
> --enable-uadk) printf "%s" -Duadk=enabled ;;
> --disable-uadk) printf "%s" -Duadk=disabled ;;
> - --enable-ubsan) printf "%s" -Dubsan=true ;;
> - --disable-ubsan) printf "%s" -Dubsan=false ;;
> --enable-usb-redir) printf "%s" -Dusb_redir=enabled ;;
> --disable-usb-redir) printf "%s" -Dusb_redir=disabled ;;
> --enable-valgrind) printf "%s" -Dvalgrind=enabled ;;
> diff --git a/tests/functional/x86_64/meson.build b/tests/functional/x86_64/meson.build
> index 1ed10ad6c2..54af748f15 100644
> --- a/tests/functional/x86_64/meson.build
> +++ b/tests/functional/x86_64/meson.build
> @@ -24,7 +24,7 @@ tests_x86_64_system_quick = [
> # interacts badly with the sanitizer; this means the memlock
> # test (which checks via /proc for whether pages were locked)
> # will always fail on a sanitizer build, so don't run it.
> -if not get_option('asan')
> +if not sanitize.contains('address')
> tests_x86_64_system_quick += [ 'memlock' ]
> endif
>
> diff --git a/tests/unit/meson.build b/tests/unit/meson.build
> index 01cc540a45..b0ba64d0ec 100644
> --- a/tests/unit/meson.build
> +++ b/tests/unit/meson.build
> @@ -147,7 +147,7 @@ if have_system
> # Some tests: test-char, test-qdev-global-props, and test-qga,
> # are not runnable under TSan due to a known issue.
> # https://github.com/google/sanitizers/issues/1116
> - if not get_option('tsan')
> + if not sanitize.contains('thread')
> if host_os != 'windows'
> tests += {
> 'test-char': ['socket-helpers.c', qom, io, chardev]
> --
> 2.55.0.rc0.786.g65d90a0328-goog
>
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] build: Use meson b_sanitize option for sanitizers
2026-06-23 15:46 [PATCH] build: Use meson b_sanitize option for sanitizers Nabih Estefan
2026-06-23 15:56 ` Daniel P. Berrangé
@ 2026-06-23 16:53 ` Richard Henderson
2026-06-23 17:46 ` Richard Henderson
1 sibling, 1 reply; 5+ messages in thread
From: Richard Henderson @ 2026-06-23 16:53 UTC (permalink / raw)
To: Nabih Estefan, pbonzini
Cc: alex.bennee, laurent, deller, pierrick.bouvier, marcandre.lureau,
berrange, philmd, zhao1.liu, qemu-devel
On 6/23/26 08:46, Nabih Estefan wrote:
> +# gen-vdso doesn't play well with sanitizers. It originally didn't get them due
> +# to the way we passed sanitizer flags. Now that they're being passed through
> +# meson wen need to override it.
Details? It's not an especially complicated program...
r~
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] build: Use meson b_sanitize option for sanitizers
2026-06-23 16:53 ` Richard Henderson
@ 2026-06-23 17:46 ` Richard Henderson
2026-06-23 18:36 ` Nabih Estefan
0 siblings, 1 reply; 5+ messages in thread
From: Richard Henderson @ 2026-06-23 17:46 UTC (permalink / raw)
To: Nabih Estefan, pbonzini
Cc: alex.bennee, laurent, deller, pierrick.bouvier, marcandre.lureau,
berrange, philmd, zhao1.liu, qemu-devel
On 6/23/26 09:53, Richard Henderson wrote:
> On 6/23/26 08:46, Nabih Estefan wrote:
>> +# gen-vdso doesn't play well with sanitizers. It originally didn't get them due
>> +# to the way we passed sanitizer flags. Now that they're being passed through
>> +# meson wen need to override it.
>
> Details? It's not an especially complicated program...
FWIW, I attempted to reproduce any problem by editing build.ninja; everything built just
fine with -fsanitize=undefined,address.
So I'm not sure why you'd need to force disable here.
r~
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] build: Use meson b_sanitize option for sanitizers
2026-06-23 17:46 ` Richard Henderson
@ 2026-06-23 18:36 ` Nabih Estefan
0 siblings, 0 replies; 5+ messages in thread
From: Nabih Estefan @ 2026-06-23 18:36 UTC (permalink / raw)
To: Richard Henderson
Cc: pbonzini, alex.bennee, laurent, deller, pierrick.bouvier,
marcandre.lureau, berrange, philmd, zhao1.liu, qemu-devel
Huh, I don't remember what the failure was and for all my testing I
can't seem to reproduce it anymore.I'll run a couple more tests to see
if I can reproduce, if not I'll just remove the override.
Thanks,
Nabih
Nabih Estefan (he/him) | Software Engineer | nabihestefan@google.com
On Tue, Jun 23, 2026 at 10:46 AM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> On 6/23/26 09:53, Richard Henderson wrote:
> > On 6/23/26 08:46, Nabih Estefan wrote:
> >> +# gen-vdso doesn't play well with sanitizers. It originally didn't get them due
> >> +# to the way we passed sanitizer flags. Now that they're being passed through
> >> +# meson wen need to override it.
> >
> > Details? It's not an especially complicated program...
>
> FWIW, I attempted to reproduce any problem by editing build.ninja; everything built just
> fine with -fsanitize=undefined,address.
>
> So I'm not sure why you'd need to force disable here.
>
> r~
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-06-23 18:37 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-23 15:46 [PATCH] build: Use meson b_sanitize option for sanitizers Nabih Estefan
2026-06-23 15:56 ` Daniel P. Berrangé
2026-06-23 16:53 ` Richard Henderson
2026-06-23 17:46 ` Richard Henderson
2026-06-23 18:36 ` Nabih Estefan
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.