From a98de38d4cea4c0ca4ed9a405a8235e730ded42d Mon Sep 17 00:00:00 2001
From: Ryan Gonzalez <ryan.gonzalez@collabora.com>
Date: Fri, 21 Feb 2025 16:59:23 -0600
Subject: [PATCH] build: Disable -fsanitize=function when building with UBSan

LLVM 17 enabled -fsanitize=function by default for C, instead of only
C++:

https://github.com/llvm/llvm-project/commit/279a4d0d67c874e80c171666822f2fabdd6fa926

But GLib uses function pointer casts extensively, resulting in a myriad
of test failures. Just disable it as a workaround.

steamrt/tasks#677

Signed-off-by: Ryan Gonzalez <ryan.gonzalez@collabora.com>
---
 meson.build | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/meson.build b/meson.build
index 7660073c..b149a06f 100644
--- a/meson.build
+++ b/meson.build
@@ -219,6 +219,15 @@ else
   no_leak_sanitizer = ['b_sanitize=none']
 endif
 
+# GLib explicitly requires being able to call functions through a different
+# function pointer type, which trips UBSan's -fsanitize=function:
+# https://gitlab.gnome.org/GNOME/glib/-/blob/53b0ba327ba52ebcd38ee4e7f479bf029ffcdc1f/docs/toolchain-requirements.md#calling-functions-through-differently-typed-function-pointers
+if enabled_sanitizers.contains('undefined')
+  add_project_arguments(
+    c_compiler.get_supported_arguments('-fno-sanitize=function'),
+    language : 'c')
+endif
+
 add_project_link_arguments(
   c_compiler.get_supported_link_arguments(
     '-Wl,-z,origin',
-- 
GitLab