@@ -589,57 +589,110 @@ 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
+ let on_off_msg = "`on`, or `off`" ;
596
597
match segments. as_slice ( ) {
597
598
// Similar to clang, sanitize(address = ..) and
598
599
// sanitize(kernel_address = ..) control both ASan and KASan
599
600
// 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
+ } ,
641
694
_ => {
642
- tcx. dcx ( ) . emit_err ( errors:: InvalidSanitize { span : attr. span ( ) } ) ;
695
+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizer { span : attr. span ( ) } ) ;
643
696
}
644
697
}
645
698
}
0 commit comments