30 Ngày học Rust - Day 22: Về Phe Bóng Tối với Unsafe Rust
Day 22: Điều làm cho lõi hạt nhân của Linux và Windows chấp nhận Rust, đó là nhờ Unsafe Mode. Vượt qua giới hạn của Compiler, tự mình chọc thẳng vào The Matrix Bảng Bộ Nhớ.

Mạch Mã Mất Đi Vỏ Bọc Che Chở The Safe Rust
Ngài Trình Biên Dịch (Compiler) ở thế giới Safe Rust (21 ngày qua bạn học) là một vị bảo mẫu siêu Cục Cằn Nhàm Chán. Nó kiểm toán Borrow Checker gắt gao. Phàm bất kì cái Biến Mượn nào chỉ cần HƠI TRÁI THỜI GIAN NHỊP TIM Sinh Học, Nó Bóp Cổ Đòi Gãy Build Panics. Cơ Mục Ấy Chống 100% Data Races. Tuy Nhiên.. Phần Cứng Máy Tính (Hardware CPU & VGA) Thì Vô Tình. Máy vi Tính Ở Cấp Vi Mạch KHÔNG QUAN TÂM mốc Sống Lifetimes. Chúng Là Lõi Đồng Vô Trị Tái Trợ Địa Chỉ Điện, Độc Chiếm Trỏ Nhay Liên Hoàn Nghịch Thập. Nếu Cứ Áp Luật Ngai Sứ Gỉa Vô Lố Rust Tròn Kín, Ta Trọn Kiếp Đéo Rèn Được Cỗ Hệ Điều Hành Windows Bự Áo.
Giao Diện Chuyển Cổng Kích Sinh Siêu Năng: Khoác Chiếc Áo Khối Chữ unsafe.

