文章《Unsoundness and accidental features in the #[target_feature]
attribute》
作者:Predrag
#[target_feature]
是 Rust 中的一个属性,允许函数依赖于特定平台的架构特性。它在高性能应用(如加密、视频编码等)中特别有用,因为这些场景中通常会根据运行程序的硬件能力提供不同实现的函数。例如,使用#[target_feature(enable = "avx")]
可以让函数利用 x64 架构的高级向量扩展(AVX),它增加了 16 个向量寄存器,每个寄存器可容纳多达 256 位数据,并支持多种 SIMD 操作。在代码生成时,编译器会根据这些特性生成相应的指令,即使程序的其他部分可能无法使用这些特性。
这篇文章探讨了 Rust 中 #[target_feature]
属性的语义版本(SemVer)风险,意外发现了不健全和“意外特性”。
作者通过研究发现,#[target_feature]
在安全函数和不安全函数上的使用都可能导致 SemVer 破坏。
在安全函数中,添加新目标特性是破坏性的;在不安全函数中,添加未隐含且未全局启用的特性也是破坏性的。
作者还发现,从特征函数中移除 #[target_feature]
可能导致未定义行为,因为下游实现可能依赖于这些特性。
此外,作者发现 rustdoc 在处理 #[target_feature]
时存在错误,将安全函数错误地标记为不安全。
这些问题促使作者创建了一个 RFC 来改进 Rust 语言,并为 cargo-semver-checks
添加了十几个新的 SemVer 检查。
阅读:https://predr.ag/blog/unsoundness-and-accidental-features-in-target-feature/
Reddit:https://www.reddit.com/r/rust/comments/1lsdaeh/unsoundness_and_accidental_features_in_the_target/
Injectorpp:模拟 tokio、hyper 和 reqwest,无需使用特征或更改生产代码
Injectorpp 是一个简化编写单元测试的库,允许你在运行时更改 Rust 函数的行为,而无需添加额外的 trait 或更改代码。
它通过提供无缝且高效的依赖抽象方法,简化了测试流程,确保您的代码保持简洁且易于维护。。
演示如何在不使用 trait 或更改生产代码的情况下伪造 tokio 、 hyper 和 reqwest 请求。请参阅示例 tokio.rs 、 hyper.rs 和 reqwest.rs。
由于 reqwest 使用 hyper ,而 hyper 是建立在 tokio 之上的,基本步骤都是一样的:
- 创建一个模拟 TcpStream
- 伪造的 DNS 功能使其始终成功。
- 伪造 TcpSocket::connect 来返回模拟 TcpStream 。
- 如果是 https 请求,则伪造 Uri::scheme_str 使其始终返回 http 以绕过所有 tls 验证
仓库:https://github.com/microsoft/injectorppforrust
Reddit:https://www.reddit.com/r/rust/comments/1lsh92z/mdwatcher_cli/
Sysly:受 htop 启发的 macOS 系统监控工具
它使用 sysinfo 库获取系统数据,提供实时 CPU、内存和进程信息。
支持跨平台,在 macOS 上优化了进程数据展示。具有响应式的终端 UI,支持 F1 帮助系统和自适应终端大小。
仓库:https://github.com/hungtrungthinh/sysly
Extfn:函数调用变成方法调用的拓展库
该库具有最小的 API,并且设计得尽可能直观:只需采用常规函数,添加 #[extfn]
,就可将第一个参数重命名为 self。
你可以在其他类型上调用此函数,就好像它是扩展特征的方法一样。
#[extfn]
fn factorial(self: u64) -> u64 {
(1..=self).product()
}
#[extfn]
fn string_len(self: impl Display) -> usize {
format!("{self}").len()
}
#[extfn]
fn sorted_by<T: Ord, F>(mut self: Vec<T>, compare: F) -> Vec<T>
where
F: FnMut(&T, &T) -> Ordering,
{
self.sort_by(compare);
self
}
fn main() {
assert_eq!(6.factorial(), 720);
assert_eq!(true.string_len(), 4);
assert_eq!(vec![2, 1, 3].sorted_by(|a, b| b.cmp(a)), vec![3, 2, 1]);
}
仓库:https://github.com/ondt/extfn
Reddit:https://www.reddit.com/r/rust/comments/1lscwds/extfn_extension_functions_in_rust/
VoxelHex:用 Rust/WGPU 实现稀疏体素砖树,支持光线追踪
树的叶节点包含体素砖,而非单个体素。这使得拥有独特的压缩系统成为可能,其中不同分辨率的体素可以混合在一起。
现已提供支持 GPU 的光线追踪实现!该库使用左手 Y 向上坐标系。
Sparse voxel-brick tree (稀疏体素砖树) 是一种用于高效存储和渲染体素数据的多分辨率数据结构。它结合了稀疏体素八叉树(Sparse Voxel Octree, SVO)和体素砖(voxel bricks)的概念,通过分层的体素砖来表示场景。
仓库:https://github.com/Ministry-of-Voxel-Affairs/VoxelHex
视频演示:https://youtu.be/YB1TpEOCn6w
讨论:Rust 生态系统中的计算机代数系统
目前 Rust 生态系统中关于计算机代数系统(CAS)的项目较少且大多处于早期阶段,如 Symbolica、Feanor-math、Algebraeon 和 Cova 等,但整体还不够成熟。
对于 Lisp,Rust 社区有一些实现,如 Risp、Tulisp、Rust Lisp 和 Vonuvoli Scheme,这些项目各有特点,但性能和功能完整性仍有待提升。
编者注:计算机代数系统(Computer Algebra System,简称 CAS)是一种用于符号数学计算的软件工具,能够以符号形式处理和操作数学表达式,而不仅仅是数值计算。CAS 的核心功能包括:符号计算、代数方程求解、微积分、矩阵运算、绘图功能、数值计算。
阅读:https://www.reddit.com/r/rust/comments/1lsa5pl/state_of_computer_algebra_systems_and_lisp_in_rust/
讨论:推荐一个 Rust 的键值存储方案
高赞回答:
“只使用 SQLite。”
阅读:https://www.reddit.com/r/rust/comments/1ls5ynr/recommend_a_keyvalue_store/
--
From 日报小组 苦瓜小仔
社区学习交流平台订阅:
评论区
写评论还没有评论