@@ -569,57 +569,101 @@ fn parse_sanitize_attr(
569
569
if let Some ( list) = attr. meta_item_list ( ) {
570
570
for item in list. iter ( ) {
571
571
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 ( ) } ) ;
573
573
break ;
574
574
} ;
575
575
let segments = set. path . segments . iter ( ) . map ( |x| x. ident . name ) . collect :: < Vec < _ > > ( ) ;
576
576
match segments. as_slice ( ) {
577
577
// Similar to clang, sanitize(address = ..) and
578
578
// sanitize(kernel_address = ..) control both ASan and KASan
579
579
// 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
+ } ,
621
665
_ => {
622
- tcx. dcx ( ) . emit_err ( errors:: InvalidSanitize { span : attr. span ( ) } ) ;
666
+ tcx. dcx ( ) . emit_err ( errors:: InvalidSanitizer { span : attr. span ( ) } ) ;
623
667
}
624
668
}
625
669
}
0 commit comments