]> git.lizzy.rs Git - rust.git/commitdiff
Issue deprecation warnings for safe accesses to extern statics
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Fri, 26 Aug 2016 16:23:42 +0000 (19:23 +0300)
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Thu, 8 Sep 2016 22:07:01 +0000 (01:07 +0300)
src/doc/book/ffi.md
src/libpanic_unwind/seh.rs
src/librustc/lint/builtin.rs
src/librustc/middle/effect.rs
src/librustc_lint/lib.rs
src/test/compile-fail/auxiliary/extern-statics.rs [new file with mode: 0644]
src/test/compile-fail/linkage2.rs
src/test/compile-fail/linkage3.rs
src/test/compile-fail/safe-extern-statics-mut.rs [new file with mode: 0644]
src/test/compile-fail/safe-extern-statics.rs [new file with mode: 0644]
src/test/run-pass/check-static-recursion-foreign.rs

index 1dea15311ce82aacf15cf2835318202778bc0ac6..8709c3f4b7b10d10bf67df1d65133250ccb589fb 100644 (file)
@@ -471,7 +471,7 @@ extern {
 
 fn main() {
     println!("You have readline version {} installed.",
-             rl_readline_version as i32);
+             unsafe { rl_readline_version as i32 });
 }
 ```
 
index dd6e92fe9ae19efc4779af3f57a773fe46fa8a8a..5896421493008cefb36ca632a37a94d33391a22f 100644 (file)
@@ -232,13 +232,13 @@ pub struct _TypeDescriptor {
 // Again, I'm not entirely sure what this is describing, it just seems to work.
 #[cfg_attr(not(test), lang = "msvc_try_filter")]
 static mut TYPE_DESCRIPTOR1: _TypeDescriptor = _TypeDescriptor {
-    pVFTable: &TYPE_INFO_VTABLE as *const _ as *const _,
+    pVFTable: unsafe { &TYPE_INFO_VTABLE } as *const _ as *const _,
     spare: 0 as *mut _,
     name: imp::NAME1,
 };
 
 static mut TYPE_DESCRIPTOR2: _TypeDescriptor = _TypeDescriptor {
-    pVFTable: &TYPE_INFO_VTABLE as *const _ as *const _,
+    pVFTable: unsafe { &TYPE_INFO_VTABLE } as *const _ as *const _,
     spare: 0 as *mut _,
     name: imp::NAME2,
 };
index ed94e5fe377c495165a21de8a6949c4458fe4b29..fa77c911b4651a631168acd459ca59a6ca22eb72 100644 (file)
     "lifetimes or labels named `'_` were erroneously allowed"
 }
 
+declare_lint! {
+    pub SAFE_EXTERN_STATICS,
+    Warn,
+    "safe access to extern statics was erroneously allowed"
+}
+
 /// Does nothing as a lint pass, but registers some `Lint`s
 /// which are used by other parts of the compiler.
 #[derive(Copy, Clone)]
@@ -228,7 +234,8 @@ fn get_lints(&self) -> LintArray {
             RENAMED_AND_REMOVED_LINTS,
             SUPER_OR_SELF_IN_GLOBAL_PATH,
             HR_LIFETIME_IN_ASSOC_TYPE,
-            LIFETIME_UNDERSCORE
+            LIFETIME_UNDERSCORE,
+            SAFE_EXTERN_STATICS
         )
     }
 }
index a7af0b50b849416f6c8902539c301b88b5cd4aa3..082db569e18c6a3841abd39d6c097ac342308e04 100644 (file)
@@ -15,6 +15,7 @@
 use dep_graph::DepNode;
 use ty::{self, Ty, TyCtxt};
 use ty::MethodCall;
+use lint;
 
 use syntax::ast;
 use syntax_pos::Span;
