Skip to content

Commit 99913dd

Browse files
author
Ariel Ben-Yehuda
committed
allow denying mitigations in earlier editions
1 parent 383ca61 commit 99913dd

File tree

9 files changed

+91
-25
lines changed

9 files changed

+91
-25
lines changed

compiler/rustc_metadata/src/creader.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ use rustc_middle::ty::data_structures::IndexSet;
2525
use rustc_middle::ty::{TyCtxt, TyCtxtFeed};
2626
use rustc_proc_macro::bridge::client::ProcMacro;
2727
use rustc_session::Session;
28+
use rustc_session::config::enforced_mitigations::EnforcedMitigationLevel;
2829
use rustc_session::config::{
29-
CrateType, EnforcedMitigationLevel, ExtendedTargetModifierInfo, ExternLocation, Externs,
30-
OptionsTargetModifiers, TargetModifier,
30+
CrateType, ExtendedTargetModifierInfo, ExternLocation, Externs, OptionsTargetModifiers,
31+
TargetModifier,
3132
};
3233
use rustc_session::cstore::{CrateDepKind, CrateSource, ExternCrate, ExternCrateSource};
3334
use rustc_session::lint::{self, BuiltinLintDiag};
@@ -483,12 +484,9 @@ impl CStore {
483484

484485
pub fn report_incompatible_enforced_mitigations(&self, tcx: TyCtxt<'_>, krate: &Crate) {
485486
let my_mitigations = tcx.sess.gather_enabled_enforced_mitigations();
486-
let mut my_mitigations: BTreeMap<_, _> = my_mitigations
487-
.iter()
488-
.filter(|mitigation| mitigation.kind.enforced_since() <= tcx.sess.edition())
489-
.map(|mitigation| (mitigation.kind, mitigation))
490-
.collect();
491-
for skipped_mitigation in tcx.sess.opts.allowed_partial_mitigations() {
487+
let mut my_mitigations: BTreeMap<_, _> =
488+
my_mitigations.iter().map(|mitigation| (mitigation.kind, mitigation)).collect();
489+
for skipped_mitigation in tcx.sess.opts.allowed_partial_mitigations(tcx.sess.edition()) {
492490
my_mitigations.remove(&skipped_mitigation);
493491
}
494492
const MAX_ERRORS_PER_MITIGATION: usize = 5;

compiler/rustc_metadata/src/rmeta/decoder.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ use rustc_proc_macro::bridge::client::ProcMacro;
2929
use rustc_serialize::opaque::MemDecoder;
3030
use rustc_serialize::{Decodable, Decoder};
3131
use rustc_session::Session;
32-
use rustc_session::config::{EnforcedMitigation, TargetModifier};
32+
use rustc_session::config::TargetModifier;
33+
use rustc_session::config::enforced_mitigations::EnforcedMitigation;
3334
use rustc_session::cstore::{CrateSource, ExternCrate};
3435
use rustc_span::hygiene::HygieneDecodeContext;
3536
use rustc_span::{

compiler/rustc_metadata/src/rmeta/encoder.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ use rustc_middle::ty::codec::TyEncoder;
2727
use rustc_middle::ty::fast_reject::{self, TreatParams};
2828
use rustc_middle::{bug, span_bug};
2929
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder, opaque};
30-
use rustc_session::config::{CrateType, EnforcedMitigation, OptLevel, TargetModifier};
30+
use rustc_session::config::enforced_mitigations::EnforcedMitigation;
31+
use rustc_session::config::{CrateType, OptLevel, TargetModifier};
3132
use rustc_span::hygiene::HygieneEncodeContext;
3233
use rustc_span::{
3334
ByteSymbol, ExternalSource, FileName, SourceFile, SpanData, SpanEncoder, StableSourceFileId,

compiler/rustc_metadata/src/rmeta/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ use rustc_middle::ty::fast_reject::SimplifiedType;
3434
use rustc_middle::ty::{self, Ty, TyCtxt, UnusedGenericParams};
3535
use rustc_middle::util::Providers;
3636
use rustc_serialize::opaque::FileEncoder;
37-
use rustc_session::config::{EnforcedMitigation, SymbolManglingVersion, TargetModifier};
37+
use rustc_session::config::enforced_mitigations::EnforcedMitigation;
38+
use rustc_session::config::{SymbolManglingVersion, TargetModifier};
3839
use rustc_session::cstore::{CrateDepKind, ForeignModule, LinkagePreference, NativeLib};
3940
use rustc_span::edition::Edition;
4041
use rustc_span::hygiene::{ExpnIndex, MacroKind, SyntaxContextKey};

compiler/rustc_metadata/src/rmeta/parameterized.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ trivially_parameterized_over_tcx! {
116116
rustc_middle::ty::Visibility<DefIndex>,
117117
rustc_middle::ty::adjustment::CoerceUnsizedInfo,
118118
rustc_middle::ty::fast_reject::SimplifiedType,
119-
rustc_session::config::EnforcedMitigation,
120119
rustc_session::config::TargetModifier,
120+
rustc_session::config::enforced_mitigations::EnforcedMitigation,
121121
rustc_session::cstore::ForeignModule,
122122
rustc_session::cstore::LinkagePreference,
123123
rustc_session::cstore::NativeLib,

compiler/rustc_session/src/config.rs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ use rustc_target::spec::{
3535
use tracing::debug;
3636

3737
pub use crate::config::cfg::{Cfg, CheckCfg, ExpectedValues};
38-
use crate::config::enforced_mitigations::EnforcedMitigationKind;
3938
use crate::config::native_libs::parse_native_libs;
4039
pub use crate::config::print_request::{PrintKind, PrintRequest};
4140
use crate::errors::FileWriteFail;
@@ -1479,18 +1478,6 @@ impl Options {
14791478
pub fn autodiff_enabled(&self) -> bool {
14801479
self.unstable_opts.autodiff.contains(&AutoDiff::Enable)
14811480
}
1482-
1483-
pub fn allowed_partial_mitigations(&self) -> impl Iterator<Item = EnforcedMitigationKind> {
1484-
let mut result = BTreeSet::default();
1485-
for mitigation in &self.unstable_opts.allow_partial_mitigations {
1486-
if mitigation.enabled {
1487-
result.insert(mitigation.kind);
1488-
} else {
1489-
result.remove(&mitigation.kind);
1490-
}
1491-
}
1492-
result.into_iter()
1493-
}
14941481
}
14951482

14961483
impl UnstableOptions {

compiler/rustc_session/src/options/enforced_mitigations.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
use std::collections::BTreeSet;
12
use std::str::FromStr;
23

34
use rustc_macros::{Decodable, Encodable};
45
use rustc_span::edition::Edition;
56
use rustc_target::spec::StackProtector;
67

78
use crate::Session;
9+
use crate::config::Options;
810
use crate::options::CFGuard;
911

1012
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Encodable, Decodable)]
@@ -120,6 +122,12 @@ macro_rules! enforced_mitigations {
120122
}
121123
}
122124

125+
impl Options {
126+
pub fn all_enforced_mitigations(&self) -> impl Iterator<Item = EnforcedMitigationKind> {
127+
[$(EnforcedMitigationKind::$name),*].into_iter()
128+
}
129+
}
130+
123131
impl Session {
124132
pub fn gather_enabled_enforced_mitigations(&$self) -> Vec<EnforcedMitigation> {
125133
let mut mitigations = [
@@ -151,3 +159,24 @@ pub struct EnforcedMitigation {
151159
pub kind: EnforcedMitigationKind,
152160
pub level: EnforcedMitigationLevel,
153161
}
162+
163+
impl Options {
164+
// Return the list of mitigations that are allowed to be partial
165+
pub fn allowed_partial_mitigations(
166+
&self,
167+
edition: Edition,
168+
) -> impl Iterator<Item = EnforcedMitigationKind> {
169+
let mut result: BTreeSet<_> = self
170+
.all_enforced_mitigations()
171+
.filter(|mitigation| mitigation.enforced_since() > edition)
172+
.collect();
173+
for mitigation in &self.unstable_opts.allow_partial_mitigations {
174+
if mitigation.enabled {
175+
result.insert(mitigation.kind);
176+
} else {
177+
result.remove(&mitigation.kind);
178+
}
179+
}
180+
result.into_iter()
181+
}
182+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// ignore-tidy-linelength
2+
//@ check-fail
3+
//@ ignore-nvptx64 stack protector is not supported
4+
//@ ignore-wasm32-unknown-unknown stack protector is not supported
5+
//@ edition: 2024
6+
//@ compile-flags: -Z allow-partial-mitigations=!control-flow-guard -C control-flow-guard=on
7+
8+
// check that in edition 2024, it is still possible to explicitly
9+
// disallow partial mitigations (in edition=future, they are
10+
// disallowed by default)
11+
12+
fn main() {}
13+
//~^ ERROR that is not protected by
14+
//~| ERROR that is not protected by
15+
//~| ERROR that is not protected by
16+
//~| ERROR that is not protected by
17+
//~| ERROR that is not protected by
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
error: your program uses the crate `std`, that is not protected by `control-flow-guard`
2+
--> $DIR/err-allow-partial-mitigations-current-edition.rs:12:1
3+
|
4+
LL | fn main() {}
5+
| ^
6+
7+
error: your program uses the crate `core`, that is not protected by `control-flow-guard`
8+
--> $DIR/err-allow-partial-mitigations-current-edition.rs:12:1
9+
|
10+
LL | fn main() {}
11+
| ^
12+
13+
error: your program uses the crate `alloc`, that is not protected by `control-flow-guard`
14+
--> $DIR/err-allow-partial-mitigations-current-edition.rs:12:1
15+
|
16+
LL | fn main() {}
17+
| ^
18+
19+
error: your program uses the crate `compiler_builtins`, that is not protected by `control-flow-guard`
20+
--> $DIR/err-allow-partial-mitigations-current-edition.rs:12:1
21+
|
22+
LL | fn main() {}
23+
| ^
24+
25+
error: your program uses the crate `libc`, that is not protected by `control-flow-guard`
26+
--> $DIR/err-allow-partial-mitigations-current-edition.rs:12:1
27+
|
28+
LL | fn main() {}
29+
| ^
30+
31+
error: aborting due to 5 previous errors
32+

0 commit comments

Comments
 (0)