Rust 新版解读 | 1.71 | C-unwind API

Rust 1.71 官方 release doc: Announcing Rust 1.71.0 | Rust Blog

通过 rustup 安装的同学可以使用以下命令升级到 1.71 版本:

$ rustup update stable

C-unwind API

1.71.0 稳定了 C-unwind 和其他 -unwind 后缀的ABI,具体见列表

非强制unwinding的结果在这个RFC的表格里。

带有 -unwind 后缀的ABI在由于 panic 或者 C++ 的异常(exception) 而执行 unwinding 时,穿过 ABI 边界会更安全,除此以外和没有 -unwind 后缀的 ABI 基本等效。使用 panic=unwind 可以有效地让异常从一种语言堆栈展开(stack unwind)到另一种语言而不需要中止进程(只要这个异常的产生和捕获都是在同一种语言内进行的)。而 panic=abort 通常会立刻中止进程。

这次稳定不会影响已有的ABI(比如 C),通过这些ABI的 unwinding 仍然是 UB 未定义行为。未来的 Rust 版本会按照这个RFC来修复这些ABI(通常会在边界处abort)。我们鼓励需要unwind穿过ABI边界的用户使用新的 ABI 来确保未来的兼容性。

译者注:或许以下一些概念对理解上面这个更新内容有一些帮助:

调试器可视化属性

1.71.0 稳定了新的属性:#[debug_visualizer(natvis_file = "...")]#[debug_visualizer(gdb_script_file = "...")]。它们允许植入 Nativis 描述和 GDB 脚本到 Rust 库里来改善通过调试器查看这些库数据结构时的输出结果。Rust本身有给标准库打包类似的脚本,如今这个特性让库作者也可以给其用户提供类似的体验了。

具体细节查看:the-debugger_visualizer-attribute

raw-dylib 动态库链接

在 Windows 平台上,通过在 #[link] 里使用新的选项 kind="raw-dylib",Rust 现在支持使用动态库且编译期不需要依赖这个动态库。

这避免了要求用户安装这些库(这在跨平台交叉编译的时候尤为困难),也避免了在crates指明需要链接的库的具体版本。

使用新的属性 #[link_ordinal], Rust 也支持通过动态库的符号顺序而不是符号名称来进行符号绑定。

线程局部常量初始化

其实是 1.59 稳定进标准库的功能(没有在更新说明和文档里提过)。文档

#![allow(unused)]
fn main() {
use std::cell::RefCell;
use std::thread;

thread_local!(static FOO: RefCell<u32> = RefCell::new(1));

FOO.with(|f| {
    assert_eq!(*f.borrow(), 1);
    *f.borrow_mut() = 2;
});

// each thread starts out with the initial value of 1
let t = thread::spawn(move|| {
    FOO.with(|f| {
        assert_eq!(*f.borrow(), 1);
        *f.borrow_mut() = 3;
    });
});

// wait for the thread to complete and bail out on panic
t.join().unwrap();

// we retain our original value of 2 despite the child thread
FOO.with(|f| {
    assert_eq!(*f.borrow(), 2);
});
}

Others

其它更新细节,和稳定的API列表,参考原Blog