Rust和Windows不得不说的事儿
感谢社区 @Matrix 的分享
「官方」Unsafe Rust安全检查:栈借用模型 2
#miri #unsafe_ub_check #stack_borrow
ralfj比较高产,他负责Unsafe下内存模型相关的工作,目的是用miri来检测unsafe中的UB行为。
他在去年引入了栈借用模型1用于定义在unsafe内存模型中允许哪种别名。建立合理的别名规则,才能基于miri来检查unsafe下的UB行为。
该模型的核心思想是: 对于一个内存位置,逐步建立可跟踪的引用,形成一个栈结构。比如有一个&mut i32,可以对其重新借用获得一个新引用。这个新引用是必须用于此位置的引用,建立在旧引用之上。当新引用过期的时候,旧引用会被激活,就好像是栈结构push和pop。
在Safe Rust中,通常有借用检查来保护内存。但是在编写Unsafe代码的时候,借用检查就无法提供帮助了。所以,Rust核心团队就必须要定义一组规则,即使对于Unsafe代码来说也是非常有意义的。
在今天这篇文章中,ralfj又带来了栈借用模型的升级,栈借用2。
在栈借用1模型中,有一个概念叫做「frozen」,处于frozen位置的指针,只能读取,不能写入。它允许可变借用也能读取(检查粒度比较粗,把可变指针和共享指针同一化处理)。但是现在该模型被发现一个问题:当使用可变借用的时候,在该模型下可能会把某些未定义行为判断为合法。为了改进这个问题,栈借用模型2将精确跟踪允许访问的原生指针(更细粒度的检查,区分了共享指针和可变指针),而不是「frozen」。
栈借用模型2还有很多已知的问题,比如其实并没有真正使用到「栈」,反而更像「树」。但这还不是最后的结论。本文比较长,去原文阅读更多信息。
rendy-pbr: 用rendy编写的小型实时基于物理的渲染器
PBR全称(Physicallly-BasedRendering)。笼统的说,就字面含义可以看出,这是一种基于物理规律模拟的一种渲染技术。它构建在gfx-hal上。该项目是rendy和Amethyst的试验场; 这里实现的大部分或全部内容最终将以某种形式添加到Amethyst渲染器中。
非官方的Rust Async/Await调查
声明: 这不是正式的Rust调查,它不会被Rust核心团队以任何方式认可,仅仅是一种民意调查,可能存在偏见。
感兴趣的可以来填写一下。
SideFuzz:寻找时序旁路攻击漏洞的模糊测试库
#fuzz #timing_side_channel_attack
它的工作原理是将模糊测试目标编译到WebAssembly,然后在修改后的wasmi解释器中对wasm目标进行模糊测试,该解释器计算单个指令的执行次数。
旁路攻击的一个案例:
举一个最简单的计时攻击的例子,某个函数负责比较用户输入的密码和存放在系统内密码是否相同,如果该函数是从第一位开始比较,发现不同就立即返回,那么通过计算返回的速度就知道了大概是哪一位开始不同的,这样就实现了电影中经常出现的按位破解密码的场景。密码破解复杂度成千上万倍甚至百万千万倍的下降。 来源: 知乎:如何通俗地解释时序攻击(timing attack)?
制作落沙游戏
该文作者制作过一款落沙游戏(falling sand game)Sandspiel,这种游戏允许玩家选择不同的材质(沙子、水、石头、冰块等)放到游戏中,自然下落,形成各种造型,比较艺术。
作者在这篇文章里,介绍了他为什么要做这款游戏,以及这款游戏的架构等技术资料。
架构:
粒子模拟代码:Rust/WASM
流体模拟:JS和GLSL
React和JS编写界面
TypeScript和Postgresql编写CRUD后端
markup.rs 又一个Rust的模板引擎
#template_engine
###「远程工作 at 欧洲」Chorus One寻找加密软件工程师
要求懂得Go或Rust。该团队成立15个月,有6名团队成员,工作主要是区块链相关。公司在美国西海岸,可全职远程。 薪资:£70 - £85k
从3W行Rust代码中总结出来的十个Rust关键学习点
- 你必须做好准备。请准备好投入大量时间进行思考和设计,以管理内存和类型等。
- Survive the beginning。伟大的程序员卡马克在推上说:Rust code feels very wholesome。你需要深入理解Rust安全相关的概念,比如所有权等。
- 使用Rust构建工具的体验非常棒。
- 非常适合和已有的基础设施互操或替换。
- Rust是一致性和稳定性很高的语言。
- 使用features功能可以将你的软件「切片」或「切块」分发。使用features可以让用户选择性地使用某些模块,有时候可以缩减版本。还可以通过features方便地发行商业版和免费版。
- 惊人的性能。
- 在某些生态系统不完善的场景,建议去使用Go。
- Rust编译速度很慢。所以作者建议将大的项目拆分为独立的crate,可以有效缩减编译时间。(crate是编译的最小单元,Rustc现在支持并行编译)
- 后端服务的故事还在进行中。虽然tokio和actix都很好,但目前作者还不太敢在传统的后端项目上挑选Rust。期待成熟。
额外的惊喜: Rust的文档非常棒!
「呼吁」保持所有人都可访问的自由软件
最近,一些备受瞩目的自由软件项目已经考虑或采用专有聊天系统作为他们与社区沟通的主要方式。这应该引起所有对自由(libre)软件运动感兴趣的人的警觉。
使用Discord作为官方通信方法的项目包括Fedora,Gentoo和openSuSE等发行版; Gitea和Yarn等基础设施项目;和自由编程语言,包括Elixir和Rust。软件不应该依赖专有通信工具的原因有很多:
- 没有透明度。比如注册Discord会包含很多条款。
- 不能选择客户端。挑选客户端只能受制于Discord的要求。
- 缺乏基础设施控制。如果给Discord提供服务的服务商出现了问题,那么社区也就停止服务了。
其实除了irc之外,还有很多备选方案:
- Mattermost
- Matrix
- Rocket.Chat
- Zulip
对于自由软件,也是时候迁移到自由的通信工具上了。
(在Reddit讨论下,Zulip好评不断)
用Rust和K8S交互
虽然通常使用Go和kubernetes交互,这豪无争议。但是现在随着客户端的进化,再加上Rust的泛型和过程宏,现在完全有可能使用Rust来编写一个成熟的k8s客户端了。
该文作者意见编写了好几个Rust的K8S工具,包括:k8s-openapi。并且他们也提交了新的工具:kube-rs,纯Rust实现的k8s客户端。
更多内容请阅读原文。
emacs-module-rs: 允许你用Rust编写emacs模块
Sled代码评审 Part III
Sled 是一个 Rust 写的嵌入式数据库,质量相当不错。作者用了一段时间后,想了解里面的实现,就开始了这个学习和审阅过程。这是第三篇。
watchrs: 使用Rust监控AWS批量Jobs
使用Sonr构建pub/sub服务器 Part II
sonr建立在mio之上的网络库,相比于Tokio来说,更加轻量。
放弃wlroots-rs项目
wlroots-rs项目的作者宣布放弃该项目。原因是因为它碰到的问题,无法用Safe Rust去处理。他认为Safe Rust才是Rust存在的意义,不太想用Unsafe Rust来处理问题,所以就选择回到了C语言。
在该话题的Reddit讨论区,rlua的作者深有同感,也写下了自己的感受:
rlua 让他身心疲惫,也经历了类似的失败。但是,他又说了:如果有Rust无法表达的模式,那么我想我们应该努力使Rust更好,或者找到新的模式?我认为Rust的最大优势是可以把全局不安全的东西变成局部不安全的东西。我知道这对于所有任务来说都不是100%可能,但我正在努力找出剩余问题的答案。
同样也有人指出:
当你认为Rust的全部意义仅仅是安全的时候,那么你就错失了Rust的好处。这并不是Rust的全部观点。Rust是让你在不安全的基础上抽象安全。如果那个C库本来就不安全了,那么Rust允许你公开那个接口,而不是非得把它包装为安全的。
很多人也产生了共鸣。
C和Rust之间的映射,确实比较困难。可能需要总结一些最佳的模式。
From 日报小组 @Chaos
独立日报订阅地址:
社区学习交流平台订阅: