@@ -5626,15 +5626,6 @@ pub fn addCCArgs(
5626
5626
if (mod .sanitize_c ) {
5627
5627
if (san_arg .items .len == 0 ) try san_arg .appendSlice (arena , prefix );
5628
5628
try san_arg .appendSlice (arena , "undefined," );
5629
- try argv .append ("-fsanitize-trap=undefined" );
5630
- // It is very common, and well-defined, for a pointer on one side of a C ABI
5631
- // to have a different but compatible element type. Examples include:
5632
- // `char*` vs `uint8_t*` on a system with 8-bit bytes
5633
- // `const char*` vs `char*`
5634
- // `char*` vs `unsigned char*`
5635
- // Without this flag, Clang would invoke UBSAN when such an extern
5636
- // function was called.
5637
- try argv .append ("-fno-sanitize=function" );
5638
5629
}
5639
5630
if (mod .sanitize_thread ) {
5640
5631
if (san_arg .items .len == 0 ) try san_arg .appendSlice (arena , prefix );
@@ -5645,7 +5636,23 @@ pub fn addCCArgs(
5645
5636
try san_arg .appendSlice (arena , "fuzzer-no-link," );
5646
5637
}
5647
5638
// Chop off the trailing comma and append to argv.
5648
- if (san_arg .popOrNull ()) | _ | try argv .append (san_arg .items );
5639
+ if (san_arg .popOrNull ()) | _ | {
5640
+ try argv .append (san_arg .items );
5641
+
5642
+ // These args have to be added after the `-fsanitize` arg or
5643
+ // they won't take effect.
5644
+ if (mod .sanitize_c ) {
5645
+ try argv .append ("-fsanitize-trap=undefined" );
5646
+ // It is very common, and well-defined, for a pointer on one side of a C ABI
5647
+ // to have a different but compatible element type. Examples include:
5648
+ // `char*` vs `uint8_t*` on a system with 8-bit bytes
5649
+ // `const char*` vs `char*`
5650
+ // `char*` vs `unsigned char*`
5651
+ // Without this flag, Clang would invoke UBSAN when such an extern
5652
+ // function was called.
5653
+ try argv .append ("-fno-sanitize=function" );
5654
+ }
5655
+ }
5649
5656
}
5650
5657
5651
5658
if (mod .red_zone ) {
0 commit comments