@@ -57,16 +58,25 @@ struct EffectCheckVisitor<'a, 'tcx: 'a> {
 }
 
 impl<'a, 'tcx> EffectCheckVisitor<'a, 'tcx> {
-    fn require_unsafe(&mut self, span: Span, description: &str) {
+    fn require_unsafe_ext(&mut self, node_id: ast::NodeId, span: Span,
+                          description: &str, is_lint: bool) {
         if self.unsafe_context.push_unsafe_count > 0 { return; }
         match self.unsafe_context.root {
             SafeContext => {
-                // Report an error.
-                struct_span_err!(
-                    self.tcx.sess, span, E0133,
-                    "{} requires unsafe function or block", description)
-                    .span_label(span, &description)
-                    .emit();
+                if is_lint {
+                    self.tcx.sess.add_lint(lint::builtin::SAFE_EXTERN_STATICS,
+                                           node_id,
+                                           span,
+                                           format!("{} requires unsafe function or \
+                                                    block (error E0133)", description));
+                } else {
+                    // Report an error.
+                    struct_span_err!(
+                        self.tcx.sess, span, E0133,
+                        "{} requires unsafe function or block", description)
+                        .span_label(span, &description)
+                        .emit();
+                }
             }
             UnsafeBlock(block_id) => {
                 // OK, but record this.
@@ -76,6 +86,10 @@ fn require_unsafe(&mut self, span: Span, description: &str) {
             UnsafeFn => {}
         }
     }
+
+    fn require_unsafe(&mut self, span: Span, description: &str) {
+        self.require_unsafe_ext(ast::DUMMY_NODE_ID, span, description, false)
+    }
 }
 
 impl<'a, 'tcx, 'v> Visitor<'v> for EffectCheckVisitor<'a, 'tcx> {
@@ -173,8 +187,16 @@ fn visit_expr(&mut self, expr: &hir::Expr) {
                 self.require_unsafe(expr.span, "use of inline assembly");
             }
             hir::ExprPath(..) => {
-                if let Def::Static(_, true) = self.tcx.expect_def(expr.id) {
-                    self.require_unsafe(expr.span, "use of mutable static");
+                if let Def::Static(def_id, mutbl) = self.tcx.expect_def(expr.id) {
+                    if mutbl {
+                        self.require_unsafe(expr.span, "use of mutable static");
+                    } else if match self.tcx.map.get_if_local(def_id) {
+                        Some(hir::map::NodeForeignItem(..)) => true,
+                        Some(..) => false,
+                        None => self.tcx.sess.cstore.is_foreign_item(def_id),
+                    } {
+                        self.require_unsafe_ext(expr.id, expr.span, "use of extern static", true);
+                    }
                 }
             }
             hir::ExprField(ref base_expr, field) => {
index b9817cc6ff45a11402e894dbfa426463bfe533c6..bc2979c806f65abb619ddc63cfcb4100ddf8d3d1 100644 (file)
@@ -201,6 +201,10 @@ macro_rules! add_lint_group {
             id: LintId::of(LIFETIME_UNDERSCORE),
             reference: "RFC 1177 <https://github.com/rust-lang/rfcs/pull/1177>",
         },
+        FutureIncompatibleInfo {
+            id: LintId::of(SAFE_EXTERN_STATICS),
+            reference: "issue 36247 <https://github.com/rust-lang/rust/issues/35112>",
+        },
         ]);
 
     // Register renamed and removed lints
diff --git a/src/test/compile-fail/auxiliary/extern-statics.rs b/src/test/compile-fail/auxiliary/extern-statics.rs
new file mode 100644 (file)
index 0000000..07f70b1
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+extern {
+    pub static XA: u8;
+    pub static mut XB: u8;
+}
index 2a127d937eaaafb39d7e2d4fdf7eca760bf36bb1..afae4a451d6991b7a39a3fe04fde7cab4edd7aeb 100644 (file)
@@ -16,5 +16,5 @@
 }
 
 fn main() {
-    println!("{}", foo);
+    println!("{}", unsafe { foo });
 }
index 8343f718902dc02f7ec291d1b69812b7bd906d3b..c222989ed66779d25ce48def5984bcd9a3a6c3ab 100644 (file)
@@ -16,5 +16,5 @@
 }
 
 fn main() {
-    println!("{:?}", foo);
+    println!("{:?}", unsafe { foo });
 }
diff --git a/src/test/compile-fail/safe-extern-statics-mut.rs b/src/test/compile-fail/safe-extern-statics-mut.rs
new file mode 100644 (file)
index 0000000..b5f3b45
--- /dev/null
@@ -0,0 +1,28 @@
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// aux-build:extern-statics.rs
+
+#![allow(unused)]
+#![deny(safe_extern_statics)]
+
+extern crate extern_statics;
+use extern_statics::*;
+
+extern {
+    static mut B: u8;
+}
+
+fn main() {
+    let b = B; //~ ERROR use of mutable static requires unsafe function or block
+    let rb = &B; //~ ERROR use of mutable static requires unsafe function or block
+    let xb = XB; //~ ERROR use of mutable static requires unsafe function or block
+    let xrb = &XB; //~ ERROR use of mutable static requires unsafe function or block
+}
diff --git a/src/test/compile-fail/safe-extern-statics.rs b/src/test/compile-fail/safe-extern-statics.rs
new file mode 100644 (file)
index 0000000..7e96897
--- /dev/null
@@ -0,0 +1,32 @@
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// aux-build:extern-statics.rs
+
+#![allow(unused)]
+#![deny(safe_extern_statics)]
+
+extern crate extern_statics;
+use extern_statics::*;
+
+extern {
+    static A: u8;
+}
+
+fn main() {
+    let a = A; //~ ERROR use of extern static requires unsafe function or block
+               //~^ WARN this was previously accepted by the compiler
+    let ra = &A; //~ ERROR use of extern static requires unsafe function or block
+                 //~^ WARN this was previously accepted by the compiler
+    let xa = XA; //~ ERROR use of extern static requires unsafe function or block
+                 //~^ WARN this was previously accepted by the compiler
+    let xra = &XA; //~ ERROR use of extern static requires unsafe function or block
+                   //~^ WARN this was previously accepted by the compiler
+}
index 554853ade5be61956a12ff5fe91a8783d9e6cbaf..8e718f328ff9146b73798729068e7c99ce659044 100644 (file)
@@ -27,6 +27,6 @@
     static test_static: c_int;
 }
 
-static B: &'static c_int = &test_static;
+static B: &'static c_int = unsafe { &test_static };
 
 pub fn main() {}