微軟喜提Rust擬替代C/C++?憑什么!

管理員賬號

2019-07-22

近日 @開源中國 一則消息引發熱議:微軟計劃將 Rust 作為 C 和 C++ 的安全替代品。

根據微軟安全響應中心提供的數據,所有微軟年度補丁中約有 70% 是針對內存安全漏洞的修復程序。這樣高的百分比是因為 Windows 和大多數其他微軟產品主要使用 C 和 C++ 編寫,這兩種“內存不安全”(memory-unsafe)的編程語言允許開發人員對內存地址進行細粒度控制,并且可以執行代碼。管理內存執行的開發人員代碼中的一個漏洞可能導致一系列內存安全錯誤,攻擊者可以利用這些錯誤帶來危險和侵入性后果,例如遠程代碼執行或特權提升漏洞。

于是,探索使用諸如 Rust 之類的內存安全(memory-safe)語言被提上日程,這或將成為創建更安全的微軟應用程序的替代方法。

xplanet,公眾號:開源中國
微軟擁抱Rust,以作為C和C++的安全替代方案

其實,自操作系統誕生以來,系統級主流編程語言,從匯編語言到C++,已經發展了近50 個年頭,但依然存在兩個難題:

?很難編寫內存安全的代碼。

?很難編寫線程安全的代碼。

這兩個難題存在的本質原因是C/C++屬于類型不安全的語言,它們薄弱的內存管理機制導致了很多常見的漏洞。

可Rust 能解決這個問題多虧了Rust 語言所遵循的設計哲學之一:內存安全

現代編程語言早已發展到了“程序即類型證明”的階段,類型系統基本已經成為了各大編程語言的標配,尤其是近幾年新出現的編程語言。類型系統提供了以下好處:

?允許編譯器偵測無意義甚至無效的代碼,暴露程序中隱含的錯誤。

?可以為編譯器提供有意義的類型信息,幫助優化代碼。

?可以增強代碼的可讀性,更直白地闡述開發者的意圖。

?提供了一定程度的高級抽象,提升開發效率。

一般來說,一門語言只要保證類型安全,就可以說它是一門安全的語言。簡單來說,類型安全是指類型系統可以保證程序的行為是意義明確、不出錯的。像C/C++語言的類型系統就不是類型安全的,因為它們并沒有對無意義的行為進行約束。一個最簡單的例子就是數組越界,在C/C++語言中并不對其做任何檢查,導致發生了語言規范規定之外的行為,也就是未定義行為(Undefined Behavior)。而這些未定義行為恰恰是漏洞的溫床。所以,像C/C++這種語言就是類型不安全的語言。

Rust 語言如果想保證內存安全,首先要做的就是保證類型安全。

在諸多編程語言中,OCaml 和Haskell 是公認的類型安全的典范,它們的類型系統不僅僅有強大的類型論理論“背書”,而且在實踐生產環境中也久經考驗。所以,Rust 語言借鑒了它們的類型系統來保證類型安全,尤其是Haskell,你能在Rust 語言中看到更多Haskell 類型系統的影子。

然而,直接使用Haskell 的類型系統也無法解決內存安全問題。類型系統的作用是定義編程語言中值和表達式的類型,將它們歸類,賦予它們不同的行為,指導它們如何相互作用。

Haskell 是一門純函數式編程語言,它的類型系統主要用于承載其“純函數式”的思想,是范疇論的體現。而對于Rust 來說,它的類型系統要承載其“內存安全”的思想。所以,還需要有一個安全內存管理模型,并通過類型系統表達出來,才能保證內存安全。

簡單來說,就是不會出現內存訪問錯誤。只有當程序訪問未定義內存的時候才會產生內存錯誤。一般來說,發生以下幾種情況就會產生內存錯誤:

?引用空指針。

?使用未初始化內存。

?釋放后使用,也就是使用懸垂指針。

?緩沖區溢出,比如數組越界。

?非法釋放已經釋放過的指針或未分配的指針,也就是重復釋放。

這些情況之所以會產生內存錯誤,是因為它們都訪問了未定義內存。為了保證內存安全,Rust 語言建立了嚴格的安全內存管理模型:

?所有權系統。每個被分配的內存都有一個獨占其所有權的指針。只有當該指針被銷毀時,其對應的內存才能隨之被釋放。

