#move #moving #plugin #marked #moved #prevent #type

nightly 坚韧

(已废弃:将无法与 MIR 一起工作)防止某些类型被移动的插件

22 个版本

使用旧的 Rust 2015

0.2.3 2016 年 8 月 18 日
0.2.1 2016 年 5 月 14 日
0.1.2 2016 年 3 月 28 日
0.0.15 2015 年 12 月 3 日
0.0.8 2015 年 7 月 22 日

#prevent 中排名第 3

MPL-2.0 许可证

9KB
154 行代码(不包括注释)

由于它将不再与 MIR 一起工作,因此该包已被废弃

rust-tenacious

Build Status

此插件会在标记为 #[no_move] 的类型被移动时发出警告。

这在确保通过 FFI 共享数据时,事物不会四处移动非常有用。Servo 使用此功能 安全地与 spidermonkey GC 共享根值。

请注意,#[no_move] 是传递性的,任何包含 #[no_move] 类型的结构体或枚举都必须进行注释。同样,任何在类型参数中有 #[no_move] 替换的类型(例如 Vec<Foo> 其中 Foono_move)将被视为不可移动。

示例

#![plugin(tenacious)]
#![feature(custom_attribute, plugin)]

#[no_move]
#[derive(Debug)]
struct Foo;

fn main() {
    let x = Foo;
    let y = x; // warning
    bar(Some(y)); // warning   
}

fn bar(t: Option<Foo>) {
    match t {
        Some(foo) => { // warning
            println!("{:?}", foo)
        },
        _ => ()
    }

}

struct MoreFoo {
    foos: Vec<Foo> // warning
}

#[no_move]
struct MoreFoo2 {
    foos: Vec<Foo> // no warning
}

请注意,这不会在临时变量移动时进行代码检查(尽管很容易修改以实现这一点)。例如,如果 foo() 返回一个移动保护值,bar(foo()) 即使在 let x = foo(); bar(x) 会出现错误的情况下也不会出错,因为 foo() 返回的值是一个临时值(右值)并且在内存中并未实际移动。

它也不会捕获泛型函数如 mem::swap() 和 `mem::replace()`` 内部的移动。

#[allow(moved_no_move)] 注释添加到结构体中,将抑制关于结构体包含一个 #[no_move] 类型但未标记为 #[no_move] 的警告。`#[allow_movable_interior]` 属性执行上述操作并允许在类型参数中使用可移动类型。请参阅 tests/run-pass/allow-move.rs 获取示例。

请注意,如果您依赖于使用 #[no_move] 的 crate,您必须在您的 crate 中有 #![plugin(tenacious)] 以看到警告。

无运行时依赖