@@ -589,57 +589,101 @@ fn parse_sanitize_attr(
589589 if let Some ( list) = attr. meta_item_list ( ) {
590590 for item in list. iter ( ) {
591591 let MetaItemInner :: MetaItem ( set) = item else {
592- tcx. dcx ( ) . emit_err ( errors:: InvalidSanitize { span : attr. span ( ) } ) ;
592+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizer { span : attr. span ( ) } ) ;
593593 break ;
594594 } ;
595595 let segments = set. path . segments . iter ( ) . map ( |x| x. ident . name ) . collect :: < Vec < _ > > ( ) ;
596596 match segments. as_slice ( ) {
597597 // Similar to clang, sanitize(address = ..) and
598598 // sanitize(kernel_address = ..) control both ASan and KASan
599599 // Source: https://reviews.llvm.org/D44981.
600- [ sym:: address] | [ sym:: kernel_address] if set. value_str ( ) == Some ( sym:: off) => {
601- result |= SanitizerSet :: ADDRESS | SanitizerSet :: KERNELADDRESS
602- }
603- [ sym:: address] | [ sym:: kernel_address] if set. value_str ( ) == Some ( sym:: on) => {
604- result &= !SanitizerSet :: ADDRESS ;
605- result &= !SanitizerSet :: KERNELADDRESS ;
606- }
607- [ sym:: cfi] if set. value_str ( ) == Some ( sym:: off) => result |= SanitizerSet :: CFI ,
608- [ sym:: cfi] if set. value_str ( ) == Some ( sym:: on) => result &= !SanitizerSet :: CFI ,
609- [ sym:: kcfi] if set. value_str ( ) == Some ( sym:: off) => result |= SanitizerSet :: KCFI ,
610- [ sym:: kcfi] if set. value_str ( ) == Some ( sym:: on) => result &= !SanitizerSet :: KCFI ,
611- [ sym:: memory] if set. value_str ( ) == Some ( sym:: off) => {
612- result |= SanitizerSet :: MEMORY
613- }
614- [ sym:: memory] if set. value_str ( ) == Some ( sym:: on) => {
615- result &= !SanitizerSet :: MEMORY
616- }
617- [ sym:: memtag] if set. value_str ( ) == Some ( sym:: off) => {
618- result |= SanitizerSet :: MEMTAG
619- }
620- [ sym:: memtag] if set. value_str ( ) == Some ( sym:: on) => {
621- result &= !SanitizerSet :: MEMTAG
622- }
623- [ sym:: shadow_call_stack] if set. value_str ( ) == Some ( sym:: off) => {
624- result |= SanitizerSet :: SHADOWCALLSTACK
625- }
626- [ sym:: shadow_call_stack] if set. value_str ( ) == Some ( sym:: on) => {
627- result &= !SanitizerSet :: SHADOWCALLSTACK
628- }
629- [ sym:: thread] if set. value_str ( ) == Some ( sym:: off) => {
630- result |= SanitizerSet :: THREAD
631- }
632- [ sym:: thread] if set. value_str ( ) == Some ( sym:: on) => {
633- result &= !SanitizerSet :: THREAD
634- }
635- [ sym:: hwaddress] if set. value_str ( ) == Some ( sym:: off) => {
636- result |= SanitizerSet :: HWADDRESS
637- }
638- [ sym:: hwaddress] if set. value_str ( ) == Some ( sym:: on) => {
639- result &= !SanitizerSet :: HWADDRESS
640- }
600+ [ sym:: address] | [ sym:: kernel_address] => match set. value_str ( ) {
601+ Some ( sym:: off) => result |= SanitizerSet :: ADDRESS | SanitizerSet :: KERNELADDRESS ,
602+ Some ( sym:: on) => {
603+ result &= !SanitizerSet :: ADDRESS ;
604+ result &= !SanitizerSet :: KERNELADDRESS ;
605+ }
606+ _ => {
607+ let sanitizer = segments. as_slice ( ) [ 0 ] ;
608+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
609+ span : set. span ,
610+ sanitizer,
611+ } ) ;
612+ }
613+ } ,
614+ [ sym:: cfi] => match set. value_str ( ) {
615+ Some ( sym:: off) => result |= SanitizerSet :: CFI ,
616+ Some ( sym:: on) => result &= !SanitizerSet :: CFI ,
617+ _ => {
618+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
619+ span : set. span ,
620+ sanitizer : sym:: cfi,
621+ } ) ;
622+ }
623+ } ,
624+ [ sym:: kcfi] => match set. value_str ( ) {
625+ Some ( sym:: off) => result |= SanitizerSet :: KCFI ,
626+ Some ( sym:: on) => result &= !SanitizerSet :: KCFI ,
627+ _ => {
628+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
629+ span : set. span ,
630+ sanitizer : sym:: kcfi,
631+ } ) ;
632+ }
633+ } ,
634+ [ sym:: memory] => match set. value_str ( ) {
635+ Some ( sym:: off) => result |= SanitizerSet :: MEMORY ,
636+ Some ( sym:: on) => result &= !SanitizerSet :: MEMORY ,
637+ _ => {
638+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
639+ span : set. span ,
640+ sanitizer : sym:: memory,
641+ } ) ;
642+ }
643+ } ,
644+ [ sym:: memtag] => match set. value_str ( ) {
645+ Some ( sym:: off) => result |= SanitizerSet :: MEMTAG ,
646+ Some ( sym:: on) => result &= !SanitizerSet :: MEMTAG ,
647+ _ => {
648+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
649+ span : set. span ,
650+ sanitizer : sym:: memtag,
651+ } ) ;
652+ }
653+ } ,
654+ [ sym:: shadow_call_stack] => match set. value_str ( ) {
655+ Some ( sym:: off) => result |= SanitizerSet :: SHADOWCALLSTACK ,
656+ Some ( sym:: on) => result &= !SanitizerSet :: SHADOWCALLSTACK ,
657+ _ => {
658+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
659+ span : set. span ,
660+ sanitizer : sym:: shadow_call_stack,
661+ } ) ;
662+ }
663+ } ,
664+ [ sym:: thread] => match set. value_str ( ) {
665+ Some ( sym:: off) => result |= SanitizerSet :: THREAD ,
666+ Some ( sym:: on) => result &= !SanitizerSet :: THREAD ,
667+ _ => {
668+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
669+ span : set. span ,
670+ sanitizer : sym:: thread,
671+ } ) ;
672+ }
673+ } ,
674+
675+ [ sym:: hwaddress] => match set. value_str ( ) {
676+ Some ( sym:: off) => result |= SanitizerSet :: HWADDRESS ,
677+ Some ( sym:: on) => result &= !SanitizerSet :: HWADDRESS ,
678+ _ => {
679+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
680+ span : set. span ,
681+ sanitizer : sym:: hwaddress,
682+ } ) ;
683+ }
684+ } ,
641685 _ => {
642- tcx. dcx ( ) . emit_err ( errors:: InvalidSanitize { span : attr. span ( ) } ) ;
686+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizer { span : attr. span ( ) } ) ;
643687 }
644688 }
645689 }
0 commit comments