bytemuck changelog


  • Remove the requirement for the source data type to be AnyBitPattern on pod_collect_to_vec, allowing you to pod collect vecs of char into vecs of u32, or whatever.


  • Now depends on bytemuck_derive-1.4.0
  • Various small enhancements that would have been patch version updates, but which have been rolled into this minor version update.


  • This has additional impls for existing traits and cleans up some internal code, but there's no new functions so I guess it counts as just a patch release.


  • This bugfix makes the crate do stuff with Arc or not based on the target_has_atomic config. Previously, some targets that have allocation but not atomics were getting errors. This raises the MSRV of the extern_crate_alloc feature to 1.60, but opt-in features are not considered to be hard locked to 1.34 like the basic build of the crate is.


  • Fixes try_pod_read_unaligned bug that made it always fail unless the target type was exactly pointer sized in which case UB could happen. The CheckedBitPattern::is_valid_bit_pattern was being asked to check that a reference to the pod value was a valid bit pattern, rather than the actual bit pattern itself, and so the check could in some cases be illegally bypassed.


  • Patch bumped the required bytemuck_derive version because of a regression in how it handled align(N) attributes.


  • This minor version bump is caused by a version bump in our bytemuck_derive dependency, which is in turn caused by a mixup in the minimum version of syn that bytemuck_derive uses. See Issue 122. There's not any specific “new” API as you might normally expect from a minor version bump.
  • pali fixed a problem with SPIR-V builds being broken. The error handling functions were trying to be generic over Display, which the error types normally support, except on SPIR-V targets (which run on the GPU and don't have text formatting).


  • WaffleLapkin added wrap_box and peel_box to the TransparentWrapperAlloc trait. Default impls of these functions are provided, and (as usual with the transparent trait stuff) you should not override the default versions.


  • TheEdward162 added the ZeroableInOption and PodInOption traits. These are for types that are Zeroable or Pod when in an option, but not on their own. We provide impls for the various “NonZeroINTEGER” types in core, and if you need to newtype a NonZero value then you can impl these traits when you use repr(transparent).


  • Bumped the minimum bytemuck_derive dependency version from 1.0 to 1.1. The fact that bytemuck and bytemuck_derive are separate crates at all is an unfortunate technical limit of current Rust, woe and calamity.


  • fu5ha added the NoUninit, AnyBitPattern, and CheckedBitPattern traits. This allows for a more fine-grained level of detail in what casting operations are allowed for a type. Types that already implement Zeroable and Pod will have a blanket impl for these new traits. This is a “preview” of the direction that the crate will probably go in the eventual 2.0 version. We're still waiting on Project Safe Transmute for an actual 2.0 version of the crate, but until then please enjoy this preview.
  • Also Fusha added better support for union types in the derive macros. I still don't know how any of the proc-macro stuff works at all, so please direct questions to her.


  • try_pod_read_unaligned and pod_read_unaligned let you go from &[u8] to T:Pod without worrying about alignment.


  • Experimental support for the portable_simd language extension under the nightly_portable_simd cargo feature. As the name implies, this is an experimental crate feature and it's not part of the semver contract. All it does is add the appropriate Zeroable and Pod impls.


  • Why does this repo keep being hit with publishing problems? What did I do to deserve this curse, Ferris? This doesn't ever happen with tinyvec or fermium, only bytemuck.


  • Soundness Fix: The wrap/peel methods for owned value conversion, added to TransparentWrapper in 1.6, can cause a double-drop if used with types that impl Drop. The fix was simply to add a ManuallyDrop layer around the value before doing the transmute_copy that is used to wrap/peel. While this fix could technically be backported to the 1.6 series, since 1.7 is semver compatible anyway the 1.6 series has simply been yanked.


  • In response to Unsafe Code Guidelines Issue #286, this version of Bytemuck has a Soundness-Required Breaking Change. This is “allowed” under Rust‘s backwards-compatibility guidelines, but it’s still annoying of course so we're trying to keep the damage minimal.
    • The Reason: It turns out that pointer values should not have been Pod. More specifically, ptr as usize is not the same operation as calling transmute::<_, usize>(ptr).
    • LLVM has yet to fully sort out their story, but until they do, transmuting pointers can cause miscompilations. They may fix things up in the future, but we're not gonna just wait and have broken code in the mean time.
    • The Fix: The breaking change is that the Pod impls for *const T, *mut T, and Option<NonNull<T> are now gated behind the unsound_ptr_pod_impl feature, which is off by default.
    • You are strongly discouraged from using this feature, but if a dependency of yours doesn‘t work when you upgrade to 1.7 because it relied on pointer casting, then you might wish to temporarily enable the feature just to get that dependency to build. Enabled features are global across all users of a given semver compatible version, so if you enable the feature in your own crate, your dependency will also end up getting the feature too, and then it’ll be able to compile.
    • Please move away from using this feature as soon as you can. Consider it to already be deprecated.
    • PR 65


  • Small goof with an errant ;, so PR 69 actually got things working on SPIR-V.


cargo upload goof! ignore this one.


  • DJMcNab did a fix so that the crate can build for SPIR-V PR 67


  • The TransparentWrapper trait now has more methods. More ways to wrap, and now you can “peel” too! Note that we don't call it “unwrap” because that name is too strongly associated with the Option/Result methods. Thanks to LU15W1R7H for doing PR 58
  • Min Const Generics! Now there's Pod and Zeroable for arrays of any size when you turn on the min_const_generics crate feature. zakarumych got the work started in PR 59, and chorman0773 finished off the task in PR 63


  • Fix bytes_of failing on zero sized types. PR 53


  • Added pod_collect_to_vec, which will gather a slice into a vec, allowing you to change the pod type while also safely ignoring alignment. PR 50


  • Kimundi fixed an issue that could make try_zeroed_box stack overflow for large values at low optimization levels. PR 43


  • thomcc fixed up the CI and patched over a soundness hole in offset_of!. PR 38


  • icewind1991 has contributed the proc-macros for deriving impls of Pod, TransparentWrapper, Zeroable!! Everyone has been waiting for this one folks! It‘s a big deal. Just enable the derive cargo feature and then you’ll be able to derive the traits on your types. It generates all the appropriate tests for you.
  • The zeroable_maybe_uninit feature now adds a Zeroable impl to the MaybeUninit type. This is only behind a feature flag because MaybeUninit didn't exist back in 1.34.0 (the minimum rust version of bytemuck).


  • The entire crate is now available under the Apache-2.0 OR MIT license as well as the previous Zlib license #24.
  • HeroicKatora added the try_zeroed_slice_box function #10. zeroed_slice_box is also available.
  • The offset_of! macro now supports a 2-arg version. For types that impl Default, it'll just make an instance using default and then call over to the 3-arg version.
  • The PodCastError type now supports Hash and Display. Also if you enable the extern_crate_std feature then it will support std::error::Error.
  • We now provide a TransparentWrapper<T> impl for core::num::Wrapper<T>.
  • The error type of try_from_bytes and try_from_bytes_mut when the input isn't aligned has been corrected from being AlignmentMismatch (intended for allocation casting only) to TargetAlignmentGreaterAndInputNotAligned.


  • Had a bug because the CI was messed up! It wasn't soundness related, because it prevented the crate from building entirely if the extern_crate_alloc feature was used. Still, this is yanked, sorry.


  • thomcc added many things:
    • A fully sound offset_of! macro #10
    • A Contiguous trait for when you've got enums with declared values all in a row #12
    • A TransparentWrapper marker trait for when you want to more clearly enable adding and removing a wrapper struct to its inner value #15
    • Now MIRI is run on CI in every single push! #16


  • SimonSapin added from_bytes, from_bytes_mut, try_from_bytes, and try_from_bytes_mut (PR Link)


  • Changed to the zlib license.
  • Added much more proper documentation.
  • Reduced the minimum Rust version to 1.34