Unsafe Rust là gì?

Unsafe Rust cho bạn nhiều quyền kiểm soát bộ nhớ hơn. Bài viết sẽ cung cấp cho bạn những điều cần biết về cách dùng Unsafe Rust và hiểu những rủi ro khi sử dụng nó.

Unsafe Rust

Đảm bảo an toàn bộ nhớ là một trong số điểm đáng giá của Rust, tuy nhiên, Rust không tránh khỏi lỗi và lỗ hổng. Vì borrow checker của Rust triển khai mô hình quyền sở hữu nên có một sự đánh đổi nhỏ về thời gian biên soạn trong quá trình kiểm tra an toàn.

Rust cung cấp tính năng bỏ qua kiểm tra an toàn, mang tên Unsafe Rust, cho phép bạn tránh những kiểm tra an toàn này vì mục đích hiệu suất. Unsafe Rust là một công cụ mạnh mẽ để viết phần mềm hệ thống cấp độ thấp hiệu quả với Rust.

Hiểu về Unsafe Rust

Unsafe Rust là một nhóm các tính năng mà bạn có thể dùng để bỏ qua đảm bảo an toàn của Rust để đổi lấy quyền kiểm soát bộ nhớ tốt hơn. Các tính năng Unsafe Rust bao gồm những con trỏ đơn thuần, hàm và trait unsafe.

Mục đích của Rust unsafe là cung cấp cho lập trình viên khả năng viết code hệ thống cấp thấp mà không làm giảm hiệu suất. Bạn có thể truy cập và thao tác trực tiếp với tài nguyên bộ nhớ và tăng hiệu suất của ứng dụng với Unsafe Rust.

Unsafe Rust đặc biệt hữu ích trong phát triển hệ điều hành, lập trình network và phát triển game. Khi đó, hiệu suất thật sự quan trọng. Trong trường hợp này, bạn cần kiểm soát chi tiết bố cục bộ nhớ và hoạt động của code. Unsafe Rust cho phép bạn đạt được điều này bằng cách cung cấp sự trừu tượng hóa cấp thấp để triển khai những thuật toán phức tạp và cấu trúc dữ liệu.

Làm việc với Unsafe Rust

Các khối Unsafe cung cấp chức năng kể trên cho việc dùng các tính năng Unsafe Rust. Bạn sẽ dùng từ khóa unsafe để xác định các khối unsafe chứa code Rust hợp lệ.

Đây là cách bạn có thể dùng một khối unsafe để truy cập trực tiếp bộ nhớ phục vụ cho việc sửa đổi giá trị:

fn main() {
    let mut x = 10;

    unsafe {
        let raw = &mut x as *mut i32;
        *raw = 20;
    }

    println!("x is now {}", x);
}

Biến x là một số nguyên có thể thay đổi. Trong khối unsafe, raw pointer trỏ tới x gắn một giá trị mới cho x. Code này trong khối unsafe là hợp lệ nhưng không an toàn và đã không nằm trong khối unsafe nên chương trình bị lỗi.

Raw pointer trong Rust

Thêm vào đó, bạn có thể xác định các hàm unsafe bằng cách thêm từ khóa unsafe trước fn trong khai báo hàm.

unsafe fn perform_unsafe_operation() {
    // Your unsafe code here
}

Bạn sẽ cần một khối unsafe để gọi hàm unsafe trong các phần khác của chương trình này.

fn main() {
    unsafe {
        perform_unsafe_operation();
    }
}

Tạo các hàm với từ khóa unsafe không có nghĩa hàm đó vốn nguy hiểm. Nó chỉ ra rằng hàm này chứa code cần thận trọng khi sử dụng.

Rủi ro khi sử dụng Unsafe Rust

Những rủi ro khi dùng Unsafe Rust

Việc sử dụng Unsafe Rust không đúng cách có thể dẫn đến lỗi bộ nhớ, data race và các lỗ hổng bảo mật khác. Do đó, điều quan trọng là phải hiểu các rủi ro trong khi tuân theo các phương pháp hay nhất liên quan đến Unsafe Rust để viết mã an toàn và hiệu quả.

Rủi ro chính liên quan tới Unsafe Rust là những vấn đề về lỗi bộ nhớ có thể gây treo hệ thống, tạo lỗ hổng bảo mật và hành vi code bất thường.

Lỗi bộ nhớ xảy ra khi một chương trình cố gắng truy cập bộ nhớ một cách bất thường. Chương trình này cuối cùng còn bị treo, thậm chí còn hoạt động khó đoán.

Data race xảy ra khi từ hai luồng chương trình trở nên truy cập đồng thời cùng một phần bộ nhớ, ít nhất một trong số những luồng này đang chỉnh sửa giá trị ở bộ nhớ, do đó khiến chương trình hoạt động không như mong đợi.

Bạn có thể kích hoạt lỗi tràn bộ đệm khi dùng Unsafe Rust sai cách. Lỗi tràn bộ đệm xảy ra khi một chương trình ghi dữ liệu vượt quá phần cuối của bộ đệm. Tràn bộ đệm có thể khiến chương trình bị treo hoặc cho phép những kẻ tấn công thực thi code tùy ý.

Lỗ hổng khác là use-after-free (UAF), xảy ra khi chương trình này truy cập bộ nhớ sau khi phân bổ lại giá trị. UAF có thể khiến chương trình này hoạt động khó doán và tiềm ẩn lỗ hổng bảo mật.

Vì thế, khi làm việc với Unsafe Rust, bạn cần nắm được quyền sở hữu và cách mô hình vay mượn hoạt động trong Rust.

Rust cho phép quản lý bộ nhớ linh hoạt

Mô hình quyền sở hữu của Rust quản lý bộ nhớ tự động, giảm rủi ro sinh lỗi liên quan tới bộ nhớ. Borrowing cho phép nhiều biến truy cập cùng tài nguyên bộ nhớ mà không lo xung đột.

Quản lý bộ nhớ của Rust cung cấp tính linh hoạt, an toàn và hiệu suất cần thiết cho phát triển phần mềm hiện đại, khiến Rust trở thành một công cụ mạnh mẽ trong lĩnh vực viết code đáng tin cậy.

Thứ Ba, 23/05/2023 16:36
51 👨 153
0 Bình luận
Sắp xếp theo