trident_fuzz/
instructions_sequence.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#[macro_export]
macro_rules! pre_sequence {
    // Accept a list of FuzzInstruction variants using parentheses `()`
    ($($ix_variant:ident),* $(,)?) => {
        fn pre_ixs(_u: &mut arbitrary::Unstructured) -> arbitrary::Result<Vec<FuzzInstruction>> {
            let mut instructions = Vec::new();
            $(
                let ix = FuzzInstruction::$ix_variant($ix_variant::arbitrary(_u)?);
                instructions.push(ix);
            )*
            Ok(instructions)
        }
    };
}

#[macro_export]
macro_rules! middle_sequence {
    // Accept a list of FuzzInstruction variants (which may include duplicates)
    ($($ix_variant:ident),* $(,)?) => {
        fn ixs(_u: &mut arbitrary::Unstructured) -> arbitrary::Result<Vec<FuzzInstruction>> {
            #[allow(unused_mut)]
            let mut instructions = Vec::new();
            $(
                let ix = FuzzInstruction::$ix_variant($ix_variant::arbitrary(_u)?);
                instructions.push(ix);
            )*
            Ok(instructions)
        }
    };
}

#[macro_export]
macro_rules! post_sequence {
    // Accept a list of FuzzInstruction variants (which may include duplicates)
    ($($ix_variant:ident),* $(,)?) => {
        fn post_ixs(_u: &mut arbitrary::Unstructured) -> arbitrary::Result<Vec<FuzzInstruction>> {
            #[allow(unused_mut)]
            let mut instructions = Vec::new();
            $(
                let ix = FuzzInstruction::$ix_variant($ix_variant::arbitrary(_u)?);
                instructions.push(ix);
            )*
            Ok(instructions)
        }
    };
}