Skip to content

Commit afc3b7f

Browse files
committed
improve sanitize diagnostics
1 parent 8365fcb commit afc3b7f

File tree

5 files changed

+107
-51
lines changed

5 files changed

+107
-51
lines changed

compiler/rustc_codegen_ssa/messages.ftl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,12 @@ codegen_ssa_invalid_monomorphization_unsupported_symbol = invalid monomorphizati
171171
172172
codegen_ssa_invalid_monomorphization_unsupported_symbol_of_size = invalid monomorphization of `{$name}` intrinsic: unsupported {$symbol} from `{$in_ty}` with element `{$in_elem}` of size `{$size}` to `{$ret_ty}`
173173
174-
codegen_ssa_invalid_sanitize = invalid argument for `sanitize`
174+
codegen_ssa_invalid_sanitizer = invalid argument for `sanitize`
175175
.note = expected one of: `address`, `kernel_address`, `cfi`, `hwaddress`, `kcfi`, `memory`, `memtag`, `shadow_call_stack`, or `thread`
176176
177+
codegen_ssa_invalid_sanitizer_setting = invalid setting for `{$sanitizer}`
178+
.note = expected one of: `on`, or `off`
179+
177180
codegen_ssa_invalid_windows_subsystem = invalid windows subsystem `{$subsystem}`, only `windows` and `console` are allowed
178181
179182
codegen_ssa_ld64_unimplemented_modifier = `as-needed` modifier not implemented yet for ld64

compiler/rustc_codegen_ssa/src/codegen_attrs.rs

Lines changed: 87 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

compiler/rustc_codegen_ssa/src/errors.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,13 +1121,22 @@ impl IntoDiagArg for ExpectedPointerMutability {
11211121
}
11221122

11231123
#[derive(Diagnostic)]
1124-
#[diag(codegen_ssa_invalid_sanitize)]
1124+
#[diag(codegen_ssa_invalid_sanitizer)]
11251125
#[note]
1126-
pub(crate) struct InvalidSanitize {
1126+
pub(crate) struct InvalidSanitizer {
11271127
#[primary_span]
11281128
pub span: Span,
11291129
}
11301130

1131+
#[derive(Diagnostic)]
1132+
#[diag(codegen_ssa_invalid_sanitizer_setting)]
1133+
#[note]
1134+
pub(crate) struct InvalidSanitizerSetting {
1135+
#[primary_span]
1136+
pub span: Span,
1137+
pub sanitizer: Symbol,
1138+
}
1139+
11311140
#[derive(Diagnostic)]
11321141
#[diag(codegen_ssa_target_feature_safe_trait)]
11331142
pub(crate) struct TargetFeatureSafeTrait {

tests/ui/sanitize-attr/invalid-sanitize.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ fn multiple_consistent() {}
1212
#[sanitize(address = "off")]
1313
fn multiple_inconsistent() {}
1414

15-
#[sanitize(address = "bogus")] //~ ERROR invalid argument for `sanitize`
15+
#[sanitize(address = "bogus")] //~ ERROR invalid setting for `address`
1616
fn wrong_value() {}
1717

1818
#[sanitize = "off"] //~ ERROR malformed `sanitize` attribute input

tests/ui/sanitize-attr/invalid-sanitize.stderr

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,13 @@ LL | #[sanitize(brontosaurus = "off")]
7070
|
7171
= note: expected one of: `address`, `kernel_address`, `cfi`, `hwaddress`, `kcfi`, `memory`, `memtag`, `shadow_call_stack`, or `thread`
7272

73-
error: invalid argument for `sanitize`
74-
--> $DIR/invalid-sanitize.rs:15:1
73+
error: invalid setting for `address`
74+
--> $DIR/invalid-sanitize.rs:15:12
7575
|
7676
LL | #[sanitize(address = "bogus")]
77-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
77+
| ^^^^^^^^^^^^^^^^^
7878
|
79-
= note: expected one of: `address`, `kernel_address`, `cfi`, `hwaddress`, `kcfi`, `memory`, `memtag`, `shadow_call_stack`, or `thread`
79+
= note: expected one of: `on`, or `off`
8080

8181
error: aborting due to 6 previous errors
8282

0 commit comments

Comments
 (0)