1 điểm bởi GN⁺ 4 giờ trước | 1 bình luận | Chia sẻ qua WhatsApp
  • Bản phát hành stable Rust 1.97.0 thay đổi cách tạo symbol trong sản phẩm biên dịch và luồng xử lý cảnh báo khi build; có thể cập nhật bằng rustup update stable
  • symbol mangling v0 trở thành mặc định stable, chuyển sang hệ thống tên symbol riêng cho Rust, trong khi cách cũ dựa trên Itanium ABI đang đi theo hướng bị loại bỏ
  • Cargo dùng CARGO_BUILD_WARNINGS thay cho RUSTFLAGS=-Dwarnings để kiểm soát cảnh báo ở các mức allow, warn, deny, giúp dễ tách chính sách build giữa CI và môi trường local
  • rustc hiển thị output của linker dưới dạng cảnh báo linker_messages ngay cả khi link thành công; lint này hiện không chịu ảnh hưởng của lint group warnings
  • Thư viện chuẩn bao gồm việc ổn định Default cho RepeatN, Send cho std::fs::File trên UEFI, các phương thức bit cho số nguyên và NonZero, cùng char::is_control trong const context

Cập nhật Rust 1.97.0

  • Rust 1.97.0 là một bản phát hành stable; người dùng đã cài Rust bằng rustup có thể cập nhật bằng lệnh sau
rustup update stable
  • Nếu chưa có rustup, có thể tải từ trang cài đặt rustup trên website Rust
  • Các thay đổi chi tiết được tổng hợp trong detailed release notes for 1.97.0
  • Nếu muốn tham gia kiểm thử các bản phát hành trong tương lai, có thể dùng kênh beta/nightly bằng rustup default beta hoặc rustup default nightly, và báo cáo lỗi phát hiện được trên Rust issue tracker

Các thay đổi về hành vi biên dịch và build trên stable

  • Bật mặc định symbol mangling v0

    • Khi Rust được biên dịch thành object file hoặc binary, mỗi mục như function, static... phải có một symbol duy nhất trên phạm vi toàn cục
    • Để tránh xung đột khi link nhiều chương trình Rust khác nhau với nhau, Rust mangling tên bằng cách đưa các ngữ cảnh như module path, crate định nghĩa và generic vào tên mục gốc
    • Cơ chế mangling cũ dựa trên Itanium ABI, vốn cũng được dùng trong một số trường hợp với C++
    • Cách mới giữ lại giá trị khởi tạo của tham số generic và giảm vấn đề vẫn cần demangling tùy chỉnh do sự không nhất quán khi chỉ dùng một phần Itanium ABI
    • Từ Rust 1.59, có thể chọn cơ chế mangling riêng cho Rust bằng -Csymbol-mangling-version=v0, và từ tháng 11/2025 cơ chế này đã được áp dụng làm mặc định trên nightly
    • Trong Rust 1.97, cơ chế này trở thành mặc định của stable Rust, còn legacy mangling chỉ có thể bật trên nightly
    • Kế hoạch hiện tại là loại bỏ hoàn toàn legacy mangling
    • Có thể xem thêm chi tiết trong bài viết trước đó switching to v0 mangling on nightly
  • Kiểm soát cảnh báo trong Cargo

    • Việc coi cảnh báo là lỗi build trong CI là một thông lệ phổ biến, và trước đây thường dùng RUSTFLAGS=-Dwarnings
    • Từ Rust 1.97, Cargo trực tiếp kiểm soát mối quan hệ giữa cảnh báo và việc build thành công
      • allow: ẩn cảnh báo
      • warn: giá trị mặc định, hiển thị cảnh báo nhưng không làm thất bại build
      • deny: từ chối cảnh báo và coi là build thất bại
    • Vì hành vi của tính năng này được quyết định bằng cấu hình Cargo, nên không làm mất hiệu lực cache build mặc định
    • Nếu muốn tạm thời giảm nhiễu cảnh báo trong lúc sửa lỗi sau khi refactor, có thể chạy như sau
CARGO_BUILD_WARNINGS=allow cargo check
  • Trên CI, có thể đặt CARGO_BUILD_WARNINGS=deny để từ chối cảnh báo
  • Khi dùng cùng --keep-going, có thể thu thập tất cả lỗi và cảnh báo mà không dừng lại ở package thất bại đầu tiên
  • Cấu hình chi tiết có trong build.warnings documentation của Cargo
  • Hiển thị mặc định output của linker

    • rustc gọi linker thay cho người dùng, và trước đây nếu link thành công thì mặc định ẩn output của linker
    • Từ Rust 1.97, linker message được hiển thị mặc định và được xuất dưới dạng warning lint như sau
warning: linker stderr: ignoring deprecated linker optimization setting '1'
  |
  = note: `#[warn(linker_messages)]` on by default
  • rustc lọc các linker message phổ biến đã được chẩn đoán là false positive hoặc hành vi có chủ đích
  • Sau khi không còn ẩn output này trên nightly, nhiều lỗi đã được sửa
  • Hiện linker_messages là một lint đặc biệt và không chịu ảnh hưởng của lint group warnings
  • Thông thường rustc không thể kiểm soát output của linker một cách chính xác, và output có thể chỉ xuất hiện trên một số platform
  • Nếu có vẻ là output false positive của linker, có thể gửi issue
  • Để ẩn cảnh báo, có thể đặt lint level thành allow, và thêm lints section sau vào Cargo.toml
[lints.rust]
linker_messages = "allow"

API đã được ổn định

Changelog liên quan

1 bình luận

 
Các ý kiến trên Lobste.rs
  • Việc trong Rust 1.97, Cargo có thể kiểm soát mối quan hệ giữa cảnh báo và việc build có thành công hay không là một tính năng mới rất hay
    Nếu cảnh báo gây vướng trong lúc sửa lỗi sau khi refactor, có thể tạm ẩn bằng CARGO_BUILD_WARNINGS=allow cargo check; còn trong CI thì có thể dùng CARGO_BUILD_WARNINGS=deny để coi cảnh báo là thất bại. Khi dùng cùng --keep-going, nó sẽ không dừng ở package đầu tiên thất bại mà có thể thu thập tất cả lỗi và cảnh báo

  • Có lẽ nên tạm hoãn nâng cấp một thời gian. Có vẻ có lỗi biên dịch sai
    https://github.com/rust-lang/rust/issues/159035

    • Điều thú vị là lỗi biên dịch sai này đã tồn tại suốt 10 bản phát hành, nhưng trước đây chỉ đọc hơi vượt phạm vi một chút, còn giờ dường như đọc vượt xa hơn nhiều nên gây segfault
    • Đó là lỗi của LLVM. May mắn là bản sửa có vẻ khá thẳng thắn
      https://github.com/llvm/llvm-project/pull/208683
  • Tuyệt. Không biết có ai có thể tóm tắt tiến độ triển khai pattern types ở đây không

  • Đáng tiếc là never type lần này vẫn chưa được ổn định hóa. Mong chờ bản phát hành tiếp theo

    • Câu đùa “never type được đặt tên theo ngày ổn định hóa của nó” giờ cũng gần hết thời rồi
    • Một thành viên của nhóm compiler đã thuyết trình về never type tại RustWeek. Nên xem vì nó có thể giúp ước lượng triển vọng ổn định hóa tốt hơn: https://www.youtube.com/watch?v=3jM4cnEVrLc