Skip to content

Commit 2b7dbe6

Browse files
committed
improve sanitize diagnostics
1 parent 9d0f497 commit 2b7dbe6

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
@@ -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: `on`, or `off`
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: 87 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -589,57 +589,101 @@ 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<_>>();
596596
match segments.as_slice() {
597597
// Similar to clang, sanitize(address = ..) and
598598
// sanitize(kernel_address = ..) control both ASan and KASan
599599
// 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-
}
600+
[sym::address] | [sym::kernel_address] => match set.value_str() {
601+
Some(sym::off) => result |= SanitizerSet::ADDRESS | SanitizerSet::KERNELADDRESS,
602+
Some(sym::on) => {
603+
result &= !SanitizerSet::ADDRESS;
604+
result &= !SanitizerSet::KERNELADDRESS;
605+
}
606+
_ => {
607+
let sanitizer = segments.as_slice()[0];
608+
tcx.dcx().emit_err(errors::InvalidSanitizerSetting {
609+
span: set.span,
610+
sanitizer,
611+
});
612+
}
613+
},
614+
[sym::cfi] => match set.value_str() {
615+
Some(sym::off) => result |= SanitizerSet::CFI,
616+
Some(sym::on) => result &= !SanitizerSet::CFI,
617+
_ => {
618+
tcx.dcx().emit_err(errors::InvalidSanitizerSetting {
619+
span: set.span,
620+
sanitizer: sym::cfi,
621+
});
622+
}
623+
},
624+
[sym::kcfi] => match set.value_str() {
625+
Some(sym::off) => result |= SanitizerSet::KCFI,
626+
Some(sym::on) => result &= !SanitizerSet::KCFI,
627+
_ => {
628+
tcx.dcx().emit_err(errors::InvalidSanitizerSetting {
629+
span: set.span,
630+
sanitizer: sym::kcfi,
631+
});
632+
}
633+
},
634+
[sym::memory] => match set.value_str() {
635+
Some(sym::off) => result |= SanitizerSet::MEMORY,
636+
Some(sym::on) => result &= !SanitizerSet::MEMORY,
637+
_ => {
638+
tcx.dcx().emit_err(errors::InvalidSanitizerSetting {
639+
span: set.span,
640+
sanitizer: sym::memory,
641+
});
642+
}
643+
},
644+
[sym::memtag] => match set.value_str() {
645+
Some(sym::off) => result |= SanitizerSet::MEMTAG,
646+
Some(sym::on) => result &= !SanitizerSet::MEMTAG,
647+
_ => {
648+
tcx.dcx().emit_err(errors::InvalidSanitizerSetting {
649+
span: set.span,
650+
sanitizer: sym::memtag,
651+
});
652+
}
653+
},
654+
[sym::shadow_call_stack] => match set.value_str() {
655+
Some(sym::off) => result |= SanitizerSet::SHADOWCALLSTACK,
656+
Some(sym::on) => result &= !SanitizerSet::SHADOWCALLSTACK,
657+
_ => {
658+
tcx.dcx().emit_err(errors::InvalidSanitizerSetting {
659+
span: set.span,
660+
sanitizer: sym::shadow_call_stack,
661+
});
662+
}
663+
},
664+
[sym::thread] => match set.value_str() {
665+
Some(sym::off) => result |= SanitizerSet::THREAD,
666+
Some(sym::on) => result &= !SanitizerSet::THREAD,
667+
_ => {
668+
tcx.dcx().emit_err(errors::InvalidSanitizerSetting {
669+
span: set.span,
670+
sanitizer: sym::thread,
671+
});
672+
}
673+
},
674+
675+
[sym::hwaddress] => match set.value_str() {
676+
Some(sym::off) => result |= SanitizerSet::HWADDRESS,
677+
Some(sym::on) => result &= !SanitizerSet::HWADDRESS,
678+
_ => {
679+
tcx.dcx().emit_err(errors::InvalidSanitizerSetting {
680+
span: set.span,
681+
sanitizer: sym::hwaddress,
682+
});
683+
}
684+
},
641685
_ => {
642-
tcx.dcx().emit_err(errors::InvalidSanitize { span: attr.span() });
686+
tcx.dcx().emit_err(errors::InvalidSanitizer { span: attr.span() });
643687
}
644688
}
645689
}

compiler/rustc_codegen_ssa/src/errors.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,13 +1101,22 @@ 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 {
1115+
#[primary_span]
1116+
pub span: Span,
1117+
pub sanitizer: Symbol,
1118+
}
1119+
11111120
#[derive(Diagnostic)]
11121121
#[diag(codegen_ssa_target_feature_safe_trait)]
11131122
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)