Skip to content

Commit cf64064

Browse files
committed
improve sanitize diagnostics
1 parent 90c564e commit cf64064

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
@@ -577,57 +577,101 @@ fn parse_sanitize_attr(
577577
if let Some(list) = attr.meta_item_list() {
578578
for item in list.iter() {
579579
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() });
581581
break;
582582
};
583583
let segments = set.path.segments.iter().map(|x| x.ident.name).collect::<Vec<_>>();
584584
match segments.as_slice() {
585585
// Similar to clang, sanitize(address = ..) and
586586
// sanitize(kernel_address = ..) control both ASan and KASan
587587
// 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+
},
629673
_ => {
630-
tcx.dcx().emit_err(errors::InvalidSanitize { span: attr.span() });
674+
tcx.dcx().emit_err(errors::InvalidSanitizer { span: attr.span() });
631675
}
632676
}
633677
}

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)