Rust 1.93.0 is now stable and was released today. It focuses on tightening up the compiler’s safety guarantees while providing crucial new tools for performance-critical tasks. It is a solid release that makes the language feel more mature in areas that matter most.
If you build static binaries for Linux (especially on x86_64 or aarch64), your networking reliability is about to get a major boost. Rust 1.93 bumps the bundled musl library to version 1.2.5, which solves some long-standing headaches with DNS resolution in the older versions. This is great news if you are building portable Linux binaries that handle networking, because it makes that functionality much more reliable.
This especially helps when dealing with large DNS records or complicated recursive nameservers. The musl update removed some legacy compatibility symbols. The Rust libc crate used these symbols. However, a fix was shipped for this issue over two years ago, so most modern projects should not experience any issues during the upgrade process.
By allowing global allocators to access thread-local storage, the standard library now lets you safely use features like std::thread_local! without triggering re-entrancy issues. For those of you writing highly optimized, low-level code, the new support for cfg attributes directly on asm! lines is fantastic. Previously, if you wanted to conditionally include a few assembly instructions based on target features, you had to duplicate the entire asm! block inside conditional compilation statements.
Now, you can apply conditional compilation, like #[cfg(target_feature = “sse2”)], directly to individual lines of assembly or constraints inside the block. This makes writing platform-specific optimizations much cleaner and easier to maintain.
The release stabilizes a large number of APIs, giving developers new tools for managing memory and data structures. Several new methods for MaybeUninit slices are now stable. These include assume_init_drop, assume_init_ref, and methods like write_copy_of_slice. These provide granular control over memory safety when dealing with uninitialized buffers. If you work with FFI or custom memory management, you will also appreciate that String::into_raw_parts and Vec::into_raw_parts are now official.
This lets you deconstruct these collections into their core components like raw pointers, lengths, and capacities. Performance junkies will appreciate the stabilization of unchecked integer operations like unchecked_neg, unchecked_shl, and unchecked_shr. These are crucial for writing extremely fast, unsafe code where the developer guarantees that overflow or invalid shifts will not happen.
For everyday use, the VecDeque collection has methods like pop_front_if and pop_back_if. This lets users conditionally remove items from either end of the queue, making queue logic much simpler.
The deref_nullptr lint, which catches attempts to dereference null pointers, is now deny-by-default. This is a very welcome change because it helps catch critical safety issues at compile time rather than during runtime. New warnings were also added, including function_casts_as_integer and const_item_interior_mutations. These help enforce best practices and prevent subtle bugs related to interior mutability within constant items.
The environment variable CARGO_CFG_DEBUG_ASSERTIONS is now enabled in build scripts based on the active profile. This gives build scripts more context about how the code is being compiled. Additionally, cargo clean now supports the –workspace flag, simplifying cleanup for large multi-package projects. If you frequently analyze dependency graphs, cargo tree now supports long forms for its –format variables, making complex output easier to customize.
There’s a lot to see in this new version, and you’ll be happy you upgraded. If you already have Rust installed, you can get the update right now by running rustup update stable.
Source: Rust (1), Rust (2)