?借用和生命周期。每個變量都有其生命周期,一旦超出生命周期,變量就會被自動釋放。如果是借用,則可以通過標記生命周期參數供編譯器檢查的方式,防止出現懸垂指針,也就是釋放后使用的情況。

其中所有權系統還包括了從現代C++那里借鑒的RAII 機制,這是Rust 無GC 但是可以安全管理內存的基石。

建立了安全內存管理模型之后,再用類型系統表達出來即可。Rust 從Haskell 的類型系統那里借鑒了以下特性:

?沒有空指針

?默認不可變

?表達式

?高階函數

?代數數據類型

?模式匹配

?泛型

?trait 和關聯類型

?本地類型推導

為了實現內存安全,Rust 還具備以下獨有的特性:

?仿射類型(Affine Type),該類型用來表達Rust 所有權中的Move 語義。

?借用、生命周期。

借助類型系統的強大,Rust 編譯器可以在編譯期對類型進行檢查,看其是否滿足安全內存模型,在編譯期就能發現內存不安全問題,有效地阻止未定義行為的發生。

內存安全的Bug 和并發安全的Bug 產生的內在原因是相同的,都是因為內存的不正當訪問而造成的。同樣,利用裝載了所有權的強大類型系統,Rust 還解決了并發安全的問題。Rust編譯器會通過靜態檢查分析,在編譯期就檢查出多線程并發代碼中所有的數據競爭問題。

微軟擁抱Rust 并非偶然,其實早先微軟已在Azure IoT 網絡上部分使用了Rust。目前在商業領域,Rust 的重磅商業用戶還包括:

?Amazon,使用Rust 作為構建工具。

?Atlassian,在后端使用Rust。

?Dropbox,在前后端均使用了Rust。

?Facebook,使用Rust 重寫了源碼管理工具。

?Google,在Fuchsia 項目中部分使用了Rust。

?npm,在其核心服務上使用了Rust。

?RedHat,使用Rust 創建了新的存儲系統。

?Reddit,使用Rust 處理評論。

?Twitter,在構建團隊中使用Rust。

……

Rust 的前景越來越明朗,未來Rust 將大有可為。

本書并非對語法內容進行簡單羅列講解,而是從四個維度深入全面且通透地介紹了Rust 語言。從設計哲學出發,探索Rust 語言的內在一致性;從源碼分析入手,探索Rust 地道的編程風格;從工程角度著手,探索Rust 對健壯性的支持;從底層原理開始,探索Rust 內存安全的本質。

本書涵蓋了Rust 2018 的特性,適合有一定編程經驗且想要學習Rust 的初學者,以及對Rust 有一定的了解,想要繼續深入學習的進階者。

專家力薦

?Steve Klabnik,Rust 官方核心團隊成員及文檔團隊負責人

?Patrick Shaughnessy,《Ruby 原理剖析》原著作者

?唐劉,PingCAP 首席架構師,TiKV 負責人

?陳天,ArcBlock(區塊基石)技術VP 終于看見由國內資

?楊梓杰([email protected]美國),Rust開發者,Servo資深貢獻者

?孫曉光,知乎搜索技術架構Leader

?趙雪松(wayslog),BiliBili高級工程師

?唐剛,Rust Web框架Sapper作者

?LeetCode(領扣網絡)

讀者評論

相關博文

  • 社區使用反饋專區

    陳曉猛 2016-10-04

    尊敬的博文視點用戶您好: 歡迎您訪問本站,您在本站點訪問過程中遇到任何問題,均可以在本頁留言,我們會根據您的意見和建議,對網站進行不斷的優化和改進,給您帶來更好的訪問體驗! 同時,您被采納的意見和建議,管理員也會贈送您相應的積分...

    陳曉猛 2016-10-04
    3314 552 3 6
  • 迎戰“雙12”!《Unity3D實戰核心技術詳解》獨家預售開啟!

    陳曉猛 2016-12-05

    時隔一周,讓大家時刻掛念的《Unity3D實戰核心技術詳解》終于開放預售啦! 這本書不僅滿足了很多年輕人的學習欲望,并且與實際開發相結合,能夠解決工作中真實遇到的問題。預售期間優惠多多,實在不容錯過! Unity 3D實戰核心技術詳解 ...

    陳曉猛 2016-12-05
    2216 34 0 1
  • czk 2017-07-29
    2425 20 0 0
黑龙江p62开奖号码今天晚上