authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-08-24 14:02:59-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-09-19 09:37:53-07:00
log66312c0b51c43feb40892c8873f018619b8d3fed
tree1cf3d8471fe141ed4dabf3a4c260941b1d67ee5c
parent75b8b21cc1db3413578b5b42a39a40fb8b140da4

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 files changed, 9 insertions(+), 0 deletions(-)

src/Compilation.zig+9
...@@ -4457,9 +4457,18 @@ pub fn addCCArgs(...@@ -4457,9 +4457,18 @@ pub fn addCCArgs(
4457 if (comp.sanitize_c and !comp.bin_file.options.tsan) {4457 if (comp.sanitize_c and !comp.bin_file.options.tsan) {
4458 try argv.append("-fsanitize=undefined");4458 try argv.append("-fsanitize=undefined");
4459 try argv.append("-fsanitize-trap=undefined");4459 try argv.append("-fsanitize-trap=undefined");
4460 // It is very common, and well-defined, for a pointer on one side of a C ABI
4461 // to have a different but compatible element type. Examples include:
4462 // `char*` vs `uint8_t*` on a system with 8-bit bytes
4463 // `const char*` vs `char*`
4464 // `char*` vs `unsigned char*`
4465 // Without this flag, Clang would invoke UBSAN when such an extern
4466 // function was called.
4467 try argv.append("-fno-sanitize=function");
4460 } else if (comp.sanitize_c and comp.bin_file.options.tsan) {4468 } else if (comp.sanitize_c and comp.bin_file.options.tsan) {
4461 try argv.append("-fsanitize=undefined,thread");4469 try argv.append("-fsanitize=undefined,thread");
4462 try argv.append("-fsanitize-trap=undefined");4470 try argv.append("-fsanitize-trap=undefined");
4471 try argv.append("-fno-sanitize=function");
4463 } else if (!comp.sanitize_c and comp.bin_file.options.tsan) {4472 } else if (!comp.sanitize_c and comp.bin_file.options.tsan) {
4464 try argv.append("-fsanitize=thread");4473 try argv.append("-fsanitize=thread");
4465 }4474 }