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