Marvolo currently supports 10 different semantics-preserving code transformations that cover the set of mutations we observed in our analysis of the popular Ember dataset (§), as well as commonly used code obfuscations [1]}, [2]}, [3]} and transformation techniques employed by off-the-shelf optimizing compilers [4]}, [5]}. Supported transformations include junk code insertion and instruction swapping (both described in §), as well as instruction substitution which replaces an instruction with a (more complex) sequence of instructions that is semantically equivalent. To ensure that a modified code block is semantically equivalent to the original block, static analysis is performed after the code transformation is applied. This analysis tracks program reads and writes and determines whether the reads from the registers and memory locations in that basic block would still return the same values after the modification. If a violation occurs from the code transformation, it is reverted and a new transformation is attempted. Appendix  provides a comprehensive overview of the transformations that Marvolo supports, as well as the logistics to carrying out each one.
