Commit 66312c0b51

Andrew Kelley <andrew@ziglang.org>
2023-08-24 23:02:59
clang: -fno-sanitize=function workaround
It is very common, and well-defined, for a pointer on one side of a C ABI to have a different but compatible element type. Examples include: - `char*` vs `uint8_t*` on a system with 8-bit bytes - `const char*` vs `char*` - `char*` vs `unsigned char*` Without this flag, Clang would invoke UBSAN when such an extern function was called. Might be nice to file an upstream issue and find out if there is a more precise way to disable the problematic check. `-fsanitize-cfi-icall-generalize-pointers` looks promising according to the documentation, but empirically it does not work.
1 parent 75b8b21
Changed files (1)
src/Compilation.zig
@@ -4457,9 +4457,18 @@ pub fn addCCArgs(
             if (comp.sanitize_c and !comp.bin_file.options.tsan) {
                 try argv.append("-fsanitize=undefined");
                 try argv.append("-fsanitize-trap=undefined");
+                // It is very common, and well-defined, for a pointer on one side of a C ABI
+                // to have a different but compatible element type. Examples include:
+                // `char*` vs `uint8_t*` on a system with 8-bit bytes
+                // `const char*` vs `char*`
+                // `char*` vs `unsigned char*`
+                // Without this flag, Clang would invoke UBSAN when such an extern
+                // function was called.
+                try argv.append("-fno-sanitize=function");
             } else if (comp.sanitize_c and comp.bin_file.options.tsan) {
                 try argv.append("-fsanitize=undefined,thread");
                 try argv.append("-fsanitize-trap=undefined");
+                try argv.append("-fno-sanitize=function");
             } else if (!comp.sanitize_c and comp.bin_file.options.tsan) {
                 try argv.append("-fsanitize=thread");
             }