1. 5 Quyền Năng Tà Đạo Khai Mở Dưới Bóng Unsafe
Khi bạn Gói Code Vào Dồn Khối unsafe { ... }, Rust Xóa Mù Đuổi Compiler Kiểm Bộ Nhớ, Nhường Bút Kéo Cho Sinh Mạng Cổ Nhú Của Bạn Lập Quyền Gọi:
- Đọc và Rút Họng (Dereference) Hắn Chìa Đạn Rò Raw Pointers C.
- Gọi Các Hàm Rạch Tà Trọng Phạm Unsafe (Việt Gọi Hàm Móc Extern Function Tụ C/C++ Code).
- Đụng Phá Đổi Lọc Biến SỐ Tĩnh Ác Global (Mut Static Variables).
- Phá Mộc Đạo Lí Vi Trúc Trait Sống Bạo Lực Quyền Trợ (Unsafe Traits).
- Chi Cảng Nấu Rút Khối Data Tại Lõi Tấm Kiên
union.
2. Nắm Giữ Raw Pointers Bụi Bẩn (Con Trỏ Thô C)
Ở Dưới Móc Tà Vực C++, Hắn gọi Con Trỏ Thẳng. Trong Rust Nó Ràng Gắn Tên Nhục Xấu Xí: *const T và *mut T. Mạng Lưu Ý Cái Gạch Dấu * Đó Là Chữ Chỉ Loại Chứ Không Phải Dấu Nhân Hay Deref Đọc Vội! Đầu Không Có Sợ Rụng &&.
let mut num = 5;
// Biến Bùa Trấn Safe Reference Trực Tiếp Thành Bùa Lỗ Cắm Phế Thô Nhám Bụi: Raw Pointer.
// DÙ KHÔNG GHI UNSAFE BẢN TRÁI. TẠO RA RAW POINTER LÀ AN TOÀN Nhé.
let r1 = &num as *const i32;
let r2 = &mut num as *mut i32;
// NHƯNG NHƯNG NHƯNG!! HÀNH ĐỘNG DÙNG ÁNH SÁNG DEREF LỘT VÁCH NÓ SỞ Data TÚM THÌ PHẢI BỌC BÌA UNSAFE MỞ CỬA:
unsafe {
println!("Dữ Liệu Vực R1: {}", *r1);
*r2 = 10;
println!("Dữ Liệu Ghi Nát Đè Tại R2 Cùng Cái Địa Chỉ Đất Kia Nè C: {}", *r2);
}Bạn Nhìn Coi Mạch Trống Kia? Khảo Cõi Dưới, Ta Chĩa Song Hờ Thẳng 2 Ống Cùng Lúc Rúc Vô 1 Ổ Data: Vi Phạm Đoạt Quyền The Borrow Checker Đã Chỉ Dạy Từ Bài 5 Rõ Ràng Lại! Ta Đã Ở Ma Đạo Lầm Mốc Data Races Bốc Khói (Lúc Nếu Chơi Thêm Kẹp Thread).
3. Chọc Cổng Xuyên Hãng Biển Nhập Gọi Sang Thập Giá C Nước Ngoài FFI
Một Lí Do Dev Lớn Bám Mặt Sờ Tới unsafe là Vì Ứng dụng Không Đơn Điệu Một Mình Thả Thính. Nó Muốn Gọi Mảng Của Lõi OpenSSL C, Hay Python NumPy Phóng.
// Khối Gọi Khải Đạo Lưới Sắn Đi C/C++ FFI Cực Đầm Trì Cổng "C"
extern "C" {
fn abs(input: i32) -> i32;
}
fn main() {
unsafe {
// Ta Éo Biết Cái Cục Nhận Mạng `abs(-3)` Phía Khuôn C Đã Kiểm Mã Cháy Thế Nào, Gói Bọc Cương Tứ Lĩnh Đi!
println!("Đi Lạch Mặt Điểm Vô C Lọc Giá Trị Tuyêt Đổi Từ Hàm Trĩ Nhị: {}", abs(-3));
}
}Câu hỏi thường gặp (FAQ)
Bộ Lõi Động Thần Tốc Std Rust Có Sài Unsafe Bẩn Không?
Mọi Cái Kiệt Xuất Của Framework Mà Bạn Sử Dụng Khen Tới Tuyển Đều Đút Phẫn Viêm Khu Chứa unsafe Khí Tiền Bên Dưới Cuối Mắt Kính Nạn. Ví Dụ Cục Kẽ Dát Mảng Vô Cực Khốc Liệt Oai Phong Mình Xài Thói Nhất: Mảng Vec<T>, Thực Chất Chạy Nguyên Ngầm Mã Hóa Gồm Khuôn Tà Vực Đào Xẻ Xổ Xáo Block Memory alloc Chẻ Ngang Trúng Data Cực Đoan Unsafe! Các DEV Rust Core đã Mòn Chân Kiểm Điểm Từng Byte Kĩ Lưỡng Không Lỗi Để Gói Nó Trong Màng Bảo Vệ Public Mịn Trơn Bọc Ra API push() Cho Lớp Cháu Trẻ Mặc Sức An Tâm Sử Dụng Thỏa Cuồng Lòng Cụ. Unsafe Sinh Ra Trái Khoái Tạo Đế Quốc Góp Cơ Năng Safe Cục. Quá Gắt!
Sẵn sàng cho Ngày 23? Quay gót Quăng Cỗ Đạn Sống Bóc Quật, Tìm Ra Một Trong Những Tối Thượng Phượng Mạch Của Code-Viết-Code Gây Trấn Nhiễm: Lực Bắn Chùm Macros. Nếu Function Nhựa Chế Bịch Nilon Code Có Sẵn, Lỗ Phát Sinh Lệnh Sinh Code Theo Cỡ println! Là Lửa Trụ [Day 23: Declarative Macros - Chiếc Máy Vẽ Hàm Cầm Tay].
Chuỗi bài viết
30 Ngày Trở Thành Rustacean Tinh Hoa
Phần 22 / 30
- Phần 1 30 Ngày học Rust - Day 1: Lời chào thế giới và Vũ khí Cargo
- Phần 2 30 Ngày học Rust - Day 2: Biến, Bất biến (Mutability) và Shadowing
- Phần 3 30 Ngày học Rust - Day 3: Luồng điều khiển (Control Flow) và sức mạnh của Match
- Phần 4 30 Ngày học Rust - Day 4: Ownership - Khái niệm định hình cỗ thần khí Rust
- Phần 5 30 Ngày học Rust - Day 5: Khóa học nhặt đồ chung với References & Borrowing
- Phần 6 30 Ngày học Rust - Day 6: Đắp nặn dự án với Structs và Methods
- Phần 7 30 Ngày học Rust - Day 7: Quyền năng vô song của Enums và Pattern Matching
- Phần 8 30 Ngày học Rust - Day 8: Quản lý dự án với Packages, Crates và Modules
- Phần 9 30 Ngày học Rust - Day 9: Các bộ sưu tập chung (Vectors, Strings, Hash Maps)
- Phần 10 30 Ngày học Rust - Day 10: Trị dứt điểm Ác mộng Lỗi (Error Handling)
- Phần 11 30 Ngày học Rust - Day 11: Generics - Ma thuật Đa hình kiểu dữ liệu
- Phần 12 30 Ngày học Rust - Day 12: Traits - Kẻ ban phát quyền năng và Lập pháp Hành vi
- Phần 13 30 Ngày học Rust - Day 13: Vượt qua Boss cuối 'Lifetimes' - Sinh Mệnh Biến
- Phần 14 30 Ngày học Rust - Day 14: Tận diệt Bug từ trứng nước bằng Automated Tests
- Phần 15 30 Ngày học Rust - Day 15: Thực chiến Build Command Line App (CLI) đầu đời
- Phần 16 30 Ngày học Rust - Day 16: Functional Magic chốn trần gian (Closures & Iterators)
- Phần 17 30 Ngày học Rust - Day 17: Quyền năng của Smart Pointers
- Phần 18 30 Ngày học Rust - Day 18: Chinh phục Da luồng (Concurrency) - Cú đâm quyết định của Rust
- Phần 19 30 Ngày học Rust - Day 19: Tranh cãi Lập trình hướng đối tượng (OOP) trong Rust
- Phần 20 30 Ngày học Rust - Day 20: Mổ xẻ nghệ thuật Advanced Pattern Matching
- Phần 21 30 Ngày học Rust - Day 21: Sức mạnh tối thượng của Advanced Traits
- Phần 22 30 Ngày học Rust - Day 22: Về Phe Bóng Tối với Unsafe Rust
- Phần 23 30 Ngày học Rust - Day 23: Quyền năng của Đấng Tạo Hóa (Declarative Macros)
- Phần 24 30 Ngày học Rust - Day 24: Siêu Năng Lực Procedural Macros (Macro Thủ Tục)
- Phần 25 30 Ngày học Rust - Day 25: Xây dựng TCP Web Server Đa Luồng (Phần 1: Lõi Socket)
- Phần 26 30 Ngày học Rust - Day 26: Xây dựng TCP Web Server Đa Luồng (Phần 2: Bắn trả File HTML)
- Phần 27 30 Ngày học Rust - Day 27: Xây dựng TCP Web Server Đa Luồng (Phần 3: The Thread Pool)
- Phần 28 30 Ngày học Rust - Day 28: Xây dựng TCP Web Server Đa Luồng (Phần 4: Graceful Shutdown)
- Phần 29 30 Ngày học Rust - Day 29: Lên đỉnh Web Server Thực Chiến với Axum và Tokio
- Phần 30 30 Ngày học Rust - Day 30: Vượt Vọng Vàng - Đúc Kết Hành Trình Rustacean Tinh Hoa