天天看點

【Rust日報】2020-09-05 微軟在c++靜态分析工具實作了一些rust的安全規則

微軟在c++靜态分析工具實作了一些rust的安全規則

Rust和c++是兩種流行的系統程式設計語言。多年來,c++的焦點一直放在性能上。我們越來越多地聽到來自客戶和安全研究人員的呼籲,認為c++語言應該有更強的安全保證。Visual Studio 2019 version 16.7 在c++的核心檢查中包含了四個新規則,以将Rust的一些安全特性合并到c++中。

文章連結,https://devblogs.microsoft.com/cppblog/new-safety-rules-in-c-core-check/

在Nightly Rust的路徑修整

就在昨天,這個Rust PR(我正在做的)每晚都被合并到Rust中,這對編譯器錯誤有着廣泛的影響。

在這篇文章中,我描述了這種變化以及從中可以期待什麼。

在錯誤中完整路徑的問題:如下所示的簡單程式将導緻類型錯誤。

fn main() {
    let a = vec![vec![String::from("a")]];
    let b = vec![String::from("b")];
    a == b;
}           

複制

類型錯誤可以描述為:

cannot compare between values of the types Vec<Vec<String>> and Vec<String>

。在PR改變之前,這幾乎是錯誤資訊的第一行,其餘的錯誤資訊提供了更多關于特征的細節:

error[E0277]: can't compare `std::vec::Vec<std::string::String>` with `std::string::String`
 --> example.rs:5:7
  |
5 |     a == b;
  |       ^^ no implementation for `std::vec::Vec<std::string::String> == std::string::String`
  |
  = help: the trait `std::cmp::PartialEq<std::string::String>` is not implemented for `std::vec::Vec<std::string::String>`
  = note: required because of the requirements on the impl of `std::cmp::PartialEq<std::vec::Vec<std::string::String>>` for `std::vec::Vec<std::vec::Vec<std::string::String>>`           

複制

值得注意的是,在上述錯誤中,造成認知負擔的最大因素是類型和特征的完整合格路徑(例如std::vec:: vec)。對很多人來說,它的可讀性有很大的不同。

文章連結,https://blog.aloni.org/posts/path-trimming-in-rust-nightly/

窺視Rust枚舉(enum)的内部

在我的twitch頻道最近的Rust問答環節中,有人問了一個看起來很簡單的問題:為什麼像SmartString或SmolStr這樣的小字元串類型和string一樣大小,而像SmallVec這樣的小vec類型卻比vec大?

我知道我剛剛用了形容詞simple,但事實是:為了了解這個問題,我們需要一些背景知識。

文章連結,https://fasterthanli.me/articles/peeking-inside-a-rust-enum