Skip to content

Commit 06629f2

Browse files
committed
sanitizers: Add support for stable sanitizers
Add suppport for specifying stable sanitizers in addition to the existing supported sanitizers.
1 parent 1e83852 commit 06629f2

File tree

123 files changed

+326
-249
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

123 files changed

+326
-249
lines changed

compiler/rustc_codegen_llvm/src/abi.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ use rustc_session::config;
1717
use rustc_target::callconv::{
1818
ArgAbi, ArgAttribute, ArgAttributes, ArgExtension, CastTarget, FnAbi, PassMode,
1919
};
20-
use rustc_target::spec::SanitizerSet;
2120
use smallvec::SmallVec;
2221

2322
use crate::attributes::{self, llfn_attrs_from_instance};
@@ -85,7 +84,7 @@ fn get_attrs<'ll>(this: &ArgAttributes, cx: &CodegenCx<'ll, '_>) -> SmallVec<[&'
8584
attrs.push(llattr.create_attr(cx.llcx));
8685
}
8786
}
88-
} else if cx.tcx.sess.opts.unstable_opts.sanitizer.contains(SanitizerSet::MEMORY) {
87+
} else if cx.tcx.sess.is_sanitizer_memory_enabled() {
8988
// If we're not optimising, *but* memory sanitizer is on, emit noundef, since it affects
9089
// memory sanitizer's behavior.
9190

compiler/rustc_codegen_llvm/src/attributes.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ pub(crate) fn sanitize_attrs<'ll>(
102102
no_sanitize: SanitizerSet,
103103
) -> SmallVec<[&'ll Attribute; 4]> {
104104
let mut attrs = SmallVec::new();
105-
let enabled = cx.tcx.sess.opts.unstable_opts.sanitizer - no_sanitize;
105+
let enabled = cx.tcx.sess.opts.cg.sanitize - no_sanitize;
106106
if enabled.contains(SanitizerSet::ADDRESS) || enabled.contains(SanitizerSet::KERNELADDRESS) {
107107
attrs.push(llvm::AttributeKind::SanitizeAddress.create_attr(cx.llcx));
108108
}
@@ -235,13 +235,7 @@ fn probestack_attr<'ll>(cx: &CodegenCx<'ll, '_>) -> Option<&'ll Attribute> {
235235
// Currently stack probes seem somewhat incompatible with the address
236236
// sanitizer and thread sanitizer. With asan we're already protected from
237237
// stack overflow anyway so we don't really need stack probes regardless.
238-
if cx
239-
.sess()
240-
.opts
241-
.unstable_opts
242-
.sanitizer
243-
.intersects(SanitizerSet::ADDRESS | SanitizerSet::THREAD)
244-
{
238+
if cx.sess().is_sanitizer_address_enabled() || cx.sess().is_sanitizer_thread_enabled() {
245239
return None;
246240
}
247241

compiler/rustc_codegen_ssa/src/back/link.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1211,7 +1211,7 @@ fn add_sanitizer_libraries(
12111211
return;
12121212
}
12131213

1214-
let sanitizer = sess.opts.unstable_opts.sanitizer;
1214+
let sanitizer = sess.opts.cg.sanitize;
12151215
if sanitizer.contains(SanitizerSet::ADDRESS) {
12161216
link_sanitizer_runtime(sess, flavor, linker, "asan");
12171217
}
@@ -2466,11 +2466,7 @@ fn add_order_independent_options(
24662466
&& crate_type == CrateType::Executable
24672467
&& !matches!(flavor, LinkerFlavor::Gnu(Cc::Yes, _))
24682468
{
2469-
let prefix = if sess.opts.unstable_opts.sanitizer.contains(SanitizerSet::ADDRESS) {
2470-
"asan/"
2471-
} else {
2472-
""
2473-
};
2469+
let prefix = if sess.is_sanitizer_address_enabled() { "asan/" } else { "" };
24742470
cmd.link_arg(format!("--dynamic-linker={prefix}ld.so.1"));
24752471
}
24762472

compiler/rustc_codegen_ssa/src/back/symbol_export.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use rustc_middle::ty::{self, GenericArgKind, GenericArgsRef, Instance, SymbolNam
1515
use rustc_middle::util::Providers;
1616
use rustc_session::config::{CrateType, OomStrategy};
1717
use rustc_symbol_mangling::mangle_internal_symbol;
18-
use rustc_target::spec::{SanitizerSet, TlsModel};
18+
use rustc_target::spec::TlsModel;
1919
use tracing::debug;
2020

2121
use crate::base::allocator_kind_for_codegen;
@@ -255,15 +255,15 @@ fn exported_symbols_provider_local<'tcx>(
255255
}));
256256
}
257257

258-
if tcx.sess.opts.unstable_opts.sanitizer.contains(SanitizerSet::MEMORY) {
258+
if tcx.sess.is_sanitizer_memory_enabled() {
259259
let mut msan_weak_symbols = Vec::new();
260260

261261
// Similar to profiling, preserve weak msan symbol during LTO.
262-
if tcx.sess.opts.unstable_opts.sanitizer_recover.contains(SanitizerSet::MEMORY) {
262+
if tcx.sess.is_sanitizer_memory_recover_enabled() {
263263
msan_weak_symbols.push("__msan_keep_going");
264264
}
265265

266-
if tcx.sess.opts.unstable_opts.sanitizer_memory_track_origins != 0 {
266+
if tcx.sess.is_sanitizer_memory_track_origins_enabled() {
267267
msan_weak_symbols.push("__msan_track_origins");
268268
}
269269

compiler/rustc_codegen_ssa/src/back/write.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ impl ModuleConfig {
184184
debug_info_for_profiling: sess.opts.unstable_opts.debug_info_for_profiling,
185185
instrument_coverage: if_regular!(sess.instrument_coverage(), false),
186186

187-
sanitizer: if_regular!(sess.opts.unstable_opts.sanitizer, SanitizerSet::empty()),
187+
sanitizer: if_regular!(sess.opts.cg.sanitize, SanitizerSet::empty()),
188188
sanitizer_dataflow_abilist: if_regular!(
189189
sess.opts.unstable_opts.sanitizer_dataflow_abilist.clone(),
190190
Vec::new()

compiler/rustc_interface/src/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,7 @@ fn test_codegen_options_tracking_hash() {
638638
tracked!(profile_use, Some(PathBuf::from("abc")));
639639
tracked!(relocation_model, Some(RelocModel::Pic));
640640
tracked!(relro_level, Some(RelroLevel::Full));
641+
tracked!(sanitize, SanitizerSet::ADDRESS);
641642
tracked!(soft_float, true);
642643
tracked!(split_debuginfo, Some(SplitDebuginfo::Packed));
643644
tracked!(symbol_mangling_version, Some(SymbolManglingVersion::V0));
@@ -853,7 +854,6 @@ fn test_unstable_options_tracking_hash() {
853854
tracked!(regparm, Some(3));
854855
tracked!(relax_elf_relocations, Some(true));
855856
tracked!(remap_cwd_prefix, Some(PathBuf::from("abc")));
856-
tracked!(sanitizer, SanitizerSet::ADDRESS);
857857
tracked!(sanitizer_cfi_canonical_jump_tables, None);
858858
tracked!(sanitizer_cfi_generalize_pointers, Some(true));
859859
tracked!(sanitizer_cfi_normalize_integers, Some(true));

compiler/rustc_metadata/src/native_libs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ pub fn walk_native_lib_search_dirs<R>(
7373
|| sess.target.os == "linux"
7474
|| sess.target.os == "fuchsia"
7575
|| sess.target.is_like_aix
76-
|| sess.target.is_like_darwin && !sess.opts.unstable_opts.sanitizer.is_empty()
76+
|| sess.target.is_like_darwin && !sess.opts.cg.sanitize.is_empty()
7777
{
7878
f(&sess.target_tlib_path.dir, false)?;
7979
}

compiler/rustc_session/messages.ftl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ session_branch_protection_requires_aarch64 = `-Zbranch-protection` is only suppo
99
1010
session_cannot_enable_crt_static_linux = sanitizer is incompatible with statically linked libc, disable it using `-C target-feature=-crt-static`
1111
12-
session_cannot_mix_and_match_sanitizers = `-Zsanitizer={$first}` is incompatible with `-Zsanitizer={$second}`
12+
session_cannot_mix_and_match_sanitizers = `-Csanitize={$first}` is incompatible with `-Csanitize={$second}`
1313
1414
session_cli_feature_diagnostic_help =
1515
add `-Zcrate-attr="feature({$feature})"` to the command-line options to enable
@@ -90,15 +90,15 @@ session_profile_sample_use_file_does_not_exist = file `{$path}` passed to `-C pr
9090
9191
session_profile_use_file_does_not_exist = file `{$path}` passed to `-C profile-use` does not exist
9292
93-
session_sanitizer_cfi_canonical_jump_tables_requires_cfi = `-Zsanitizer-cfi-canonical-jump-tables` requires `-Zsanitizer=cfi`
93+
session_sanitizer_cfi_canonical_jump_tables_requires_cfi = `-Zsanitizer-cfi-canonical-jump-tables` requires `-Csanitize=cfi`
9494
95-
session_sanitizer_cfi_generalize_pointers_requires_cfi = `-Zsanitizer-cfi-generalize-pointers` requires `-Zsanitizer=cfi` or `-Zsanitizer=kcfi`
95+
session_sanitizer_cfi_generalize_pointers_requires_cfi = `-Zsanitizer-cfi-generalize-pointers` requires `-Csanitize=cfi` or `-Csanitize=kcfi`
9696
97-
session_sanitizer_cfi_normalize_integers_requires_cfi = `-Zsanitizer-cfi-normalize-integers` requires `-Zsanitizer=cfi` or `-Zsanitizer=kcfi`
97+
session_sanitizer_cfi_normalize_integers_requires_cfi = `-Zsanitizer-cfi-normalize-integers` requires `-Csanitize=cfi` or `-Csanitize=kcfi`
9898
99-
session_sanitizer_cfi_requires_lto = `-Zsanitizer=cfi` requires `-Clto` or `-Clinker-plugin-lto`
99+
session_sanitizer_cfi_requires_lto = `-Csanitize=cfi` requires `-Clto` or `-Clinker-plugin-lto`
100100
101-
session_sanitizer_cfi_requires_single_codegen_unit = `-Zsanitizer=cfi` with `-Clto` requires `-Ccodegen-units=1`
101+
session_sanitizer_cfi_requires_single_codegen_unit = `-Csanitize=cfi` with `-Clto` requires `-Ccodegen-units=1`
102102
103103
session_sanitizer_kcfi_arity_requires_kcfi = `-Zsanitizer-kcfi-arity` requires `-Zsanitizer=kcfi`
104104

compiler/rustc_session/src/config/cfg.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ pub(crate) fn default_configuration(sess: &Session) -> Cfg {
216216
ins_sym!(sym::relocation_model, sess.target.relocation_model.desc_symbol());
217217
}
218218

219-
for mut s in sess.opts.unstable_opts.sanitizer {
219+
for mut s in sess.opts.cg.sanitize {
220220
// KASAN is still ASAN under the hood, so it uses the same attribute.
221221
if s == SanitizerSet::KERNELADDRESS {
222222
s = SanitizerSet::ADDRESS;

compiler/rustc_session/src/options.rs

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,25 +1170,14 @@ pub mod parse {
11701170
}
11711171

11721172
pub(crate) fn parse_sanitizers(slot: &mut SanitizerSet, v: Option<&str>) -> bool {
1173-
if let Some(v) = v {
1174-
for s in v.split(',') {
1175-
*slot |= match s {
1176-
"address" => SanitizerSet::ADDRESS,
1177-
"cfi" => SanitizerSet::CFI,
1178-
"dataflow" => SanitizerSet::DATAFLOW,
1179-
"kcfi" => SanitizerSet::KCFI,
1180-
"kernel-address" => SanitizerSet::KERNELADDRESS,
1181-
"leak" => SanitizerSet::LEAK,
1182-
"memory" => SanitizerSet::MEMORY,
1183-
"memtag" => SanitizerSet::MEMTAG,
1184-
"shadow-call-stack" => SanitizerSet::SHADOWCALLSTACK,
1185-
"thread" => SanitizerSet::THREAD,
1186-
"hwaddress" => SanitizerSet::HWADDRESS,
1187-
"safestack" => SanitizerSet::SAFESTACK,
1188-
_ => return false,
1189-
}
1173+
if let Some(s) = v {
1174+
let sanitizer_set = SanitizerSet::from_comma_list(s);
1175+
if sanitizer_set.is_ok() {
1176+
*slot |= sanitizer_set.unwrap();
1177+
true
1178+
} else {
1179+
false
11901180
}
1191-
true
11921181
} else {
11931182
false
11941183
}
@@ -2066,6 +2055,8 @@ options! {
20662055
"output remarks for these optimization passes (space separated, or \"all\")"),
20672056
rpath: bool = (false, parse_bool, [UNTRACKED],
20682057
"set rpath values in libs/exes (default: no)"),
2058+
sanitize: SanitizerSet = (SanitizerSet::empty(), parse_sanitizers, [TRACKED],
2059+
"use one or multiple sanitizers"),
20692060
save_temps: bool = (false, parse_bool, [UNTRACKED],
20702061
"save all temporary output files during compilation (default: no)"),
20712062
soft_float: bool = (false, parse_bool, [TRACKED],
@@ -2476,8 +2467,6 @@ written to standard error output)"),
24762467
retpoline_external_thunk: bool = (false, parse_bool, [TRACKED TARGET_MODIFIER],
24772468
"enables retpoline-external-thunk, retpoline-indirect-branches and retpoline-indirect-calls \
24782469
target features (default: no)"),
2479-
sanitizer: SanitizerSet = (SanitizerSet::empty(), parse_sanitizers, [TRACKED],
2480-
"use a sanitizer"),
24812470
sanitizer_cfi_canonical_jump_tables: Option<bool> = (Some(true), parse_opt_bool, [TRACKED],
24822471
"enable canonical jump tables (default: yes)"),
24832472
sanitizer_cfi_generalize_pointers: Option<bool> = (None, parse_opt_bool, [TRACKED],

0 commit comments

Comments
 (0)