@@ -589,57 +589,101 @@ fn parse_sanitize_attr(
589
589
if let Some ( list) = attr. meta_item_list ( ) {
590
590
for item in list. iter ( ) {
591
591
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 ( ) } ) ;
593
593
break ;
594
594
} ;
595
595
let segments = set. path . segments . iter ( ) . map ( |x| x. ident . name ) . collect :: < Vec < _ > > ( ) ;
596
596
match segments. as_slice ( ) {
597
597
// Similar to clang, sanitize(address = ..) and
598
598
// sanitize(kernel_address = ..) control both ASan and KASan
599
599
// 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
+ } ,
641
685
_ => {
642
- tcx. dcx ( ) . emit_err ( errors:: InvalidSanitize { span : attr. span ( ) } ) ;
686
+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizer { span : attr. span ( ) } ) ;
643
687
}
644
688
}
645
689
}
0 commit comments