@@ -372,7 +372,9 @@ mod desc {
372
372
pub const parse_opt_panic_strategy: & str = parse_panic_strategy;
373
373
pub const parse_oom_strategy: & str = "either `panic` or `abort`" ;
374
374
pub const parse_relro_level: & str = "one of: `full`, `partial`, or `off`" ;
375
- pub const parse_sanitizers: & str = "comma separated list of sanitizers: `address`, `cfi`, `hwaddress`, `kcfi`, `kernel-address`, `leak`, `memory`, `memtag`, `safestack`, `shadow-call-stack`, or `thread`" ;
375
+ pub const parse_sanitizers: & str = "comma separated list of sanitizers: `address`, `cfi`, `hwaddress`, `kcfi`, `kernel-address`, `leak`, `memory`, `memtag`, `safestack`, `shadow-call-stack`, `thread`, or `undefined`" ;
376
+ pub const parse_sanitizers_stable: & str =
377
+ "comma separated list of sanitizers: `none` or `undefined`" ;
376
378
pub const parse_sanitizer_memory_track_origins: & str = "0, 1, or 2" ;
377
379
pub const parse_cfguard: & str =
378
380
"either a boolean (`yes`, `no`, `on`, `off`, etc), `checks`, or `nochecks`" ;
@@ -695,6 +697,7 @@ mod parse {
695
697
"thread" => SanitizerSet :: THREAD ,
696
698
"hwaddress" => SanitizerSet :: HWADDRESS ,
697
699
"safestack" => SanitizerSet :: SAFESTACK ,
700
+ "undefined" => SanitizerSet :: UNDEFINED ,
698
701
_ => return false ,
699
702
}
700
703
}
@@ -722,6 +725,32 @@ mod parse {
722
725
}
723
726
}
724
727
728
+ pub ( crate ) fn parse_sanitizers_stable (
729
+ slot : & mut Option < SanitizerSet > ,
730
+ v : Option < & str > ,
731
+ ) -> bool {
732
+ if let Some ( v) = v {
733
+ let mut sanitizer = SanitizerSet :: empty ( ) ;
734
+ let mut got_none = false ;
735
+ for s in v. split ( ',' ) {
736
+ sanitizer |= match s {
737
+ "none" => {
738
+ got_none = true ;
739
+ SanitizerSet :: empty ( )
740
+ }
741
+ "undefined" => SanitizerSet :: UNDEFINED ,
742
+ _ => return false ,
743
+ }
744
+ }
745
+ if got_none {
746
+ * slot = Some ( SanitizerSet :: empty ( ) ) ;
747
+ }
748
+ } else {
749
+ * slot = None ;
750
+ }
751
+ true
752
+ }
753
+
725
754
pub ( crate ) fn parse_strip ( slot : & mut Strip , v : Option < & str > ) -> bool {
726
755
match v {
727
756
Some ( "none" ) => * slot = Strip :: None ,
@@ -1320,6 +1349,8 @@ options! {
1320
1349
"print remarks for these optimization passes (space separated, or \" all\" )" ) ,
1321
1350
rpath: bool = ( false , parse_bool, [ UNTRACKED ] ,
1322
1351
"set rpath values in libs/exes (default: no)" ) ,
1352
+ sanitizer: Option <SanitizerSet > = ( None , parse_sanitizers_stable, [ TRACKED ] ,
1353
+ "use a sanitizer" ) ,
1323
1354
save_temps: bool = ( false , parse_bool, [ UNTRACKED ] ,
1324
1355
"save all temporary output files during compilation (default: no)" ) ,
1325
1356
soft_float: bool = ( false , parse_bool, [ TRACKED ] ,
0 commit comments