Skip to content

Commit e327696

Browse files
committed
improve sanitize diagnostics
1 parent 9d0f497 commit e327696

File tree

5 files changed

+117
-51
lines changed

5 files changed

+117
-51
lines changed

compiler/rustc_codegen_ssa/messages.ftl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,12 @@ codegen_ssa_invalid_monomorphization_unsupported_symbol = invalid monomorphizati
169169
170170
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}`
171171
172-
codegen_ssa_invalid_sanitize = invalid argument for `sanitize`
172+
codegen_ssa_invalid_sanitizer = invalid argument for `sanitize`
173173
.note = expected one of: `address`, `kernel_address`, `cfi`, `hwaddress`, `kcfi`, `memory`, `memtag`, `shadow_call_stack`, or `thread`
174174
175+
codegen_ssa_invalid_sanitizer_setting = invalid setting for `{$sanitizer}`
176+
.note = expected one of: {$valid_settings}
177+
175178
codegen_ssa_invalid_windows_subsystem = invalid windows subsystem `{$subsystem}`, only `windows` and `console` are allowed
176179
177180
codegen_ssa_ld64_unimplemented_modifier = `as-needed` modifier not implemented yet for ld64

compiler/rustc_codegen_ssa/src/codegen_attrs.rs

Lines changed: 96 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -589,57 +589,110 @@ fn parse_sanitize_attr(
589589
if let Some(list) = attr.meta_item_list() {
590590
for item in list.iter() {
591591
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() });
593593
break;
594594
};
595595
let segments = set.path.segments.iter().map(|x| x.ident.name).collect::<Vec<_>>();
596+
let on_off_msg = "`on`, or `off`";
596597
match segments.as_slice() {
597598
// Similar to clang, sanitize(address = ..) and
598599
// sanitize(kernel_address = ..) control both ASan and KASan
599600
// 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+
},
641694
_ => {
642-
tcx.dcx().emit_err(errors::InvalidSanitize { span: attr.span() });
695+
tcx.dcx().emit_err(errors::InvalidSanitizer { span: attr.span() });
643696
}
644697
}
645698
}

compiler/rustc_codegen_ssa/src/errors.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,13 +1101,23 @@ impl IntoDiagArg for ExpectedPointerMutability {
11011101
}
11021102

11031103
#[derive(Diagnostic)]
1104-
#[diag(codegen_ssa_invalid_sanitize)]
1104+
#[diag(codegen_ssa_invalid_sanitizer)]
11051105
#[note]
1106-
pub(crate) struct InvalidSanitize {
1106+
pub(crate) struct InvalidSanitizer {
11071107
#[primary_span]
11081108
pub span: Span,
11091109
}
11101110

1111+
#[derive(Diagnostic)]
1112+
#[diag(codegen_ssa_invalid_sanitizer_setting)]
1113+
#[note]
1114+
pub(crate) struct InvalidSanitizerSetting<'a> {
1115+
#[primary_span]
1116+
pub span: Span,
1117+
pub sanitizer: Symbol,
1118+
pub valid_settings: &'a str,
1119+
}
1120+
11111121
#[derive(Diagnostic)]
11121122
#[diag(codegen_ssa_target_feature_safe_trait)]
11131123
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
@@ -42,13 +42,13 @@ LL | #[sanitize(brontosaurus = "off")]
4242
|
4343
= note: expected one of: `address`, `kernel_address`, `cfi`, `hwaddress`, `kcfi`, `memory`, `memtag`, `shadow_call_stack`, or `thread`
4444

45-
error: invalid argument for `sanitize`
46-
--> $DIR/invalid-sanitize.rs:15:1
45+
error: invalid setting for `address`
46+
--> $DIR/invalid-sanitize.rs:15:12
4747
|
4848
LL | #[sanitize(address = "bogus")]
49-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
49+
| ^^^^^^^^^^^^^^^^^
5050
|
51-
= note: expected one of: `address`, `kernel_address`, `cfi`, `hwaddress`, `kcfi`, `memory`, `memtag`, `shadow_call_stack`, or `thread`
51+
= note: expected one of: `on`, or `off`
5252

5353
error: aborting due to 6 previous errors
5454

0 commit comments

Comments
 (0)