From db853cf4fbdc4b4bc551f11fef92e2adcfe63220 Mon Sep 17 00:00:00 2001 From: Sergei Zimmerman Date: Wed, 18 Feb 2026 17:33:51 +0300 Subject: [PATCH] libutil: More robust check for NIX_UBSAN_ENABLED In 3df91bea6270b01045ebaa54275a4a3f4aca437d I forgot that the header might get included out-of-tree with -Wundef. Let's make this a public config option for libutil as it can affect function bodies in headers. --- .../common/asan-options/meson.build | 6 ------ src/libutil/include/nix/util/error.hh | 3 ++- src/libutil/include/nix/util/meson.build | 7 ++++++- src/libutil/meson.build | 15 +++++++++++---- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/nix-meson-build-support/common/asan-options/meson.build b/nix-meson-build-support/common/asan-options/meson.build index c0d02186fa5f..56e6a6a56a7f 100644 --- a/nix-meson-build-support/common/asan-options/meson.build +++ b/nix-meson-build-support/common/asan-options/meson.build @@ -9,9 +9,3 @@ endif if 'address' in get_option('b_sanitize') deps_other += declare_dependency(sources : 'asan-options.cc') endif - -if 'undefined' in get_option('b_sanitize') - add_project_arguments('-DNIX_UBSAN_ENABLED=1', language : 'cpp') -else - add_project_arguments('-DNIX_UBSAN_ENABLED=0', language : 'cpp') -endif diff --git a/src/libutil/include/nix/util/error.hh b/src/libutil/include/nix/util/error.hh index d7ca43974505..4f6d2363d05c 100644 --- a/src/libutil/include/nix/util/error.hh +++ b/src/libutil/include/nix/util/error.hh @@ -17,6 +17,7 @@ #include "nix/util/suggestions.hh" #include "nix/util/fmt.hh" +#include "nix/util/config.hh" #include #include @@ -350,7 +351,7 @@ int handleExceptions(const std::string & programName, std::function fun) */ [[gnu::noinline, gnu::cold, noreturn]] void unreachable(std::source_location loc = std::source_location::current()); -#if NIX_UBSAN_ENABLED == 1 +#if NIX_UBSAN_ENABLED /* When building with sanitizers, also enable expensive unreachable checks. In optimised builds this explicitly invokes UB with std::unreachable for better optimisations. */ diff --git a/src/libutil/include/nix/util/meson.build b/src/libutil/include/nix/util/meson.build index b31e8cba50e5..adaceb413fd8 100644 --- a/src/libutil/include/nix/util/meson.build +++ b/src/libutil/include/nix/util/meson.build @@ -2,7 +2,12 @@ include_dirs = [ include_directories('../..') ] -headers = files( +config_pub_h = configure_file( + configuration : configdata_pub, + output : 'config.hh', +) + +headers = [ config_pub_h ] + files( 'abstract-setting-to-json.hh', 'alignment.hh', 'ansicolor.hh', diff --git a/src/libutil/meson.build b/src/libutil/meson.build index 33d7c6f567ce..71bea971dfe5 100644 --- a/src/libutil/meson.build +++ b/src/libutil/meson.build @@ -16,7 +16,8 @@ cxx = meson.get_compiler('cpp') subdir('nix-meson-build-support/deps-lists') -configdata = configuration_data() +configdata_pub = configuration_data() +configdata_priv = configuration_data() deps_private_maybe_subproject = [] deps_public_maybe_subproject = [] @@ -34,9 +35,15 @@ check_funcs = [ foreach funcspec : check_funcs define_name = 'HAVE_' + funcspec[0].underscorify().to_upper() define_value = cxx.has_function(funcspec[0]).to_int() - configdata.set(define_name, define_value, description : funcspec[1]) + configdata_priv.set(define_name, define_value, description : funcspec[1]) endforeach +configdata_pub.set( + 'NIX_UBSAN_ENABLED', + ('undefined' in get_option('b_sanitize')).to_int(), + description : 'Whether nix has been built with UBSan enabled', +) + subdir('nix-meson-build-support/libatomic') if host_machine.system() == 'windows' @@ -104,7 +111,7 @@ cpuid = dependency( version : '>= 0.7.0', required : cpuid_required, ) -configdata.set('HAVE_LIBCPUID', cpuid.found().to_int()) +configdata_priv.set('HAVE_LIBCPUID', cpuid.found().to_int()) deps_private += cpuid nlohmann_json = dependency('nlohmann_json', version : '>= 3.9') @@ -113,7 +120,7 @@ deps_public += nlohmann_json cxx = meson.get_compiler('cpp') config_priv_h = configure_file( - configuration : configdata, + configuration : configdata_priv, output : 'util-config-private.hh', )