1# `bytemuck` changelog 2 3## 1.19 4 5* Adds the `#[track_caller]` attribute to functions which may panic. 6 7## 1.18 8 9* Adds the `latest_stable_rust` cargo feature, which is a blanket feature that turns all other features on that are both sound and compatible with Stable rust. 10 11## 1.17.1 12 13* Adds `#[repr(C)]` to the `union Transmute<A, B>` type that's used internally 14 for most of the transmutations. 15 16## 1.17.0 17 18* Makes the `must_cast` versions of the by-value and by-ref casts be `const`. 19 The mut ref cast is unaffected for now (mut references aren't yet stable in `const fn`). 20 This increases the MSRV of using that particular feature from 1.57 to 1.64. 21 22## 1.16.3 23 24* Fully described in https://github.com/Lokathor/bytemuck/pull/256, This makes 25 casting slices to/from ZST elements more consistent between the crate's core 26 module and other modules. 27 28## 1.16.2 29 30* Fixes potential UB where `BoxBytes` could attempt to free a dangling pointer 31 if the `Layout` is zero sized. This type was introduced in 1.14.1, so that 32 version and the others up to and including 1.16.1 are now yanked for safety. 33 34## 1.16.1 35 36* **NOT SEMVER SUPPORTED:** Adds the `nightly_float` Cargo feature. This 37 activates the `f16` and `f128` nightly features, and then provides `Zeroable` 38 and `Pod` impls for those types. 39 40## 1.16.0 41 42* Adds a `const_zeroed` feature (MSRV 1.75) which puts a `zeroed` fn at the crate root. 43 This is just like the `Zeroable::zeroed` method, but as a `const fn`. 44 45## 1.15.0 46 47This primarily relaxes the bounds on a `From` impl. 48 49Previously: 50 51> `impl<T: NoUninit> From<Box<T>> for BoxBytes` 52 53Now: 54 55> `impl<T: ?Sized + sealed::BoxBytesOf> From<Box<T>> for BoxBytes` 56 57All related functions and methods are similarly updated. 58 59We believe this to be backwards compatible with all previous uses, 60and now `BoxBytes` can be converted to/from more types than before. 61 62## 1.14.3 63 64* The new std simd nightly features are apparently arch-specific. 65 This adjusts the feature activation to be x86/ x86_64 only. 66 67## 1.14.2 68 69* Changes the name of the Nightly feature activated by the crate's 70 `nightly_stdsimd` feature. This is needed as of (approximately) Nightly 71 2024-02-06 and later, because the Nightly feature was changed. 72 73## 1.14.1 74 75* docs clarifications. 76 77## 1.14 78 79* `write_zeroes` and `fill_zeroes` functions: Writes (to one) or fills (a slice) 80 zero bytes to all bytes covered by the provided reference. If your type has 81 padding, this will even zero out the padding bytes. 82* `align_offset` feature: causes pointer alignment checks to use the 83 `align_offset` pointer method rather than as-casting the pointer to `usize`. 84 This *may* improve codegen, if the compiler would have otherwise thought that 85 the pointer address escaped. No formal benchmarks have been done either way. 86* `must_cast` feature: Adds `must_*` family of functions. These functions will 87 fail to compile if the cast requested can't be statically known to succeed. 88 The error messages can be kinda bad when this happens, but eliminating the 89 possibility of a runtime error might be worth it to you. 90 91## 1.13.1 92 93* Remove the requirement for the *source* data type to be `AnyBitPattern` on 94 `pod_collect_to_vec`, allowing you to pod collect vecs of `char` into vecs of 95 `u32`, or whatever. 96 97## 1.13 98 99* Now depends on `bytemuck_derive-1.4.0` 100* Various small enhancements that would have been patch version updates, but 101 which have been rolled into this minor version update. 102 103## 1.12.4 104 105* This has additional impls for existing traits and cleans up some internal code, 106 but there's no new functions so I guess it counts as just a patch release. 107 108## 1.12.3 109 110* This bugfix makes the crate do stuff with `Arc` or not based on the 111 `target_has_atomic` config. Previously, some targets that have allocation but 112 not atomics were getting errors. This raises the MSRV of the 113 `extern_crate_alloc` feature to 1.60, but opt-in features are *not* considered 114 to be hard locked to 1.34 like the basic build of the crate is. 115 116## 1.12.2 117 118* Fixes `try_pod_read_unaligned` bug that made it always fail unless the target 119 type was exactly pointer sized in which case UB *could* happen. The 120 `CheckedBitPattern::is_valid_bit_pattern` was being asked to check that a 121 *reference* to the `pod` value was a valid bit pattern, rather than the actual 122 bit pattern itself, and so the check could in some cases be illegally 123 bypassed. 124 125## 1.12.1 126 127* Patch bumped the required `bytemuck_derive` version because of a regression in 128 how it handled `align(N)` attributes. 129 130## 1.12 131 132* This minor version bump is caused by a version bump in our `bytemuck_derive` 133 dependency, which is in turn caused by a mixup in the minimum version of `syn` 134 that `bytemuck_derive` uses. See [Issue 135 122](https://github.com/Lokathor/bytemuck/issues/122). There's not any 136 specific "new" API as you might normally expect from a minor version bump. 137* [pali](https://github.com/pali6) fixed a problem with SPIR-V builds being 138 broken. The error handling functions were trying to be generic over `Display`, 139 which the error types normally support, except on SPIR-V targets (which run on 140 the GPU and don't have text formatting). 141 142## 1.11 143 144* [WaffleLapkin](https://github.com/WaffleLapkin) added `wrap_box` and `peel_box` 145 to the `TransparentWrapperAlloc` trait. Default impls of these functions are 146 provided, and (as usual with the transparent trait stuff) you should not override 147 the default versions. 148 149## 1.10 150 151* [TheEdward162](https://github.com/TheEdward162) added the `ZeroableInOption` 152 and `PodInOption` traits. These are for types that are `Zeroable` or `Pod` 153 *when in an option*, but not on their own. We provide impls for the various 154 "NonZeroINTEGER" types in `core`, and if you need to newtype a NonZero value 155 then you can impl these traits when you use `repr(transparent)`. 156 157## 1.9.1 158 159* Bumped the minimum `bytemuck_derive` dependency version from `1.0` to `1.1`. 160 The fact that `bytemuck` and `bytemuck_derive` are separate crates at all is 161 an unfortunate technical limit of current Rust, woe and calamity. 162 163## 1.9.0 164 165* [fu5ha](https://github.com/fu5ha) added the `NoUninit`, `AnyBitPattern`, and 166 `CheckedBitPattern` traits. This allows for a more fine-grained level of 167 detail in what casting operations are allowed for a type. Types that already 168 implement `Zeroable` and `Pod` will have a blanket impl for these new traits. 169 This is a "preview" of the direction that the crate will probably go in the 170 eventual 2.0 version. We're still waiting on [Project Safe 171 Transmute](https://github.com/rust-lang/project-safe-transmute) for an actual 172 2.0 version of the crate, but until then please enjoy this preview. 173* Also Fusha added better support for `union` types in the derive macros. I 174 still don't know how any of the proc-macro stuff works at all, so please 175 direct questions to her. 176 177## 1.8.0 178 179* `try_pod_read_unaligned` and `pod_read_unaligned` let you go from `&[u8]` to 180 `T:Pod` without worrying about alignment. 181 182## 1.7.3 183 184* Experimental support for the `portable_simd` language extension under the 185 `nightly_portable_simd` cargo feature. As the name implies, this is an 186 experimental crate feature and it's **not** part of the semver contract. All 187 it does is add the appropriate `Zeroable` and `Pod` impls. 188 189## 1.7.2 190 191* Why does this repo keep being hit with publishing problems? What did I do to 192 deserve this curse, Ferris? This doesn't ever happen with tinyvec or fermium, 193 only bytemuck. 194 195## 1.7.1 196 197* **Soundness Fix:** The wrap/peel methods for owned value conversion, added to 198 `TransparentWrapper` in 1.6, can cause a double-drop if used with types that 199 impl `Drop`. The fix was simply to add a `ManuallyDrop` layer around the value 200 before doing the `transmute_copy` that is used to wrap/peel. While this fix 201 could technically be backported to the 1.6 series, since 1.7 is semver 202 compatible anyway the 1.6 series has simply been yanked. 203 204## 1.7 205 206* In response to [Unsafe Code Guidelines Issue 207 #286](https://github.com/rust-lang/unsafe-code-guidelines/issues/286), this 208 version of Bytemuck has a ***Soundness-Required Breaking Change***. This is 209 "allowed" under Rust's backwards-compatibility guidelines, but it's still 210 annoying of course so we're trying to keep the damage minimal. 211 * **The Reason:** It turns out that pointer values should not have been `Pod`. More 212 specifically, `ptr as usize` is *not* the same operation as calling 213 `transmute::<_, usize>(ptr)`. 214 * LLVM has yet to fully sort out their story, but until they do, transmuting 215 pointers can cause miscompilations. They may fix things up in the future, 216 but we're not gonna just wait and have broken code in the mean time. 217 * **The Fix:** The breaking change is that the `Pod` impls for `*const T`, 218 `*mut T`, and `Option<NonNull<T>` are now gated behind the 219 `unsound_ptr_pod_impl` feature, which is off by default. 220 * You are *strongly discouraged* from using this feature, but if a dependency 221 of yours doesn't work when you upgrade to 1.7 because it relied on pointer 222 casting, then you might wish to temporarily enable the feature just to get 223 that dependency to build. Enabled features are global across all users of a 224 given semver compatible version, so if you enable the feature in your own 225 crate, your dependency will also end up getting the feature too, and then 226 it'll be able to compile. 227 * Please move away from using this feature as soon as you can. Consider it to 228 *already* be deprecated. 229 * [PR 65](https://github.com/Lokathor/bytemuck/pull/65) 230 231## 1.6.3 232 233* Small goof with an errant `;`, so [PR 69](https://github.com/Lokathor/bytemuck/pull/69) 234 *actually* got things working on SPIR-V. 235 236## 1.6.2 237 238cargo upload goof! ignore this one. 239 240## 1.6.1 241 242* [DJMcNab](https://github.com/DJMcNab) did a fix so that the crate can build for SPIR-V 243 [PR 67](https://github.com/Lokathor/bytemuck/pull/67) 244 245## 1.6 246 247* The `TransparentWrapper` trait now has more methods. More ways to wrap, and 248 now you can "peel" too! Note that we don't call it "unwrap" because that name 249 is too strongly associated with the Option/Result methods. 250 Thanks to [LU15W1R7H](https://github.com/LU15W1R7H) for doing 251 [PR 58](https://github.com/Lokathor/bytemuck/pull/58) 252* Min Const Generics! Now there's Pod and Zeroable for arrays of any size when 253 you turn on the `min_const_generics` crate feature. 254 [zakarumych](https://github.com/zakarumych) got the work started in 255 [PR 59](https://github.com/Lokathor/bytemuck/pull/59), 256 and [chorman0773](https://github.com/chorman0773) finished off the task in 257 [PR 63](https://github.com/Lokathor/bytemuck/pull/63) 258 259## 1.5.1 260 261* Fix `bytes_of` failing on zero sized types. 262 [PR 53](https://github.com/Lokathor/bytemuck/pull/53) 263 264## 1.5 265 266* Added `pod_collect_to_vec`, which will gather a slice into a vec, 267allowing you to change the pod type while also safely ignoring alignment. 268[PR 50](https://github.com/Lokathor/bytemuck/pull/50) 269 270## 1.4.2 271 272* [Kimundi](https://github.com/Kimundi) fixed an issue that could make `try_zeroed_box` 273stack overflow for large values at low optimization levels. 274[PR 43](https://github.com/Lokathor/bytemuck/pull/43) 275 276## 1.4.1 277 278* [thomcc](https://github.com/thomcc) fixed up the CI and patched over a soundness hole in `offset_of!`. 279[PR 38](https://github.com/Lokathor/bytemuck/pull/38) 280 281## 1.4 282 283* [icewind1991](https://github.com/icewind1991) has contributed the proc-macros 284 for deriving impls of `Pod`, `TransparentWrapper`, `Zeroable`!! Everyone has 285 been waiting for this one folks! It's a big deal. Just enable the `derive` 286 cargo feature and then you'll be able to derive the traits on your types. It 287 generates all the appropriate tests for you. 288* The `zeroable_maybe_uninit` feature now adds a `Zeroable` impl to the 289 `MaybeUninit` type. This is only behind a feature flag because `MaybeUninit` 290 didn't exist back in `1.34.0` (the minimum rust version of `bytemuck`). 291 292## 1.3.1 293 294* The entire crate is now available under the `Apache-2.0 OR MIT` license as 295 well as the previous `Zlib` license 296 [#24](https://github.com/Lokathor/bytemuck/pull/24). 297* [HeroicKatora](https://github.com/HeroicKatora) added the 298 `try_zeroed_slice_box` function 299 [#10](https://github.com/Lokathor/bytemuck/pull/17). `zeroed_slice_box` is 300 also available. 301* The `offset_of!` macro now supports a 2-arg version. For types that impl 302 Default, it'll just make an instance using `default` and then call over to the 303 3-arg version. 304* The `PodCastError` type now supports `Hash` and `Display`. Also if you enable 305 the `extern_crate_std` feature then it will support `std::error::Error`. 306* We now provide a `TransparentWrapper<T>` impl for `core::num::Wrapper<T>`. 307* The error type of `try_from_bytes` and `try_from_bytes_mut` when the input 308 isn't aligned has been corrected from being `AlignmentMismatch` (intended for 309 allocation casting only) to `TargetAlignmentGreaterAndInputNotAligned`. 310 311## 1.3.0 312 313* Had a bug because the CI was messed up! It wasn't soundness related, because 314 it prevented the crate from building entirely if the `extern_crate_alloc` 315 feature was used. Still, this is yanked, sorry. 316 317## 1.2.0 318 319* [thomcc](https://github.com/thomcc) added many things: 320 * A fully sound `offset_of!` macro 321 [#10](https://github.com/Lokathor/bytemuck/pull/10) 322 * A `Contiguous` trait for when you've got enums with declared values 323 all in a row [#12](https://github.com/Lokathor/bytemuck/pull/12) 324 * A `TransparentWrapper` marker trait for when you want to more clearly 325 enable adding and removing a wrapper struct to its inner value 326 [#15](https://github.com/Lokathor/bytemuck/pull/15) 327 * Now MIRI is run on CI in every single push! 328 [#16](https://github.com/Lokathor/bytemuck/pull/16) 329 330## 1.1.0 331 332* [SimonSapin](https://github.com/SimonSapin) added `from_bytes`, 333 `from_bytes_mut`, `try_from_bytes`, and `try_from_bytes_mut` ([PR 334 Link](https://github.com/Lokathor/bytemuck/pull/8)) 335 336## 1.0.1 337 338* Changed to the [zlib](https://opensource.org/licenses/Zlib) license. 339* Added much more proper documentation. 340* Reduced the minimum Rust version to 1.34 341