Bản phát hành Rust 1.98.0: Sự thỏa hiệp của gói arrayref, gói đã được tải xuống 53 triệu lần trong 3 tháng.

Ngôn ngữ lập trình Rust 1.98, được sáng lập bởi dự án Mozilla nhưng hiện được phát triển dưới sự bảo trợ của tổ chức phi lợi nhuận độc lập Rust Foundation, đã được phát hành. Ngôn ngữ này tập trung vào tính bảo mật bộ nhớ và cung cấp các công cụ để đạt được tính song song cao trong thực thi tác vụ, đồng thời không cần sử dụng trình thu gom rác và thời gian chạy (thời gian chạy được rút gọn thành việc khởi tạo và bảo trì cơ bản thư viện chuẩn).

Các phương thức quản lý bộ nhớ của Rust được thiết kế để loại bỏ lỗi trong thao tác con trỏ và bảo vệ chống lại các sự cố phát sinh từ quản lý bộ nhớ cấp thấp, chẳng hạn như truy cập bộ nhớ sau khi nó đã được giải phóng, tham chiếu con trỏ null, tràn bộ đệm, v.v. Dự án đang phát triển trình quản lý gói Cargo để phân phối thư viện, tạo điều kiện thuận lợi cho việc xây dựng và quản lý các phụ thuộc. Kho lưu trữ crates.io được duy trì để lưu trữ các thư viện.

An toàn bộ nhớ được cung cấp trong Rust tại thời điểm biên dịch thông qua kiểm tra tham chiếu, theo dõi quyền sở hữu đối tượng, theo dõi thời gian tồn tại của đối tượng (phạm vi) và đánh giá tính chính xác của quyền truy cập bộ nhớ trong quá trình thực thi mã. Rust cũng cung cấp khả năng bảo vệ chống tràn số nguyên, yêu cầu khởi tạo bắt buộc các giá trị biến trước khi sử dụng, xử lý lỗi tốt hơn trong thư viện chuẩn, áp dụng khái niệm tham chiếu và biến bất biến theo mặc định, cung cấp kiểu gõ tĩnh mạnh để giảm thiểu lỗi logic.

Những đổi mới chính:

  • Đối với các kiểu dữ liệu dấu phẩy động f32 và f64, các phương thức đại số cho phép cộng, trừ, nhân, chia và lấy dư được triển khai, thực hiện các tối ưu hóa tương tự như tùy chọn "-ffast-math" trong trình biên dịch C/C++. Các phương thức này cho phép thay đổi thứ tự các phép toán khi cần thiết cho các tối ưu hóa như vector hóa vòng lặp. Ví dụ, khi tính "a + b + c + d" bằng phép cộng thông thường, trình biên dịch sẽ luôn thực hiện phép tính theo cùng một thứ tự: "((a + b) + c) + d", nhưng bằng cách sử dụng phương thức algebraic_add, nó có thể nhóm biểu thức thành "(a + b) + (c + d)" và thực hiện "(a + b)" và "(c + d)" song song bằng cách sử dụng các lệnh SIMD. Nhược điểm của việc sử dụng các phương thức đại số là tính không xác định của kết quả tính toán, có thể thay đổi trong phạm vi sai số.
  • Tất cả các kiểu số nguyên cơ bản đều có phương thức "format_into" tích hợp sẵn để chuyển đổi số thành chuỗi, có thể được sử dụng thay cho gói itoa. Một bộ đệm NumBuffer được truyền làm tham số. , với kích thước được đảm bảo đủ để ghi bất kỳ giá trị nào thuộc kiểu dữ liệu được sử dụng ở dạng thập phân. Đầu ra là một chuỗi được định dạng &str, có thời gian tồn tại gắn liền với bộ đệm.
  • Sự tương tác giữa bộ điều khiển ManuallyDrop và con trỏ thông minh Box không còn dẫn đến hành vi không xác định nữa.
  • Một phần mới của API đã được chuyển sang danh mục ổn định, bao gồm các phương pháp và cách triển khai các đặc điểm đã được ổn định:
    • str::substr_range
    • [T]::subslice_range
    • core::fmt::NumBuffer
    • <{integer}>::format_into
    • Gửi/Đồng bộ cho std::process::CommandArgs
    • {fN}::algebraic_add
    • {fN}::algebraic_sub
    • {fN}::algebraic_mul
    • {fN}::algebraic_div
    • {fN}::algebraic_rem
    • NonZero<{integer}>::from_str_radix
    • String::from_utf16le
    • String::from_utf16le_lossy
    • String::from_utf16be
    • String::from_utf16be_lossy
    • [T]::strip_circumfix
    • str::strip_circumfix
    • Nguyên tử ::from_mut
    • Nguyên tử ::get_mut_slice
    • Nguyên tử ::from_mut_slice
    • std::range::legacy
  • Các nền tảng mục tiêu thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf và thumbv8r-none-eabihf đã được chuyển sang cấp độ hỗ trợ thứ hai, bao gồm đảm bảo xây dựng thành công nhưng không đảm bảo vượt qua bộ kiểm thử.
  • Đã bổ sung hỗ trợ cho các nền tảng powerpc64-unknown-linux-gnuelfv2 và aarch64-unknown-linux-pauthtest, hiện đang ở mức hỗ trợ cấp 3. Cấp độ 3 bao gồm hỗ trợ cơ bản, nhưng không bao gồm kiểm thử tự động, phát hành bản dựng chính thức hoặc xác minh bản dựng.

Ngoài ra, gói thư viện phổ biến arrayref, đã được tải xuống hơn 53 triệu lần trong 90 ngày qua và được sử dụng làm phụ thuộc bởi 403 gói khác, cũng bị xâm phạm. Kẻ tấn công đã đăng tải các gói mới chứa mã độc hại lên kho lưu trữ crates.io: proc-macro1, proc-macro-en, aovine, arone, aronenao và tinymember. Sau đó, các phiên bản mới của arrayref 0.3.10, internment 0.8.7 và append-only-vec 0.1.9 đã được công bố lên kho lưu trữ, mỗi phiên bản đều thêm gói proc-macro1 độc hại làm phụ thuộc. Phiên bản độc hại của gói arrayref được đăng tải vào ngày 20 tháng 8 lúc 10:15 sáng (MSK) và vẫn hoạt động cho đến 11:41 sáng, sau đó đã bị quản trị viên crates.io gỡ bỏ.

Người bảo trì gói arrayref vẫn chưa được liên hệ để làm rõ tình hình, nhưng người ta tin rằng thông tin đăng nhập của họ đã bị tin tặc đánh cắp. Trong gói proc-macro1, một thay đổi độc hại đã được thực hiện trong tập lệnh xây dựng và tải một tệp thực thi từ một thư mục bên ngoài. người phục vụTệp đã tải xuống được lưu dưới dạng /tmp/rust-setup trên các hệ thống Unix, và trong Windows — %TEMP%\rust-setup.ps1 hoặc %TEMP%\rust-setup-launch.vbs.

Nguồn: opennet.ru

Mua dịch vụ lưu trữ đáng tin cậy cho các trang web có bảo vệ DDoS, máy chủ VPS VDS 🔥 Mua dịch vụ hosting website đáng tin cậy với bảo vệ DDoS, máy chủ VPS VDS | ProHoster