Released YYYY-MM-DD.
arbitrary_derive 1.2.1) Fixed bug in Derive macro around no_std path uses #131Released 2023-01-20.
derive(Arbitrary) will now annotate the generated impls with a #[automatically_derived] attribute to indicate to e.g. clippy that lints should not fire for the code within the derived implementation.Released 2023-01-03.
arbitrary and derive_arbitrary versions are synced up so that they don't, e.g., emit generated code that depends on newer versions of arbitrary than the one currently in use. #134std::thread_local! macro invocations in derive code were not fully prefixed, causing confusing build errors in certain situations.Released 2022-10-20.
Released 2022-09-08.
Arbitrary implementation for std::ops::Bound<T>.Released 2022-09-20.
Arbitrary for std::ops::Bound<T>.Unstructured::int_in_range could return out-of-range integers when generating arbitrary signed integers.Released 2022-08-29.
Arbitrary for Rc<str> and Arc<str>arbitrary::ResultUnstructured::arbitrary_loop method will consume fewer bytes of input now.Unstructured::int_in_range could return out-of-range integers.Released 2022-06-23.
derive(Arbitrary)'s generated code. #111derive(Arbitrary) for recursive types that detected an overflow would not reset the overflow detection. #111Released 2022-06-16.
derive(Arbitrary)-generated code. #110Released 2022-06-14.
derive(Arbitrary) with recursive types and empty inputs. #109Released 2022-02-09.
Added the Unstructured::ratio method to generate a boolean that is true at the given rate.
Added the Unstructured::arbitrary_loop method to call a function an arbitrary number of times.
Released 2021-11-20.
Unstructured::fill_bytes. We forgot to update this way back in #53 when the behavior changed.Released 2021-08-25.
Arbitrary impls for HashMaps and HashSets with custom Hashers #87Released 2021-05-20.
Arbitrary impls for NonZeroX types #79Arbitrary impls for all arrays using const generics #55Arbitrary impls for Ipv4Addr and Ipv6Addr #84Released 2020-02-24.
See 1.0.0-rc1 and 1.0.0-rc2 for changes since 0.4.7, which was the last main line release.
Released 2021-02-09.
Arbitrary trait is now implemented for &[u8]. #67Unstructured#get_bytes to Unstructured#bytes. #70Unstructured#choose returns an error. Previously it would panic. 71Released 2020-11-25.
Arbitrary trait is now implemented for &str. #63Arbitrary trait now has a lifetime parameter, allowing Arbitrary implementations that borrow from the raw input (e.g. the new &str implementaton). The derive(Arbitrary) macro also supports deriving Arbitrary on types with lifetimes now. #63The shrink method on the Arbitrary trait has been removed.
We have found that, in practice, using internal reduction via approaches like cargo fuzz tmin, where the raw input bytes are reduced rather than the T: Arbitrary type constructed from those raw bytes, has the best efficiency-to-maintenance ratio. To the best of our knowledge, no one is relying on or using the Arbitrary::shrink method. If you are using and relying on the Arbitrary::shrink method, please reach out by dropping a comment here and explaining how you‘re using it and what your use case is. We’ll figure out what the best solution is, including potentially adding shrinking functionality back to the arbitrary crate.
Released 2020-10-14.
Added an optimization to avoid unnecessarily consuming bytes from the underlying data when there is only one possible choice in Unstructured::{int_in_range, choose, etc..}.
Added license files to the derive crate.
Arbitrary implementation for std::time::Duration should now be faster and produce durations with a more-uniform distribution of nanoseconds.Released 2020-08-22.
Unstructured::peek_bytes method.Test case reduction via cargo fuzz tmin should be much more effective at reducing the sizes of collections now. (See #53 and the commit messages for details.)
Fuzzing with mutation-based fuzzers (like libFuzzer) should be more efficient now. (See #53 and the commit messages for details)
Released 2020-06-18.
Arbitrary for zero length arrays.Arbitrary for Range and RangeInclusive.Released 2020-04-29.
#[derive(arbitrary::Arbitrary)] rather than like #[derive(Arbitrary)]).Released 2020-04-28.
#[derive(arbitrary::Arbitrary)] rather than like #[derive(Arbitrary)]).Released 2020-04-17.
derive_arbitrary crate last release. This release fixes that and so the synstructure dependency is finally actually removed in the cargo releases.Released 2020-03-18.
synstructure crate when the derive feature is enabled. This should not have any visible downstream effects other than faster build times!Released 2020-01-22.
This is technically a breaking change, but we expect that nearly everyone should be able to upgrade without any compilation errors. The only exception is if you were implementing the Arbitrary::size_hint method by hand. If so, see the “changed” section below and the API docs for Arbitrary::shrink for details.
arbitary::size_hint::recursion_guard helper function for guarding against infinite recursion in size_hint implementations for recursive types.Arbitrary::size_hint signature now takes a depth: usize parameter. This should be passed along unmodified to any nested calls of other size_hint methods. If you're implementing size_hint for a recursive type (like a linked list or tree) or a generic type with type parameters, you should use the new arbitrary::size_hint::recursion_guard helper function.size_hint implementations from #[derive(Arbitrary)] for recursive types.Released 2020-01-16.
Released 2020-01-15.
Unstructured::int_in_range that would incorrectly trigger when given valid ranges of length one.Released 2020-01-14.
Released 2020-01-14.
"derive" cargo feature, to enable #[derive(Arbitrary)] for custom types. Enabling this feature re-exports functionality from the derive_arbitrary crate.Arbitrary implements the shrink method for you now.Arbitrary for std types implement shrinking now.Arbitrary::arbitrary_take_rest method allows an Arbitrary implementation to consume all of the rest of the remaining raw input. It has a default implementation that forwards to Arbitrary::arbitrary and the custom derive creates a smart implementation for your custom types.Arbitrary::size_hint method for hinting how many raw bytes an implementation needs to construct itself. This has a default implementation, but the custom derive creates a smart implementation for your custom types.Unstructured::choose method to choose one thing among a set of choices.Unstructured::arbitrary_len method to get an arbitrary length for a collection of some arbitrary type.Unstructured::arbitrary_iter method to create an iterator of arbitrary instance of some type.Arbitrary trait was simplified a bit.Unstructured is a concrete type now, not a trait.RingBuffer and FiniteBuffer are removed. Use Unstructured instead.Arbitrary implementation for char.Arbitrary implementation for String.