@@ -589,57 +589,110 @@ 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 < _ > > ( ) ;
596+ let on_off_msg = "`on`, or `off`" ;
596597 match segments. as_slice ( ) {
597598 // Similar to clang, sanitize(address = ..) and
598599 // sanitize(kernel_address = ..) control both ASan and KASan
599600 // 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- }
601+ [ sym:: address] | [ sym:: kernel_address] => match set. value_str ( ) {
602+ Some ( sym:: off) => result |= SanitizerSet :: ADDRESS | SanitizerSet :: KERNELADDRESS ,
603+ Some ( sym:: on) => {
604+ result &= !SanitizerSet :: ADDRESS ;
605+ result &= !SanitizerSet :: KERNELADDRESS ;
606+ }
607+ _ => {
608+ let sanitizer = segments. as_slice ( ) [ 0 ] ;
609+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
610+ span : set. span ,
611+ sanitizer,
612+ valid_settings : on_off_msg,
613+ } ) ;
614+ }
615+ } ,
616+ [ sym:: cfi] => match set. value_str ( ) {
617+ Some ( sym:: off) => result |= SanitizerSet :: CFI ,
618+ Some ( sym:: on) => result &= !SanitizerSet :: CFI ,
619+ _ => {
620+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
621+ span : set. span ,
622+ sanitizer : sym:: cfi,
623+ valid_settings : on_off_msg,
624+ } ) ;
625+ }
626+ } ,
627+ [ sym:: kcfi] => match set. value_str ( ) {
628+ Some ( sym:: off) => result |= SanitizerSet :: KCFI ,
629+ Some ( sym:: on) => result &= !SanitizerSet :: KCFI ,
630+ _ => {
631+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
632+ span : set. span ,
633+ sanitizer : sym:: kcfi,
634+ valid_settings : on_off_msg,
635+ } ) ;
636+ }
637+ } ,
638+ [ sym:: memory] => match set. value_str ( ) {
639+ Some ( sym:: off) => result |= SanitizerSet :: MEMORY ,
640+ Some ( sym:: on) => result &= !SanitizerSet :: MEMORY ,
641+ _ => {
642+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
643+ span : set. span ,
644+ sanitizer : sym:: memory,
645+ valid_settings : on_off_msg,
646+ } ) ;
647+ }
648+ } ,
649+ [ sym:: memtag] => match set. value_str ( ) {
650+ Some ( sym:: off) => result |= SanitizerSet :: MEMTAG ,
651+ Some ( sym:: on) => result &= !SanitizerSet :: MEMTAG ,
652+ _ => {
653+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
654+ span : set. span ,
655+ sanitizer : sym:: memtag,
656+ valid_settings : on_off_msg,
657+ } ) ;
658+ }
659+ } ,
660+ [ sym:: shadow_call_stack] => match set. value_str ( ) {
661+ Some ( sym:: off) => result |= SanitizerSet :: SHADOWCALLSTACK ,
662+ Some ( sym:: on) => result &= !SanitizerSet :: SHADOWCALLSTACK ,
663+ _ => {
664+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
665+ span : set. span ,
666+ sanitizer : sym:: shadow_call_stack,
667+ valid_settings : on_off_msg,
668+ } ) ;
669+ }
670+ } ,
671+ [ sym:: thread] => match set. value_str ( ) {
672+ Some ( sym:: off) => result |= SanitizerSet :: THREAD ,
673+ Some ( sym:: on) => result &= !SanitizerSet :: THREAD ,
674+ _ => {
675+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
676+ span : set. span ,
677+ sanitizer : sym:: thread,
678+ valid_settings : on_off_msg,
679+ } ) ;
680+ }
681+ } ,
682+
683+ [ sym:: hwaddress] => match set. value_str ( ) {
684+ Some ( sym:: off) => result |= SanitizerSet :: HWADDRESS ,
685+ Some ( sym:: on) => result &= !SanitizerSet :: HWADDRESS ,
686+ _ => {
687+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizerSetting {
688+ span : set. span ,
689+ sanitizer : sym:: hwaddress,
690+ valid_settings : on_off_msg,
691+ } ) ;
692+ }
693+ } ,
641694 _ => {
642- tcx. dcx ( ) . emit_err ( errors:: InvalidSanitize { span : attr. span ( ) } ) ;
695+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizer { span : attr. span ( ) } ) ;
643696 }
644697 }
645698 }
0 commit comments