一个关于Rust编译器rustc中的一个bug引发的故障排查过程的总结
这是一个关于Rust编译器rustc中的一个bug引发的故障排查过程的总结。
-
作者在开发一个名为rooc的优化建模语言时,想在浏览器中运行解算器,于是尝试使用一个纯Rust编写的线性规划库minilp。
-
在测试阶段,作者发现minilp在Web Assembly(wasm)环境下会panic(运行时崩溃)。
-
作者开始调试,首先尝试wasm2map添加调试映射,发现panic是由于unwrap一个None值引起的。
-
令人费解的是,作者专门编写的测试用例却可以通过,没有重现panic。
-
作者深入研究minilp的pop_min函数,发现在某些条件下会返回None,从而引发unwrap panic。
-
由于minilp已被归档多年未更新,作者打算自行fork并修复这个bug。
https://specy.app/blog/posts/a-rustc-soundness-bug-in-the-wild
Rerun v0.20 新功能介绍
这篇博客主要介绍了Rerun最新版本0.20的两个新功能:
- 支持地理空间数据
- 新增了地理空间数据原语(如GeoPoints和GeoLineStrings),可以将它们发送到Rerun
- 新的地图视图可以在OpenStreetMap或Mapbox地图上绘制这些原语
- 未来还将增加GeoPolygons原语,以完全兼容GeoArrow格式
- 地理空间数据支持是根据社区贡献开发的
- 视频解码支持
- 原生查看器现在支持解码H.264视频文件
- 未来将支持逐帧发送编码视频数据到Rerun,为实时视频流铺平道路
- 视频解码通过调用系统上的FFmpeg可执行文件实现,使用开源crate ffmpeg-sidecar
- 这种架构设计考虑到了在不同环境下的灵活性
此外,该版本还包括一些稳定性和性能改进,如优化MP4文件解析效率。
开源:如何为Helix编辑器贡献PR
最近,我决定从Neovim切换到Helix编辑器,主要原因是我厌倦了不断膨胀的配置,只想要一个开箱即用的编辑器。
Helix是用Rust编写的,但它缺少了一些我非常想要的HTML标签相关功能,比如:为选中内容添加HTML标签、删除最近一对HTML标签、重命名最近一对HTML标签等。由于我主要是为了兴趣而使用React制作静态网站,而TypeScript是我唯一了解的语言,所以这些功能对我来说非常重要。
为了能够为Helix添加这个功能,我决定学习Rust。我完整地学习了Rust书,花费了至少40个小时,因为像所有权这样的概念对我来说完全陌生,让我觉得很难以理解。我之前从未接触过堆栈或堆这样的概念,但由于Rust本身很有趣,我设法完成了学习。在此期间,我还提交了10个较小规模的Pull Request,从中获得了一些自信。
终于有一天,我开始着手开发这个功能。对于像我这样的初学者来说,Helix是一个庞大的项目,有83,000行Rust代码。由于缺乏足够的文档,我最大的困难是不知从何入手,如何理解项目的工作原理。
幸运的是,凭借rust-analyzer、grep和find的力量,我终于弄清楚了各个函数的调用关系,知道了应该在哪里进行修改。
一旦理解了他们的内部API是如何修改文档的,我就需要创建一个算法来查找结束标记(向前搜索)和开始标记(向后搜索),过滤掉不成对的标记,并提取标记名称的确切位置。对于像我这样从未接触过算法的人来说,这并非一件小事。
经过将近2天的努力,我终于完成了这个功能:https://github.com/helix-editor/helix/pull/12055!
我为自己感到高兴,因为从来没想过仅仅一周时间就能学会足够的Rust知识,为一个非平凡的项目做出实际贡献,并开始对这门语言有更多的掌握感。作为一个只有11个月编程经验的业余爱好者,这是一个了不起的成就。
现在,我计划学习后端Web开发,因为在从事前端工作后,我发现自己更喜欢算法相关的工作。而且我会使用Rust来学习。
我意识到我的Pull Request可能要几个月才能被审核或合并,但我不介意,因为我可以在自己的分支中使用这个功能。
https://old.reddit.com/r/rust/comments/1gs0yhe/making_my_first_oss_contribution_in_rust_after/
--
From 日报小组 Mike
社区学习交流平台订阅:
评论区
写评论还没有评论