From 8af3b93cfc48e2f5391a2079649b75aeb15cf809 Mon Sep 17 00:00:00 2001 From: Ramon de C Valle Date: Tue, 6 Aug 2024 15:42:33 -0700 Subject: [PATCH] sanitizers: Stabilize the `no_sanitize` attribute Stabilize the `no_sanitize` attribute so stable sanitizers can also be selectively disabled for annotated functions. --- compiler/rustc_feature/src/accepted.rs | 2 ++ compiler/rustc_feature/src/builtin_attrs.rs | 4 +-- compiler/rustc_feature/src/unstable.rs | 2 -- compiler/rustc_lint_defs/src/builtin.rs | 2 -- library/core/src/lib.rs | 2 ++ library/std/src/lib.rs | 2 ++ .../src/language-features/no-sanitize.md | 29 ------------------- .../cfi/emit-type-checks-attr-no-sanitize.rs | 1 - .../codegen/sanitizer/no-sanitize-inlining.rs | 2 -- tests/codegen/sanitizer/no-sanitize.rs | 2 -- tests/codegen/sanitizer/scs-attr-check.rs | 2 -- tests/mir-opt/inline/inline_compatibility.rs | 1 - .../feature-gates/feature-gate-no_sanitize.rs | 4 --- .../feature-gate-no_sanitize.stderr | 13 --------- tests/ui/invalid/invalid-no-sanitize.rs | 2 -- tests/ui/invalid/invalid-no-sanitize.stderr | 2 +- tests/ui/sanitizer/inline-always.rs | 2 -- tests/ui/sanitizer/inline-always.stderr | 4 +-- 18 files changed, 11 insertions(+), 67 deletions(-) delete mode 100644 src/doc/unstable-book/src/language-features/no-sanitize.md delete mode 100644 tests/ui/feature-gates/feature-gate-no_sanitize.rs delete mode 100644 tests/ui/feature-gates/feature-gate-no_sanitize.stderr diff --git a/compiler/rustc_feature/src/accepted.rs b/compiler/rustc_feature/src/accepted.rs index e42a655531b5d..49f558344c87e 100644 --- a/compiler/rustc_feature/src/accepted.rs +++ b/compiler/rustc_feature/src/accepted.rs @@ -284,6 +284,8 @@ declare_features! ( (accepted, native_link_modifiers_whole_archive, "1.61.0", Some(81490)), /// Allows using non lexical lifetimes (RFC 2094). (accepted, nll, "1.63.0", Some(43234)), + /// Allows the use of `no_sanitize` attribute. + (accepted, no_sanitize, "CURRENT_RUSTC_VERSION", Some(39699)), /// Allows using `#![no_std]`. (accepted, no_std, "1.6.0", None), /// Allows defining identifiers beyond ASCII. diff --git a/compiler/rustc_feature/src/builtin_attrs.rs b/compiler/rustc_feature/src/builtin_attrs.rs index 72ea55d5999a2..2182d3b5f0033 100644 --- a/compiler/rustc_feature/src/builtin_attrs.rs +++ b/compiler/rustc_feature/src/builtin_attrs.rs @@ -475,10 +475,10 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ ), ungated!(track_caller, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes), ungated!(instruction_set, Normal, template!(List: "set"), ErrorPreceding, EncodeCrossCrate::No), - gated!( + ungated!( no_sanitize, Normal, template!(List: "address, kcfi, memory, thread"), DuplicatesOk, - EncodeCrossCrate::No, experimental!(no_sanitize) + EncodeCrossCrate::No ), gated!( coverage, Normal, template!(OneOf: &[sym::off, sym::on]), diff --git a/compiler/rustc_feature/src/unstable.rs b/compiler/rustc_feature/src/unstable.rs index 88a4b5a838246..ad859e13c5832 100644 --- a/compiler/rustc_feature/src/unstable.rs +++ b/compiler/rustc_feature/src/unstable.rs @@ -546,8 +546,6 @@ declare_features! ( (unstable, never_type_fallback, "1.41.0", Some(65992)), /// Allows `#![no_core]`. (unstable, no_core, "1.3.0", Some(29639)), - /// Allows the use of `no_sanitize` attribute. - (unstable, no_sanitize, "1.42.0", Some(39699)), /// Allows using the `non_exhaustive_omitted_patterns` lint. (unstable, non_exhaustive_omitted_patterns_lint, "1.57.0", Some(89554)), /// Allows `for` binders in where-clauses diff --git a/compiler/rustc_lint_defs/src/builtin.rs b/compiler/rustc_lint_defs/src/builtin.rs index ff0bdfcc9d261..23afc05a25823 100644 --- a/compiler/rustc_lint_defs/src/builtin.rs +++ b/compiler/rustc_lint_defs/src/builtin.rs @@ -2457,8 +2457,6 @@ declare_lint! { /// ### Example /// /// ```rust - /// #![feature(no_sanitize)] - /// /// #[inline(always)] /// #[no_sanitize(address)] /// fn x() {} diff --git a/library/core/src/lib.rs b/library/core/src/lib.rs index e74900ff7471b..b6483292ef80b 100644 --- a/library/core/src/lib.rs +++ b/library/core/src/lib.rs @@ -104,6 +104,8 @@ // Do not check link redundancy on bootstraping phase #![allow(rustdoc::redundant_explicit_links)] #![warn(rustdoc::unescaped_backticks)] +// FIXME: Remove after `no_sanitize` stabilization (along with `#![feature(no_sanitize)]`) +#![allow(stable_features)] // // Library features: // tidy-alphabetical-start diff --git a/library/std/src/lib.rs b/library/std/src/lib.rs index 67405d788bd9b..0c6c237df9adb 100644 --- a/library/std/src/lib.rs +++ b/library/std/src/lib.rs @@ -259,6 +259,8 @@ #![deny(ffi_unwind_calls)] // std may use features in a platform-specific way #![allow(unused_features)] +// FIXME: Remove after `no_sanitize` stabilization (along with `#![feature(no_sanitize)]`) +#![allow(stable_features)] // // Features: #![cfg_attr(test, feature(internal_output_capture, print_internals, update_panic_count, rt))] diff --git a/src/doc/unstable-book/src/language-features/no-sanitize.md b/src/doc/unstable-book/src/language-features/no-sanitize.md deleted file mode 100644 index 28c683934d4ed..0000000000000 --- a/src/doc/unstable-book/src/language-features/no-sanitize.md +++ /dev/null @@ -1,29 +0,0 @@ -# `no_sanitize` - -The tracking issue for this feature is: [#39699] - -[#39699]: https://github.com/rust-lang/rust/issues/39699 - ------------------------- - -The `no_sanitize` attribute can be used to selectively disable sanitizer -instrumentation in an annotated function. This might be useful to: avoid -instrumentation overhead in a performance critical function, or avoid -instrumenting code that contains constructs unsupported by given sanitizer. - -The precise effect of this annotation depends on particular sanitizer in use. -For example, with `no_sanitize(thread)`, the thread sanitizer will no longer -instrument non-atomic store / load operations, but it will instrument atomic -operations to avoid reporting false positives and provide meaning full stack -traces. - -## Examples - -``` rust -#![feature(no_sanitize)] - -#[no_sanitize(address)] -fn foo() { - // ... -} -``` diff --git a/tests/codegen/sanitizer/cfi/emit-type-checks-attr-no-sanitize.rs b/tests/codegen/sanitizer/cfi/emit-type-checks-attr-no-sanitize.rs index 7b50ee77679da..a9a91339795b4 100644 --- a/tests/codegen/sanitizer/cfi/emit-type-checks-attr-no-sanitize.rs +++ b/tests/codegen/sanitizer/cfi/emit-type-checks-attr-no-sanitize.rs @@ -4,7 +4,6 @@ //@ compile-flags: -Clto -Cno-prepopulate-passes -Ctarget-feature=-crt-static -Zunstable-options -Csanitize=cfi -Copt-level=0 #![crate_type = "lib"] -#![feature(no_sanitize)] #[no_sanitize(cfi)] pub fn foo(f: fn(i32) -> i32, arg: i32) -> i32 { diff --git a/tests/codegen/sanitizer/no-sanitize-inlining.rs b/tests/codegen/sanitizer/no-sanitize-inlining.rs index 55689a2d6d31e..b813ff584a8f0 100644 --- a/tests/codegen/sanitizer/no-sanitize-inlining.rs +++ b/tests/codegen/sanitizer/no-sanitize-inlining.rs @@ -9,8 +9,6 @@ //@[LSAN] compile-flags: -Zunstable-options -Csanitize=leak #![crate_type = "lib"] -#![feature(no_sanitize)] - // ASAN-LABEL: define void @test // ASAN: call {{.*}} @random_inline // ASAN: } diff --git a/tests/codegen/sanitizer/no-sanitize.rs b/tests/codegen/sanitizer/no-sanitize.rs index 477418d35db73..e5b8bb4c9120e 100644 --- a/tests/codegen/sanitizer/no-sanitize.rs +++ b/tests/codegen/sanitizer/no-sanitize.rs @@ -5,8 +5,6 @@ //@ compile-flags: -Zunstable-options -Csanitize=address -Ctarget-feature=-crt-static -Copt-level=0 #![crate_type = "lib"] -#![feature(no_sanitize)] - // CHECK-LABEL: ; no_sanitize::unsanitized // CHECK-NEXT: ; Function Attrs: // CHECK-NOT: sanitize_address diff --git a/tests/codegen/sanitizer/scs-attr-check.rs b/tests/codegen/sanitizer/scs-attr-check.rs index 4c23dab7a5360..f0f593e810fb8 100644 --- a/tests/codegen/sanitizer/scs-attr-check.rs +++ b/tests/codegen/sanitizer/scs-attr-check.rs @@ -5,8 +5,6 @@ //@ compile-flags: -Zunstable-options -Csanitize=shadow-call-stack #![crate_type = "lib"] -#![feature(no_sanitize)] - // CHECK: ; sanitizer_scs_attr_check::scs // CHECK-NEXT: ; Function Attrs:{{.*}}shadowcallstack pub fn scs() {} diff --git a/tests/mir-opt/inline/inline_compatibility.rs b/tests/mir-opt/inline/inline_compatibility.rs index 13f28aaacd6a7..d7d7bc773a2ed 100644 --- a/tests/mir-opt/inline/inline_compatibility.rs +++ b/tests/mir-opt/inline/inline_compatibility.rs @@ -3,7 +3,6 @@ //@ compile-flags: -Cpanic=abort #![crate_type = "lib"] -#![feature(no_sanitize)] #![feature(target_feature_11)] #![feature(c_variadic)] diff --git a/tests/ui/feature-gates/feature-gate-no_sanitize.rs b/tests/ui/feature-gates/feature-gate-no_sanitize.rs deleted file mode 100644 index 66a9263e13a53..0000000000000 --- a/tests/ui/feature-gates/feature-gate-no_sanitize.rs +++ /dev/null @@ -1,4 +0,0 @@ -#[no_sanitize(address)] -//~^ the `#[no_sanitize]` attribute is an experimental feature -fn main() { -} diff --git a/tests/ui/feature-gates/feature-gate-no_sanitize.stderr b/tests/ui/feature-gates/feature-gate-no_sanitize.stderr deleted file mode 100644 index a33bf6a9e40c1..0000000000000 --- a/tests/ui/feature-gates/feature-gate-no_sanitize.stderr +++ /dev/null @@ -1,13 +0,0 @@ -error[E0658]: the `#[no_sanitize]` attribute is an experimental feature - --> $DIR/feature-gate-no_sanitize.rs:1:1 - | -LL | #[no_sanitize(address)] - | ^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #39699 for more information - = help: add `#![feature(no_sanitize)]` to the crate attributes to enable - = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date - -error: aborting due to 1 previous error - -For more information about this error, try `rustc --explain E0658`. diff --git a/tests/ui/invalid/invalid-no-sanitize.rs b/tests/ui/invalid/invalid-no-sanitize.rs index b52e3cc83fab2..14e4e797d2f4b 100644 --- a/tests/ui/invalid/invalid-no-sanitize.rs +++ b/tests/ui/invalid/invalid-no-sanitize.rs @@ -1,5 +1,3 @@ -#![feature(no_sanitize)] - #[no_sanitize(brontosaurus)] //~ ERROR invalid argument fn main() { } diff --git a/tests/ui/invalid/invalid-no-sanitize.stderr b/tests/ui/invalid/invalid-no-sanitize.stderr index b1c80438b318d..630282290e903 100644 --- a/tests/ui/invalid/invalid-no-sanitize.stderr +++ b/tests/ui/invalid/invalid-no-sanitize.stderr @@ -1,5 +1,5 @@ error: invalid argument for `no_sanitize` - --> $DIR/invalid-no-sanitize.rs:3:15 + --> $DIR/invalid-no-sanitize.rs:1:15 | LL | #[no_sanitize(brontosaurus)] | ^^^^^^^^^^^^ diff --git a/tests/ui/sanitizer/inline-always.rs b/tests/ui/sanitizer/inline-always.rs index d92daee3026a6..6480f43e51c04 100644 --- a/tests/ui/sanitizer/inline-always.rs +++ b/tests/ui/sanitizer/inline-always.rs @@ -1,7 +1,5 @@ //@ check-pass -#![feature(no_sanitize)] - #[inline(always)] //~^ NOTE inlining requested here #[no_sanitize(address)] diff --git a/tests/ui/sanitizer/inline-always.stderr b/tests/ui/sanitizer/inline-always.stderr index 74fba3c0e0e59..aeb5933773bd1 100644 --- a/tests/ui/sanitizer/inline-always.stderr +++ b/tests/ui/sanitizer/inline-always.stderr @@ -1,11 +1,11 @@ warning: `no_sanitize` will have no effect after inlining - --> $DIR/inline-always.rs:7:1 + --> $DIR/inline-always.rs:5:1 | LL | #[no_sanitize(address)] | ^^^^^^^^^^^^^^^^^^^^^^^ | note: inlining requested here - --> $DIR/inline-always.rs:5:1 + --> $DIR/inline-always.rs:3:1 | LL | #[inline(always)] | ^^^^^^^^^^^^^^^^^