byte_mutator/mutators/
bitflipper.rs

1//! Performs a walking bit flip of `width` bits. A width of 1 will flip a single bit.
2
3#[derive(Debug, Copy, Clone)]
4pub struct BitFlipper {}
5
6impl BitFlipper {
7    pub fn mutate(bytes: &mut [u8], i: usize, _width: u8) {
8        let i = i % (bytes.len() * 8);
9        let byte = i / 8;
10        let bit = i % 8;
11        let v: u8 = bytes[byte] ^ 1 << bit as u8;
12
13        // todo: Implement width
14        bytes[byte] = v;
15    }
16}
17
18#[cfg(test)]
19mod tests {
20    use super::*;
21    use crate::undo_buffer::UndoBuffer;
22
23    #[test]
24    fn flip_bit() {
25        let mut buffer = UndoBuffer::new(b"foo");
26
27        // first bit should flip resulting in 'goo'
28        // 0b1100110 -> 0b1100111, 103 -> 102, f -> g
29        BitFlipper::mutate(buffer.get_mut(), 0, 1);
30        assert_eq!(buffer.read(), b"goo");
31    }
32}