Released YYYY-MM-DD.
Released 2023-10-30.
Arbitrary
implementations for Arc<[T]>
and Rc<[T]>
. #160Released 2023-10-11.
arbitrary_take_rest
where <Vec<Vec<u8>>>::arbitrary_take_rest
would never generate vec![vec![]]
for example. See #159 for details.Released 2023-03-13.
Arbitrary
. See #138 for details.syn
.Released 2023-01-20.
derive(Arbitrary)
will now annotate the generated impl
s 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-20.
Arbitrary
implementation for std::ops::Bound<T>
.Released 2022-09-08.
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::Result
Unstructured::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 HashMap
s and HashSet
s with custom Hasher
s #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
.