@@ -577,57 +577,101 @@ fn parse_sanitize_attr(
577577 if let Some ( list) = attr. meta_item_list ( ) {
578578 for item in list. iter ( ) {
579579 let MetaItemInner :: MetaItem ( set) = item else {
580- tcx. dcx ( ) . emit_err ( errors:: InvalidSanitize { span : attr. span ( ) } ) ;
580+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizer { span : attr. span ( ) } ) ;
581581 break ;
582582 } ;
583583 let segments = set. path . segments . iter ( ) . map ( |x| x. ident . name ) . collect :: < Vec < _ > > ( ) ;
584584 match segments. as_slice ( ) {
585585 // Similar to clang, sanitize(address = ..) and
586586 // sanitize(kernel_address = ..) control both ASan and KASan
587587 // Source: https://reviews.llvm.org/D44981.
588- [ sym:: address] | [ sym:: kernel_address] if set. value_str ( ) == Some ( sym:: off) => {
589- result |= SanitizerSet :: ADDRESS | SanitizerSet :: KERNELADDRESS
590- }
591- [ sym:: address] | [ sym:: kernel_address] if set. value_str ( ) == Some ( sym:: on) => {
592- result &= !SanitizerSet :: ADDRESS ;
593- result &= !SanitizerSet :: KERNELADDRESS ;
594- }
595- [ sym:: cfi] if set. value_str ( ) == Some ( sym:: off) => result |= SanitizerSet :: CFI ,
596- [ sym:: cfi] if set. value_str ( ) == Some ( sym:: on) => result &= !SanitizerSet :: CFI ,
597- [ sym:: kcfi] if set. value_str ( ) == Some ( sym:: off) => result |= SanitizerSet :: KCFI ,
598- [ sym:: kcfi] if set. value_str ( ) == Some ( sym:: on) => result &= !SanitizerSet :: KCFI ,
599- [ sym:: memory] if set. value_str ( ) == Some ( sym:: off) => {
600- result |= SanitizerSet :: MEMORY
601- }
602- [ sym:: memory] if set. value_str ( ) == Some ( sym:: on) => {
603- result &= !SanitizerSet :: MEMORY
604- }
605- [ sym:: memtag] if set. value_str ( ) == Some ( sym:: off) => {
606- result |= SanitizerSet :: MEMTAG
607- }
608- [ sym:: memtag] if set. value_str ( ) == Some ( sym:: on) => {
609- result &= !SanitizerSet :: MEMTAG
610- }
611- [ sym:: shadow_call_stack] if set. value_str ( ) == Some ( sym:: off) => {
612- result |= SanitizerSet :: SHADOWCALLSTACK
613- }
614- [ sym:: shadow_call_stack] if set. value_str ( ) == Some ( sym:: on) => {
615- result &= !SanitizerSet :: SHADOWCALLSTACK
616- }
617- [ sym:: thread] if set. value_str ( ) == Some ( sym:: off) => {
618- result |= SanitizerSet :: THREAD
619- }
620- [ sym:: thread] if set. value_str ( ) == Some ( sym:: on) => {
621- result &= !SanitizerSet :: THREAD
622- }
623- [ sym:: hwaddress] if set. value_str ( ) == Some ( sym:: off) => {
624- result |= SanitizerSet :: HWADDRESS
625- }
626- [ sym:: hwaddress] if set. value_str ( ) == Some ( sym:: on) => {
627- result &= !SanitizerSet :: HWADDRESS
628- }
588+ [ sym:: address] | [ sym:: kernel_address] => match set. value_str ( ) {
589+ Some ( sym:: off) => result |= SanitizerSet :: ADDRESS | SanitizerSet :: KERNELADDRESS ,
590+ Some ( sym:: on) => {
591+ result &= !SanitizerSet :: ADDRESS ;
592+ result &= !SanitizerSet :: KERNELADDRESS ;
593+ }
594+ _ => {
595+ let sanitizer = segments. as_slice ( ) [ 0 ] ;
596+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
597+ span : set. span ,
598+ sanitizer,
599+ } ) ;
600+ }
601+ } ,
602+ [ sym:: cfi] => match set. value_str ( ) {
603+ Some ( sym:: off) => result |= SanitizerSet :: CFI ,
604+ Some ( sym:: on) => result &= !SanitizerSet :: CFI ,
605+ _ => {
606+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
607+ span : set. span ,
608+ sanitizer : sym:: cfi,
609+ } ) ;
610+ }
611+ } ,
612+ [ sym:: kcfi] => match set. value_str ( ) {
613+ Some ( sym:: off) => result |= SanitizerSet :: KCFI ,
614+ Some ( sym:: on) => result &= !SanitizerSet :: KCFI ,
615+ _ => {
616+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
617+ span : set. span ,
618+ sanitizer : sym:: kcfi,
619+ } ) ;
620+ }
621+ } ,
622+ [ sym:: memory] => match set. value_str ( ) {
623+ Some ( sym:: off) => result |= SanitizerSet :: MEMORY ,
624+ Some ( sym:: on) => result &= !SanitizerSet :: MEMORY ,
625+ _ => {
626+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
627+ span : set. span ,
628+ sanitizer : sym:: memory,
629+ } ) ;
630+ }
631+ } ,
632+ [ sym:: memtag] => match set. value_str ( ) {
633+ Some ( sym:: off) => result |= SanitizerSet :: MEMTAG ,
634+ Some ( sym:: on) => result &= !SanitizerSet :: MEMTAG ,
635+ _ => {
636+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
637+ span : set. span ,
638+ sanitizer : sym:: memtag,
639+ } ) ;
640+ }
641+ } ,
642+ [ sym:: shadow_call_stack] => match set. value_str ( ) {
643+ Some ( sym:: off) => result |= SanitizerSet :: SHADOWCALLSTACK ,
644+ Some ( sym:: on) => result &= !SanitizerSet :: SHADOWCALLSTACK ,
645+ _ => {
646+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
647+ span : set. span ,
648+ sanitizer : sym:: shadow_call_stack,
649+ } ) ;
650+ }
651+ } ,
652+ [ sym:: thread] => match set. value_str ( ) {
653+ Some ( sym:: off) => result |= SanitizerSet :: THREAD ,
654+ Some ( sym:: on) => result &= !SanitizerSet :: THREAD ,
655+ _ => {
656+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
657+ span : set. span ,
658+ sanitizer : sym:: thread,
659+ } ) ;
660+ }
661+ } ,
662+
663+ [ sym:: hwaddress] => match set. value_str ( ) {
664+ Some ( sym:: off) => result |= SanitizerSet :: HWADDRESS ,
665+ Some ( sym:: on) => result &= !SanitizerSet :: HWADDRESS ,
666+ _ => {
667+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
668+ span : set. span ,
669+ sanitizer : sym:: hwaddress,
670+ } ) ;
671+ }
672+ } ,
629673 _ => {
630- tcx. dcx ( ) . emit_err ( errors:: InvalidSanitize { span : attr. span ( ) } ) ;
674+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizer { span : attr. span ( ) } ) ;
631675 }
632676 }
633677 }
0 commit comments