| /* Implementation of afl havoc mutation to be used in AFL++ custom mutators and |
| partially in afl-fuzz itself. |
| |
| How to use: |
| |
| #include "afl-mutations.h" // needs afl-fuzz.h |
| |
| u32 afl_mutate(afl_state_t *afl, u8 *buf, u32 len, u32t steps, bool is_text, |
| bool is_exploration, u8 *splice_buf, u32 splice_len, |
| u32 max_len); |
| |
| Returns: |
| u32 - the length of the mutated data return in *buf. 0 = error |
| Parameters: |
| afl_state_t *afl - the *afl state pointer |
| u8 *buf - the input buffer to mutate which will be mutated into. |
| NOTE: must be able to contain a size of at least max_len!! (see below) |
| u32 len - the length of the input |
| u32 steps - how many mutations to perform on the input |
| bool is_text - is the target expecting text inputs |
| bool is_exploration - mutate for exploration mode (instead of exploitation) |
| splice_buf - a buffer from another corpus item to splice with. |
| If NULL then no splicing is done (obviously). |
| splice_len - the length of the splice buffer. If 0 then no splicing. |
| u32 max_len - the maximum size the mutated buffer may grow to |
| */ |
| |
| #ifndef AFL_MUTATIONS_H |
| #define AFL_MUTATIONS_H |
| |
| #include <stdbool.h> |
| #include <inttypes.h> |
| #include "afl-fuzz.h" |
| |
| #define MUT_STRATEGY_ARRAY_SIZE 256 |
| |
| enum { |
| |
| /* 00 */ MUT_FLIPBIT, |
| /* 01 */ MUT_INTERESTING8, |
| /* 02 */ MUT_INTERESTING16, |
| /* 03 */ MUT_INTERESTING16BE, |
| /* 04 */ MUT_INTERESTING32, |
| /* 05 */ MUT_INTERESTING32BE, |
| /* 06 */ MUT_ARITH8_, |
| /* 07 */ MUT_ARITH8, |
| /* 08 */ MUT_ARITH16_, |
| /* 09 */ MUT_ARITH16BE_, |
| /* 10 */ MUT_ARITH16, |
| /* 11 */ MUT_ARITH16BE, |
| /* 12 */ MUT_ARITH32_, |
| /* 13 */ MUT_ARITH32BE_, |
| /* 14 */ MUT_ARITH32, |
| /* 15 */ MUT_ARITH32BE, |
| /* 16 */ MUT_RAND8, |
| /* 17 */ MUT_CLONE_COPY, |
| /* 18 */ MUT_CLONE_FIXED, |
| /* 19 */ MUT_OVERWRITE_COPY, |
| /* 20 */ MUT_OVERWRITE_FIXED, |
| /* 21 */ MUT_BYTEADD, |
| /* 22 */ MUT_BYTESUB, |
| /* 23 */ MUT_FLIP8, |
| /* 24 */ MUT_SWITCH, |
| /* 25 */ MUT_DEL, |
| /* 26 */ MUT_SHUFFLE, |
| /* 27 */ MUT_DELONE, |
| /* 28 */ MUT_INSERTONE, |
| /* 29 */ MUT_ASCIINUM, |
| /* 30 */ MUT_INSERTASCIINUM, |
| /* 31 */ MUT_EXTRA_OVERWRITE, |
| /* 32 */ MUT_EXTRA_INSERT, |
| /* 33 */ MUT_AUTO_EXTRA_OVERWRITE, |
| /* 34 */ MUT_AUTO_EXTRA_INSERT, |
| /* 35 */ MUT_SPLICE_OVERWRITE, |
| /* 36 */ MUT_SPLICE_INSERT, |
| |
| MUT_MAX |
| |
| }; |
| |
| #define MUT_TXT_ARRAY_SIZE 200 |
| u32 text_array[MUT_TXT_ARRAY_SIZE] = {MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT}; |
| |
| #define MUT_BIN_ARRAY_SIZE 256 |
| u32 binary_array[MUT_BIN_ARRAY_SIZE] = {MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT}; |
| |
| #define MUT_NORMAL_ARRAY_SIZE 77 |
| u32 normal_splice_array[MUT_NORMAL_ARRAY_SIZE] = {MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_FIXED, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_FIXED, |
| MUT_BYTEADD, |
| MUT_BYTESUB, |
| MUT_FLIP8, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT}; |
| |
| #define MUT_SPLICE_ARRAY_SIZE 81 |
| u32 full_splice_array[MUT_SPLICE_ARRAY_SIZE] = {MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_FIXED, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_FIXED, |
| MUT_BYTEADD, |
| MUT_BYTESUB, |
| MUT_FLIP8, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT}; |
| |
| u32 mutation_strategy_exploration_text[MUT_STRATEGY_ARRAY_SIZE] = { |
| |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT |
| |
| }; |
| |
| u32 mutation_strategy_exploration_binary[MUT_STRATEGY_ARRAY_SIZE] = { |
| |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT |
| |
| }; |
| |
| u32 mutation_strategy_exploitation_text[MUT_STRATEGY_ARRAY_SIZE] = { |
| |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT |
| |
| }; |
| |
| u32 mutation_strategy_exploitation_binary[MUT_STRATEGY_ARRAY_SIZE] = { |
| |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_FLIPBIT, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING8, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING16BE, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_INTERESTING32BE, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8_, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH8, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16BE_, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH16BE, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32BE_, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_ARITH32BE, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_RAND8, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_COPY, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_CLONE_FIXED, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_COPY, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_OVERWRITE_FIXED, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTEADD, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_BYTESUB, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_FLIP8, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_SWITCH, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_DEL, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_SHUFFLE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_DELONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_INSERTONE, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_ASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_INSERTASCIINUM, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_OVERWRITE, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_OVERWRITE, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_AUTO_EXTRA_INSERT, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_OVERWRITE, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT, |
| MUT_SPLICE_INSERT |
| |
| }; |
| |
| u32 afl_mutate(afl_state_t *, u8 *, u32, u32, bool, bool, u8 *, u32, u32); |
| u32 choose_block_len(afl_state_t *, u32); |
| |
| /* Helper to choose random block len for block operations in fuzz_one(). |
| Doesn't return zero, provided that max_len is > 0. */ |
| |
| inline u32 choose_block_len(afl_state_t *afl, u32 limit) { |
| |
| u32 min_value, max_value; |
| u32 rlim = MIN(afl->queue_cycle, (u32)3); |
| |
| if (unlikely(!afl->run_over10m)) { rlim = 1; } |
| |
| switch (rand_below(afl, rlim)) { |
| |
| case 0: |
| min_value = 1; |
| max_value = HAVOC_BLK_SMALL; |
| break; |
| |
| case 1: |
| min_value = HAVOC_BLK_SMALL; |
| max_value = HAVOC_BLK_MEDIUM; |
| break; |
| |
| default: |
| |
| if (likely(rand_below(afl, 10))) { |
| |
| min_value = HAVOC_BLK_MEDIUM; |
| max_value = HAVOC_BLK_LARGE; |
| |
| } else { |
| |
| min_value = HAVOC_BLK_LARGE; |
| max_value = HAVOC_BLK_XL; |
| |
| } |
| |
| } |
| |
| if (min_value >= limit) { min_value = 1; } |
| |
| return min_value + rand_below(afl, MIN(max_value, limit) - min_value + 1); |
| |
| } |
| |
| inline u32 afl_mutate(afl_state_t *afl, u8 *buf, u32 len, u32 steps, |
| bool is_text, bool is_exploration, u8 *splice_buf, |
| u32 splice_len, u32 max_len) { |
| |
| if (!buf || !len) { return 0; } |
| |
| u32 *mutation_array; |
| static u8 *tmp_buf = NULL; |
| static u32 tmp_buf_size = 0; |
| |
| if (max_len > tmp_buf_size) { |
| |
| if (tmp_buf) { |
| |
| u8 *ptr = realloc(tmp_buf, max_len); |
| |
| if (!ptr) { |
| |
| return 0; |
| |
| } else { |
| |
| tmp_buf = ptr; |
| |
| } |
| |
| } else { |
| |
| if ((tmp_buf = malloc(max_len)) == NULL) { return 0; } |
| |
| } |
| |
| tmp_buf_size = max_len; |
| |
| } |
| |
| if (is_text) { |
| |
| if (is_exploration) { |
| |
| mutation_array = (u32 *)&mutation_strategy_exploration_text; |
| |
| } else { |
| |
| mutation_array = (u32 *)&mutation_strategy_exploitation_text; |
| |
| } |
| |
| } else { |
| |
| if (is_exploration) { |
| |
| mutation_array = (u32 *)&mutation_strategy_exploration_binary; |
| |
| } else { |
| |
| mutation_array = (u32 *)&mutation_strategy_exploitation_binary; |
| |
| } |
| |
| } |
| |
| for (u32 step = 0; step < steps; ++step) { |
| |
| retry_havoc_step: { |
| |
| u32 r = rand_below(afl, MUT_STRATEGY_ARRAY_SIZE), item; |
| |
| switch (mutation_array[r]) { |
| |
| case MUT_FLIPBIT: { |
| |
| /* Flip a single bit somewhere. Spooky! */ |
| u8 bit = rand_below(afl, 8); |
| u32 off = rand_below(afl, len); |
| buf[off] ^= 1 << bit; |
| |
| break; |
| |
| } |
| |
| case MUT_INTERESTING8: { |
| |
| /* Set byte to interesting value. */ |
| |
| item = rand_below(afl, sizeof(interesting_8)); |
| buf[rand_below(afl, len)] = interesting_8[item]; |
| break; |
| |
| } |
| |
| case MUT_INTERESTING16: { |
| |
| /* Set word to interesting value, little endian. */ |
| |
| if (unlikely(len < 2)) { break; } // no retry |
| |
| item = rand_below(afl, sizeof(interesting_16) >> 1); |
| *(u16 *)(buf + rand_below(afl, len - 1)) = interesting_16[item]; |
| |
| break; |
| |
| } |
| |
| case MUT_INTERESTING16BE: { |
| |
| /* Set word to interesting value, big endian. */ |
| |
| if (unlikely(len < 2)) { break; } // no retry |
| |
| item = rand_below(afl, sizeof(interesting_16) >> 1); |
| *(u16 *)(buf + rand_below(afl, len - 1)) = SWAP16(interesting_16[item]); |
| |
| break; |
| |
| } |
| |
| case MUT_INTERESTING32: { |
| |
| /* Set dword to interesting value, little endian. */ |
| |
| if (unlikely(len < 4)) { break; } // no retry |
| |
| item = rand_below(afl, sizeof(interesting_32) >> 2); |
| *(u32 *)(buf + rand_below(afl, len - 3)) = interesting_32[item]; |
| |
| break; |
| |
| } |
| |
| case MUT_INTERESTING32BE: { |
| |
| /* Set dword to interesting value, big endian. */ |
| |
| if (unlikely(len < 4)) { break; } // no retry |
| |
| item = rand_below(afl, sizeof(interesting_32) >> 2); |
| *(u32 *)(buf + rand_below(afl, len - 3)) = SWAP32(interesting_32[item]); |
| |
| break; |
| |
| } |
| |
| case MUT_ARITH8_: { |
| |
| /* Randomly subtract from byte. */ |
| |
| item = 1 + rand_below(afl, ARITH_MAX); |
| buf[rand_below(afl, len)] -= item; |
| break; |
| |
| } |
| |
| case MUT_ARITH8: { |
| |
| /* Randomly add to byte. */ |
| |
| item = 1 + rand_below(afl, ARITH_MAX); |
| buf[rand_below(afl, len)] += item; |
| break; |
| |
| } |
| |
| case MUT_ARITH16_: { |
| |
| /* Randomly subtract from word, little endian. */ |
| |
| if (unlikely(len < 2)) { break; } // no retry |
| |
| u32 pos = rand_below(afl, len - 1); |
| item = 1 + rand_below(afl, ARITH_MAX); |
| *(u16 *)(buf + pos) -= item; |
| |
| break; |
| |
| } |
| |
| case MUT_ARITH16BE_: { |
| |
| /* Randomly subtract from word, big endian. */ |
| |
| if (unlikely(len < 2)) { break; } // no retry |
| |
| u32 pos = rand_below(afl, len - 1); |
| u16 num = 1 + rand_below(afl, ARITH_MAX); |
| *(u16 *)(buf + pos) = SWAP16(SWAP16(*(u16 *)(buf + pos)) - num); |
| |
| break; |
| |
| } |
| |
| case MUT_ARITH16: { |
| |
| /* Randomly add to word, little endian. */ |
| |
| if (unlikely(len < 2)) { break; } // no retry |
| |
| u32 pos = rand_below(afl, len - 1); |
| item = 1 + rand_below(afl, ARITH_MAX); |
| *(u16 *)(buf + pos) += item; |
| |
| break; |
| |
| } |
| |
| case MUT_ARITH16BE: { |
| |
| /* Randomly add to word, big endian. */ |
| |
| if (unlikely(len < 2)) { break; } // no retry |
| |
| u32 pos = rand_below(afl, len - 1); |
| u16 num = 1 + rand_below(afl, ARITH_MAX); |
| *(u16 *)(buf + pos) = SWAP16(SWAP16(*(u16 *)(buf + pos)) + num); |
| |
| break; |
| |
| } |
| |
| case MUT_ARITH32_: { |
| |
| /* Randomly subtract from dword, little endian. */ |
| |
| if (unlikely(len < 4)) { break; } // no retry |
| |
| u32 pos = rand_below(afl, len - 3); |
| item = 1 + rand_below(afl, ARITH_MAX); |
| *(u32 *)(buf + pos) -= item; |
| |
| break; |
| |
| } |
| |
| case MUT_ARITH32BE_: { |
| |
| /* Randomly subtract from dword, big endian. */ |
| |
| if (unlikely(len < 4)) { break; } // no retry |
| |
| u32 pos = rand_below(afl, len - 3); |
| u32 num = 1 + rand_below(afl, ARITH_MAX); |
| *(u32 *)(buf + pos) = SWAP32(SWAP32(*(u32 *)(buf + pos)) - num); |
| |
| break; |
| |
| } |
| |
| case MUT_ARITH32: { |
| |
| /* Randomly add to dword, little endian. */ |
| |
| if (unlikely(len < 4)) { break; } // no retry |
| |
| u32 pos = rand_below(afl, len - 3); |
| item = 1 + rand_below(afl, ARITH_MAX); |
| *(u32 *)(buf + pos) += item; |
| |
| break; |
| |
| } |
| |
| case MUT_ARITH32BE: { |
| |
| /* Randomly add to dword, big endian. */ |
| |
| if (unlikely(len < 4)) { break; } // no retry |
| |
| u32 pos = rand_below(afl, len - 3); |
| u32 num = 1 + rand_below(afl, ARITH_MAX); |
| *(u32 *)(buf + pos) = SWAP32(SWAP32(*(u32 *)(buf + pos)) + num); |
| |
| break; |
| |
| } |
| |
| case MUT_RAND8: { |
| |
| /* Just set a random byte to a random value. Because, |
| why not. We use XOR with 1-255 to eliminate the |
| possibility of a no-op. */ |
| |
| u32 pos = rand_below(afl, len); |
| item = 1 + rand_below(afl, 255); |
| buf[pos] ^= item; |
| break; |
| |
| } |
| |
| case MUT_CLONE_COPY: { |
| |
| if (likely(len + HAVOC_BLK_XL < max_len)) { |
| |
| /* Clone bytes. */ |
| |
| u32 clone_len = choose_block_len(afl, len); |
| u32 clone_from = rand_below(afl, len - clone_len + 1); |
| u32 clone_to = rand_below(afl, len); |
| |
| /* Head */ |
| |
| memcpy(tmp_buf, buf, clone_to); |
| |
| /* Inserted part */ |
| |
| memcpy(tmp_buf + clone_to, buf + clone_from, clone_len); |
| |
| /* Tail */ |
| memcpy(tmp_buf + clone_to + clone_len, buf + clone_to, |
| len - clone_to); |
| |
| len += clone_len; |
| memcpy(buf, tmp_buf, len); |
| |
| } else if (unlikely(len < 8)) { |
| |
| break; |
| |
| } else { |
| |
| goto retry_havoc_step; |
| |
| } |
| |
| break; |
| |
| } |
| |
| case MUT_CLONE_FIXED: { |
| |
| if (likely(len + HAVOC_BLK_XL < max_len)) { |
| |
| /* Insert a block of constant bytes (25%). */ |
| |
| u32 clone_len = choose_block_len(afl, HAVOC_BLK_XL); |
| u32 clone_to = rand_below(afl, len); |
| u32 strat = rand_below(afl, 2); |
| u32 clone_from = clone_to ? clone_to - 1 : 0; |
| item = strat ? rand_below(afl, 256) : buf[clone_from]; |
| |
| /* Head */ |
| |
| memcpy(tmp_buf, buf, clone_to); |
| |
| /* Inserted part */ |
| |
| memset(tmp_buf + clone_to, item, clone_len); |
| |
| /* Tail */ |
| memcpy(tmp_buf + clone_to + clone_len, buf + clone_to, |
| len - clone_to); |
| |
| len += clone_len; |
| memcpy(buf, tmp_buf, len); |
| |
| } else if (unlikely(len < 8)) { |
| |
| break; |
| |
| } else { |
| |
| goto retry_havoc_step; |
| |
| } |
| |
| break; |
| |
| } |
| |
| case MUT_OVERWRITE_COPY: { |
| |
| /* Overwrite bytes with a randomly selected chunk bytes. */ |
| |
| if (unlikely(len < 2)) { break; } // no retry |
| |
| u32 copy_len = choose_block_len(afl, len - 1); |
| u32 copy_from = rand_below(afl, len - copy_len + 1); |
| u32 copy_to = rand_below(afl, len - copy_len + 1); |
| |
| if (likely(copy_from != copy_to)) { |
| |
| memmove(buf + copy_to, buf + copy_from, copy_len); |
| |
| } |
| |
| break; |
| |
| } |
| |
| case MUT_OVERWRITE_FIXED: { |
| |
| /* Overwrite bytes with fixed bytes. */ |
| |
| if (unlikely(len < 2)) { break; } // no retry |
| |
| u32 copy_len = choose_block_len(afl, len - 1); |
| u32 copy_to = rand_below(afl, len - copy_len + 1); |
| u32 strat = rand_below(afl, 2); |
| u32 copy_from = copy_to ? copy_to - 1 : 0; |
| item = strat ? rand_below(afl, 256) : buf[copy_from]; |
| memset(buf + copy_to, item, copy_len); |
| |
| break; |
| |
| } |
| |
| case MUT_BYTEADD: { |
| |
| /* Increase byte by 1. */ |
| |
| buf[rand_below(afl, len)]++; |
| break; |
| |
| } |
| |
| case MUT_BYTESUB: { |
| |
| /* Decrease byte by 1. */ |
| |
| buf[rand_below(afl, len)]--; |
| break; |
| |
| } |
| |
| case MUT_FLIP8: { |
| |
| /* Flip byte. */ |
| |
| buf[rand_below(afl, len)] ^= 0xff; |
| break; |
| |
| } |
| |
| case MUT_SWITCH: { |
| |
| if (unlikely(len < 4)) { break; } // no retry |
| |
| /* Switch bytes. */ |
| |
| u32 to_end, switch_to, switch_len, switch_from; |
| switch_from = rand_below(afl, len); |
| do { |
| |
| switch_to = rand_below(afl, len); |
| |
| } while (unlikely(switch_from == switch_to)); |
| |
| if (switch_from < switch_to) { |
| |
| switch_len = switch_to - switch_from; |
| to_end = len - switch_to; |
| |
| } else { |
| |
| switch_len = switch_from - switch_to; |
| to_end = len - switch_from; |
| |
| } |
| |
| switch_len = choose_block_len(afl, MIN(switch_len, to_end)); |
| |
| /* Backup */ |
| |
| memcpy(tmp_buf, buf + switch_from, switch_len); |
| |
| /* Switch 1 */ |
| |
| memcpy(buf + switch_from, buf + switch_to, switch_len); |
| |
| /* Switch 2 */ |
| |
| memcpy(buf + switch_to, tmp_buf, switch_len); |
| |
| break; |
| |
| } |
| |
| case MUT_DEL: { |
| |
| /* Delete bytes. */ |
| |
| if (unlikely(len < 2)) { break; } // no retry |
| |
| /* Don't delete too much. */ |
| |
| u32 del_len = choose_block_len(afl, len - 1); |
| u32 del_from = rand_below(afl, len - del_len + 1); |
| memmove(buf + del_from, buf + del_from + del_len, |
| len - del_from - del_len); |
| len -= del_len; |
| |
| break; |
| |
| } |
| |
| case MUT_SHUFFLE: { |
| |
| /* Shuffle bytes. */ |
| |
| if (unlikely(len < 4)) { break; } // no retry |
| |
| u32 blen = choose_block_len(afl, len - 1); |
| u32 off = rand_below(afl, len - blen + 1); |
| |
| for (u32 i = blen - 1; i > 0; i--) { |
| |
| u32 j; |
| do { |
| |
| j = rand_below(afl, i + 1); |
| |
| } while (unlikely(i == j)); |
| |
| u8 temp = buf[off + i]; |
| buf[off + i] = buf[off + j]; |
| buf[off + j] = temp; |
| |
| } |
| |
| break; |
| |
| } |
| |
| case MUT_DELONE: { |
| |
| /* Delete bytes. */ |
| |
| if (unlikely(len < 2)) { break; } // no retry |
| |
| /* Don't delete too much. */ |
| |
| u32 del_len = 1; |
| u32 del_from = rand_below(afl, len - del_len + 1); |
| memmove(buf + del_from, buf + del_from + del_len, |
| len - del_from - del_len); |
| |
| len -= del_len; |
| |
| break; |
| |
| } |
| |
| case MUT_INSERTONE: { |
| |
| if (unlikely(len < 2)) { break; } // no retry |
| |
| u32 clone_len = 1; |
| u32 clone_to = rand_below(afl, len); |
| u32 strat = rand_below(afl, 2); |
| u32 clone_from = clone_to ? clone_to - 1 : 0; |
| item = strat ? rand_below(afl, 256) : buf[clone_from]; |
| |
| /* Head */ |
| |
| memcpy(tmp_buf, buf, clone_to); |
| |
| /* Inserted part */ |
| |
| memset(tmp_buf + clone_to, item, clone_len); |
| |
| /* Tail */ |
| memcpy(tmp_buf + clone_to + clone_len, buf + clone_to, len - clone_to); |
| |
| len += clone_len; |
| memcpy(buf, tmp_buf, len); |
| |
| break; |
| |
| } |
| |
| case MUT_ASCIINUM: { |
| |
| if (unlikely(len < 4)) { break; } // no retry |
| |
| u32 off = rand_below(afl, len), off2 = off, cnt = 0; |
| |
| while (off2 + cnt < len && !isdigit(buf[off2 + cnt])) { |
| |
| ++cnt; |
| |
| } |
| |
| // none found, wrap |
| if (off2 + cnt == len) { |
| |
| off2 = 0; |
| cnt = 0; |
| |
| while (cnt < off && !isdigit(buf[off2 + cnt])) { |
| |
| ++cnt; |
| |
| } |
| |
| if (cnt == off) { |
| |
| if (len < 8) { |
| |
| break; |
| |
| } else { |
| |
| goto retry_havoc_step; |
| |
| } |
| |
| } |
| |
| } |
| |
| off = off2 + cnt; |
| off2 = off + 1; |
| |
| while (off2 < len && isdigit(buf[off2])) { |
| |
| ++off2; |
| |
| } |
| |
| s64 val = buf[off] - '0'; |
| for (u32 i = off + 1; i < off2; ++i) { |
| |
| val = (val * 10) + buf[i] - '0'; |
| |
| } |
| |
| if (off && buf[off - 1] == '-') { val = -val; } |
| |
| u32 strat = rand_below(afl, 8); |
| switch (strat) { |
| |
| case 0: |
| val++; |
| break; |
| case 1: |
| val--; |
| break; |
| case 2: |
| val *= 2; |
| break; |
| case 3: |
| val /= 2; |
| break; |
| case 4: |
| if (likely(val && (u64)val < 0x19999999)) { |
| |
| val = (u64)rand_next(afl) % (u64)((u64)val * 10); |
| |
| } else { |
| |
| val = rand_below(afl, 256); |
| |
| } |
| |
| break; |
| case 5: |
| val += rand_below(afl, 256); |
| break; |
| case 6: |
| val -= rand_below(afl, 256); |
| break; |
| case 7: |
| val = ~(val); |
| break; |
| |
| } |
| |
| char numbuf[32]; |
| snprintf(numbuf, sizeof(buf), "%" PRId64, val); |
| u32 old_len = off2 - off; |
| u32 new_len = strlen(numbuf); |
| |
| if (old_len == new_len) { |
| |
| memcpy(buf + off, numbuf, new_len); |
| |
| } else { |
| |
| /* Head */ |
| |
| memcpy(tmp_buf, buf, off); |
| |
| /* Inserted part */ |
| |
| memcpy(tmp_buf + off, numbuf, new_len); |
| |
| /* Tail */ |
| memcpy(tmp_buf + off + new_len, buf + off2, len - off2); |
| |
| len += (new_len - old_len); |
| memcpy(buf, tmp_buf, len); |
| |
| } |
| |
| // fprintf(stderr, "AFTER : %s\n", buf); |
| break; |
| |
| } |
| |
| case MUT_INSERTASCIINUM: { |
| |
| u32 ins_len = 1 + rand_below(afl, 8); |
| u32 pos = rand_below(afl, len); |
| |
| /* Insert ascii number. */ |
| if (unlikely(len < pos + ins_len)) { |
| |
| // no retry if we have a small input |
| if (unlikely(len < 8)) { |
| |
| break; |
| |
| } else { |
| |
| goto retry_havoc_step; |
| |
| } |
| |
| } |
| |
| u64 val = rand_next(afl); |
| char numbuf[32]; |
| snprintf(numbuf, sizeof(numbuf), "%llu", val); |
| size_t val_len = strlen(numbuf), off; |
| |
| if (ins_len > val_len) { |
| |
| ins_len = val_len; |
| off = 0; |
| |
| } else { |
| |
| off = val_len - ins_len; |
| |
| } |
| |
| memcpy(buf + pos, numbuf + off, ins_len); |
| |
| break; |
| |
| } |
| |
| case MUT_EXTRA_OVERWRITE: { |
| |
| if (unlikely(!afl->extras_cnt)) { goto retry_havoc_step; } |
| |
| /* Use the dictionary. */ |
| |
| u32 use_extra = rand_below(afl, afl->extras_cnt); |
| u32 extra_len = afl->extras[use_extra].len; |
| |
| if (unlikely(extra_len > len)) { goto retry_havoc_step; } |
| |
| u32 insert_at = rand_below(afl, len - extra_len + 1); |
| memcpy(buf + insert_at, afl->extras[use_extra].data, extra_len); |
| |
| break; |
| |
| } |
| |
| case MUT_EXTRA_INSERT: { |
| |
| if (unlikely(!afl->extras_cnt)) { goto retry_havoc_step; } |
| |
| u32 use_extra = rand_below(afl, afl->extras_cnt); |
| u32 extra_len = afl->extras[use_extra].len; |
| if (unlikely(len + extra_len >= max_len)) { goto retry_havoc_step; } |
| |
| u8 *ptr = afl->extras[use_extra].data; |
| u32 insert_at = rand_below(afl, len + 1); |
| |
| /* Tail */ |
| memmove(buf + insert_at + extra_len, buf + insert_at, len - insert_at); |
| |
| /* Inserted part */ |
| memcpy(buf + insert_at, ptr, extra_len); |
| len += extra_len; |
| |
| break; |
| |
| } |
| |
| case MUT_AUTO_EXTRA_OVERWRITE: { |
| |
| if (unlikely(!afl->a_extras_cnt)) { goto retry_havoc_step; } |
| |
| /* Use the dictionary. */ |
| |
| u32 use_extra = rand_below(afl, afl->a_extras_cnt); |
| u32 extra_len = afl->a_extras[use_extra].len; |
| |
| if (unlikely(extra_len > len)) { goto retry_havoc_step; } |
| |
| u32 insert_at = rand_below(afl, len - extra_len + 1); |
| memcpy(buf + insert_at, afl->a_extras[use_extra].data, extra_len); |
| |
| break; |
| |
| } |
| |
| case MUT_AUTO_EXTRA_INSERT: { |
| |
| if (unlikely(!afl->a_extras_cnt)) { goto retry_havoc_step; } |
| |
| u32 use_extra = rand_below(afl, afl->a_extras_cnt); |
| u32 extra_len = afl->a_extras[use_extra].len; |
| if (unlikely(len + extra_len >= max_len)) { goto retry_havoc_step; } |
| |
| u8 *ptr = afl->a_extras[use_extra].data; |
| u32 insert_at = rand_below(afl, len + 1); |
| |
| /* Tail */ |
| memmove(buf + insert_at + extra_len, buf + insert_at, len - insert_at); |
| |
| /* Inserted part */ |
| memcpy(buf + insert_at, ptr, extra_len); |
| len += extra_len; |
| |
| break; |
| |
| } |
| |
| case MUT_SPLICE_OVERWRITE: { |
| |
| if (unlikely(!splice_buf || !splice_len)) { goto retry_havoc_step; } |
| |
| /* overwrite mode */ |
| |
| u32 copy_from, copy_to, copy_len; |
| |
| copy_len = choose_block_len(afl, splice_len - 1); |
| |
| if (copy_len > len) copy_len = len; |
| |
| copy_from = rand_below(afl, splice_len - copy_len + 1); |
| copy_to = rand_below(afl, len - copy_len + 1); |
| memmove(buf + copy_to, splice_buf + copy_from, copy_len); |
| |
| break; |
| |
| } |
| |
| case MUT_SPLICE_INSERT: { |
| |
| if (unlikely(!splice_buf || !splice_len)) { goto retry_havoc_step; } |
| |
| if (unlikely(len + HAVOC_BLK_XL >= max_len)) { goto retry_havoc_step; } |
| |
| /* insert mode */ |
| |
| u32 clone_from, clone_to, clone_len; |
| |
| clone_len = choose_block_len(afl, splice_len); |
| clone_from = rand_below(afl, splice_len - clone_len + 1); |
| clone_to = rand_below(afl, len + 1); |
| |
| /* Head */ |
| |
| memcpy(tmp_buf, buf, clone_to); |
| |
| /* Inserted part */ |
| |
| memcpy(tmp_buf + clone_to, splice_buf + clone_from, clone_len); |
| |
| /* Tail */ |
| memcpy(tmp_buf + clone_to + clone_len, buf + clone_to, len - clone_to); |
| |
| len += clone_len; |
| memcpy(buf, tmp_buf, len); |
| |
| break; |
| |
| } |
| |
| } |
| |
| } |
| |
| } |
| |
| return len; |
| |
| } |
| |
| #endif /* !AFL_MUTATIONS_H */ |
| |