@@ -577,57 +577,101 @@ fn parse_sanitize_attr(
577
577
if let Some ( list) = attr. meta_item_list ( ) {
578
578
for item in list. iter ( ) {
579
579
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 ( ) } ) ;
581
581
break ;
582
582
} ;
583
583
let segments = set. path . segments . iter ( ) . map ( |x| x. ident . name ) . collect :: < Vec < _ > > ( ) ;
584
584
match segments. as_slice ( ) {
585
585
// Similar to clang, sanitize(address = ..) and
586
586
// sanitize(kernel_address = ..) control both ASan and KASan
587
587
// 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
+ } ,
629
673
_ => {
630
- tcx. dcx ( ) . emit_err ( errors:: InvalidSanitize { span : attr. span ( ) } ) ;
674
+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizer { span : attr. span ( ) } ) ;
631
675
}
632
676
}
633
677
}
0 commit comments