鍍金池/ 教程/ Java/ 安全(Safety)
標準輸入與輸出
消息傳遞
循環(huán)
注釋
Rust for Mac OS
幾種智能指針
Cell, RefCell
trait對象 (trait object)
rust web 開發(fā)
Unsafe、原始指針
Macro
迭代器
函數(shù)
Borrow, BorrowMut, ToOwned
快速上手
二叉樹
編輯器
測試與評測
Deref
安裝Rust
哈希表 HashMap
原生類型
17.錯誤處理
VS Code 安裝配置
動態(tài)數(shù)組Vec
模式匹配
操作符和格式化字符串
Rust for Linux
函數(shù)參數(shù)
Visual Studio
vim/GVim安裝配置
閉包作為參數(shù)和返回值
安全(Safety)
Cow
生命周期( Lifetime )
閉包的實現(xiàn)
所有權(quán)(Ownership)
Atom
將Rust編譯成庫
類型、運算符和字符串
類型系統(tǒng)中的幾個常見 trait
特性
屬性和編譯器參數(shù)
Spacemacs
集合類型
Rust json處理
Heap & Stack
并行
標準庫示例
基本程序結(jié)構(gòu)
鏈表
trait 和 trait對象
前期準備
代碼風格
編譯器參數(shù)
基于語義化版本的項目版本聲明與管理
Rust 版本管理工具: rustup
引用&借用(References&Borrowing)
注釋與文檔
10.1 trait關(guān)鍵字
模式
調(diào)用ffi函數(shù)
unsafe
并發(fā),并行,多線程編程
AsRef 和 AsMut
Rust旅程
Rust for Windows
結(jié)構(gòu)體與枚舉
條件分支
附錄I-術(shù)語表
變量綁定與原生類型
Mutex 與 RwLock
泛型
裸指針
常用數(shù)據(jù)結(jié)構(gòu)實現(xiàn)
系統(tǒng)命令:調(diào)用grep
Into/From 及其在 String 和 &str 互轉(zhuǎn)上的應用
共享內(nèi)存
Sublime
網(wǎng)絡(luò)模塊:W貓的回音
函數(shù)返回值
包和模塊
高階函數(shù)
函數(shù)與方法
match關(guān)鍵字
隊列
目錄操作:簡單grep
語句和表達式
并發(fā)編程
閉包
測試
閉包的語法
同步
迭代器
String
Send 和 Sync
Rc 和 Arc
屬性
Emacs
優(yōu)先隊列
Prelude
cargo簡介
控制流(control flow)
數(shù)組、動態(tài)數(shù)組和字符串
FFI
模塊和包系統(tǒng)、Prelude
實戰(zhàn)篇
Rust 是一門系統(tǒng)級編程語言,被設(shè)計為保證內(nèi)存和線程安全,并防止段錯誤。作為系統(tǒng)級編程語言,它的基本理念是 “零開銷抽象”。理
運算符重載
Any和反射
rust數(shù)據(jù)庫操作
輸入輸出流
復合類型
性能測試

安全(Safety)

本章不講解任何語言知識點,而是對 Rust 安全理念的一些總結(jié)性說明。

安全,本身是一個相當大的話題。安全性,本身也需要一個局部性的定義。

Rust 的定義中,凡是 可能 會導致程序內(nèi)存使用出錯的特性,都被認為是 不安全的(unsafe)。反之,則是 安全的(safe)

基于這種定義,C 語言,基本是不安全的語言(它是眾多不安全特性的集合。特別是指針相關(guān)特性,多線程相關(guān)特性)。

Rust 的這個定義,隱含了一個先決假設(shè):人之初,性本惡。人是不可靠的,人是會犯錯誤的,即 Rust 不相信人的實施過程。在這一點上,C 語言的理念與之完全相反:C 語言完全相信人,人之初,性本善,由人進行完全地控制。

根據(jù) Rust 的定義,C 語言幾乎是不安全的代名字。但是,從本質(zhì)上來說,一段程序是否安全,并不由開發(fā)它的語言決定。用 C 語言開發(fā)出的程序,不一定就是不安全的代碼,只不過相對來說,需要花更多的精力進行良好的設(shè)計和長期的實際運行驗證。Rust 使開發(fā)出安全可靠的代碼相對容易了。

世界本身是骯臟的。正如,純函數(shù)式語言中還必須有用于處理副作用的 Monad 存在一樣,Rust 僅憑安全的特性集合,也是無法處理世界的所有結(jié)構(gòu)和問題的。所以,Rust 中,還有 unsafe 部分的存在。實際上,Rust 的 std 本身也是建立在大量 unsafe 代碼的基礎(chǔ)之上的。所以,世界就是純粹建立在不純粹之上,“安全”建立在“不安全”之上。

因此,Rust 本身可以被認為是兩種編程語言的混合:Safe RustUnsafe Rust。

只使用 Safe Rust 的情況下,你不需要擔心任何類型安全性和內(nèi)存安全性的問題。你永遠不用忍受空指針,懸掛指針或其它可能的未定義行為的干擾。

Unsafe RustSafe Rust 的所有特性上,只給程序員開放了以下四種能力:

  1. 對原始指針進行解引(Dereference raw pointers);
  2. 調(diào)用 unsafe 函數(shù)(包括 C 函數(shù),內(nèi)部函數(shù),和原始分配器);
  3. 實現(xiàn) unsafe traits;
  4. 修改(全局)靜態(tài)變量。

上述這四種能力,如果誤用的話,會導致一些未定義行為,具有不確定后果,很容易引起程序崩潰。

Rust 中定義的不確定性行為有如下一些:

  1. 對空指針或懸掛指針進行解引用;
  2. 讀取未初始化的內(nèi)存;
  3. 破壞指針重命名規(guī)則(比如同一資源的 &mut 引用不能出現(xiàn)多次,&mut& 不能同時出現(xiàn));
  4. 產(chǎn)生無效的原生值:
    • 空指針,懸掛指針;
    • bool 值不是 0 或 1;
    • 未定義的枚舉取值;
    • char 值超出取值范圍 [0x0, 0xD7FF] 和 [0xE000, 0x10FFFF];
    • 非 utf-8 字符串;
  5. Unwinding 到其它語言中;
  6. 產(chǎn)生一個數(shù)據(jù)競爭。

以下一些情況,Rust 認為不屬于安全性的處理范疇,即認為它們是“安全”的:

  1. 死鎖;
  2. 存在競爭條件;
  3. 內(nèi)存泄漏;
  4. 調(diào)用析構(gòu)函數(shù)失??;
  5. 整數(shù)溢出;
  6. 程序被中斷;
  7. 刪除產(chǎn)品數(shù)據(jù)庫(:D);

參考

下面一些鏈接,給出了安全性更詳細的講解(部分未來會有對應的中文翻譯)。