【Rust日报】 2019-05-22:Mozilla图像团队发布WebRender MVP
Rust 1.35 穩定版預發布測試
RUSTUP_DIST_SERVER=https://dev-static.rust-lang.org rustup update stable1.35增加的一些特性摘要:
- 為Box<FnOnce>, Box<FnMut>, 和Box<Fn>實現了FnOnce/FnMut/Fn。(來自社區 @crlf0710的貢獻 ),相關PR:#59500
- 支持將閉包轉換為usnafe的函數指針。
- 增加了wasm32-unknown-wasi Target。
- 線程在Debug模式下將顯示ID。
- alloc::System實現了Default。
- dbg!()支持無參數調用。
- ASCII轉換速度提升了4倍速。
- 穩定了一些API。
Rust 1.35 release note
kakoune編輯器已經支持了async/await關鍵字高亮
#kakoune #IDE #editor
(頭一次聽說kakoune這個編輯器,恕我無知)。期待其他編輯器也支持,最好是能支持自定義各種emoji。
Read More
不過VSCode又多了一個語法高亮的插件:Tree Sitter,號稱可以提供更好的Rust高亮。
Tree Sitter
「異步Explained系列」Rust異步如何工作
#futures #async
- Explained: How does async work in Rust
- Explained: Futures in Rust for Web Development
cargo-permissions: 檢測篡改依賴的Cargo權限
#crate #cargo #security #PoC
為了在crates.io中保持健康安全的包(crate),需要盡可能多地強制檢測任何類型的漏洞。隨著軟件包之間依賴關系的使用增加,漏洞傳播的風險也會增加。在NPM等其他平臺上,我們已經看到了很多這樣的安全問題。Rust開發人員需要一個工具來回答有關其依賴關系的問題:
- 為什么png庫使用網絡層?
- 為什么http庫使用文件系統層?
- 可能的場景(Possible scenarios)
- 讀取未授權文件
- 請求不可信域名
- 執行未授權代碼
- 盜取信息
- 盜用CPU資源
- 不安全地執行代碼
cargo-permissions是一個概念證明的庫(PoC),基于通過查找代碼中的特定路徑來檢測惡意代碼的想法,來保證crate的安全。此項目的主要思想是擁有一組與某些特定標準包列表相關聯的權限。另一方面,通過AST分析,檢查crate中使用的標準庫。例如,如果包A開始使用std::net庫,則將獲得net權限。所有使用包A作為依賴的crate都會間接獲得net權限。遵循此方法,可以構建具有所有獲取權限的依賴關系樹。通過這組權限可以獲取「超出控制范圍的crate」盡可能多的信息。
- 討論
- cargo-permissions
### 「官方」Unsafe Rust安全檢查:棧借用模型 2.1
#miri #unsafe_ub_check #stack_borrow
ralfj比較高產,他負責Unsafe下內存模型相關的工作,目的是用miri來檢測unsafe中的UB行為。為了達成這個目標,他陸續研究出以下一些借用模型:
棧借用模型1:
他在去年引入了棧借用模型1用于定義在unsafe內存模型中允許哪種別名。建立合理的別名規則,才能基于miri來檢查unsafe下的UB行為。
該模型的核心思想是: 對于一個內存位置,逐步建立可跟蹤的引用,形成一個棧結構。比如有一個&mut i32,可以對其重新借用獲得一個新引用。這個新引用是必須用于此位置的引用,建立在舊引用之上。當新引用過期的時候,舊引用會被激活,就好像是棧結構push和pop。
在Safe Rust中,通常有借用檢查來保護內存。但是在編寫Unsafe代碼的時候,借用檢查就無法提供幫助了。所以,Rust核心團隊就必須要定義一組規則,即使對于Unsafe代碼來說也是非常有意義的。
棧借用模型2:
在上一篇文章中,ralfj又帶來了棧借用模型的升級,棧借用2。
在棧借用1模型中,有一個概念叫做「frozen」,處于frozen位置的指針,只能讀取,不能寫入。它允許可變借用也能讀取(檢查粒度比較粗,把可變指針和共享指針同一化處理)。但是現在該模型被發現一個問題:當使用可變借用的時候,在該模型下可能會把某些未定義行為判斷為合法。為了改進這個問題,棧借用模型2將精確跟蹤允許訪問的原生指針(更細粒度的檢查,區分了共享指針和可變指針),而不是「frozen」。檢查粒度比模型1更細。
棧借用模型2還有很多已知的問題,比如其實并沒有真正使用到「棧」,反而更像「樹」。但這還不是最后的結論。本文比較長,去原文信息。
棧借用模型2.1:
在今天這篇文章中,ralfj又發現了上次的棧借用2模型存在一些問題:結合內部可變性,行為并不總是他們想要的。在模型2.0中,說到其實沒有真正使用「棧結構」是在讀取訪問的時候,事實上進行「寫訪問」的時候,還是可以維護一個「棧結構」。
fn main() { unsafe {let c = &UnsafeCell::new(UnsafeCell::new(0));let inner_uniq = &mut *c.get();// stack: [c: SharedReadWrite, inner_uniq: Unique]let inner_shr = &*inner_uniq; // adds a SharedReadWrite// stack: [c: SharedReadWrite, inner_uniq: Unique, inner_shr: SharedReadWrite]*c.get() = UnsafeCell::new(1); // invalidates inner_shr// stack: [c: SharedReadWrite]let _val = *inner_shr.get(); // error because the tag is not on the stack any more } }對于這段代碼,之前是「合法的」,但是用棧模型2.1來處理的話,就是UB。UnsafeCell是一個內部可變性容器,棧借用模型2.1會在棧中維護SharedReadWrite指針。像上面代碼第4行,如果在設置了inner_shr之后,又重置了c變量容器內的值,棧借用結構就會改變,最后一行再使用inner_shr指針就可以檢測到非法了,它是一個UB。但是在棧借用模式2.0中,最后代碼執行的時候,堆棧將改為[c:SharedReadWrite,inner_shr:SharedReadWrite],從而允許最終訪問,這就是問題所在。
這樣一來,相當于是棧模型1.0和棧模型2.0的結合?還可以在Unsafe代碼導讀中看到棧借用模型2.1的完整描述。
后續:ralfj將會寫一篇關于棧借用模型的完整論文,當然,可能還是他自己的博士論文更重要吧,畢業最重要了。
- Read More
- Unsafe代碼導讀:wip/stacked-borrows
Rendy 0.2發布
#gfx #Amethyst #Render
Rendy是基于gfx-hal的一個渲染引擎,屬于Amethyst的項目。提供各種工具,如內存分配,資源管理,渲染圖執行等。gfx-hal是99%的Vulkan API。 這就是Rendy存在的原因。而不是解決內存分配和紋理上傳等低級任務,用戶可以專注于創建令人敬畏的高性能渲染器。
Rendy
case-studies: Rust實例探究
#learning #study
該庫展示了一些棘手的Rust代碼示例,這些代碼是dtolnay(syn作者,Rust宏的高手)在使用Rust(他自己和其他人)中的各種高級宏庫時遇到的問題集合。該項目致力于對Rust宏開發的一個深刻洞察:擅長使用宏的人和宏專家之間的區別主要與他們擅長“宏”的程度是無關的。
這也許是學習Rust宏的一個非常好的案例。
case-studies
Mozilla圖像團隊發布WebRender MVP
#mozilla #webrender
WebRender使用與游戲相同的基于GPU的加速技術重寫了Firefox渲染架構,現在適用于一些選定的Win10設備。WebRender使用的現代架構主要是:
- 合成器中頁面的表示不再是一組柵格化圖層,而是現在的一個未經過圖形化的顯示列表。
- 合成和光柵化步驟已加入到單個GPU驅動的渲染步驟中。
有關更多詳細信息,請參閱Lin Clark的Hacks系列文章。
- Read More
- Lin Clark的Hacks系列文章:WebRender如何擺脫jank
- webrender
Rust Nightly 1.36.0中已經棄用了mem::uninitialized
#nightly
Rust的臭名昭著的mem::uninitialized方法在今天的每晚構建中已被棄用。它的替代品MaybeUninit已經開始穩定。如果你正在使用前者,則應盡快遷移到使用后者(可能在6周內達到穩定)。因為這是一個break change的修改。
這篇文章主要討論了未初始化內存的性質以及如何在Rust中使用它。并且探討了mem::uninitialized為什么會被棄用,以及MaybeUninit是什么。
- Read More
- Reddit 討論
多語言混合項目的一些經驗
#ffi #C #Polyglot
長文預警!作者在寫自己的庫bitvec的時候,開始考慮,如何將其用于其他語言,比如他如果在一個C++程序中想用bitvec怎么辦?所以他開始設計一套針對為Rust crate編寫FFI的慣用法。這篇文章記錄了他從API設計到實現的一些經驗,值得一讀。
- Read More
- bitvec
- bitvec ffi branch
From 日報小組 @Chaos
日報訂閱地址:
獨立日報訂閱地址:
- Telgram Channel
- 阿里云語雀訂閱
- Steemit
- GitHub
社區學習交流平臺訂閱:
- Rust.cc論壇: 支持rss
- Rust Force: 支持rss
- 微信公眾號:Rust語言學習交流
總結
以上是生活随笔為你收集整理的【Rust日报】 2019-05-22:Mozilla图像团队发布WebRender MVP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个开源的音频分离深度学习项目
- 下一篇: Linux内核加载f2fs,固态硬盘使用