diff --git a/fuzzer/Fuzzer.java b/fuzzer/Fuzzer.java index 81ac1884d94a0fd1b8e46b6a954ed4ab14f585e3..cf6fa773a0ebccdfc5bc1e3f44c83898afb4a82d 100644 --- a/fuzzer/Fuzzer.java +++ b/fuzzer/Fuzzer.java @@ -52,7 +52,7 @@ public class Fuzzer { // Current stack of instructions private static ArrayList<Instruction> instructionStack = new ArrayList<Instruction>(); // Max stack of instructions before resetting stack - private static final int MAX_STACK = 2; + private static final int MAX_STACK = 5; public static void main(String[] args) throws IOException { System.out.println(Instruction.getBNF()); @@ -122,22 +122,25 @@ public class Fuzzer { switch (runCount){ case 0: // Test with stack full - return generateInput(true, INSTRUCTION_MAX, MAX_STACK_SIZE, false, false); + return generateInput(true, INSTRUCTION_MAX, MAX_STACK_SIZE, false, false, false); case 1: // Test with stack full - return generateInput(true, INSTRUCTION_MAX, MAX_STACK_SIZE - 1, false, false); + return generateInput(true, INSTRUCTION_MAX, MAX_STACK_SIZE - 1, false, false, false); case 3: // Run static tests and empty stack - return getStaticTests() + generateInput(true, INSTRUCTION_MAX, 0, false, false); + return getStaticTests() + generateInput(true, INSTRUCTION_MAX, 0, false, false, false); case 4: // Test with dynamic probability - return generateInput(true, INSTRUCTION_MAX, 0, true, false); + return generateInput(true, INSTRUCTION_MAX, 0, true, false, false); case 5: // Test with long var names - return generateInput(true, INSTRUCTION_MAX, 0, false, true); + return generateInput(true, INSTRUCTION_MAX, 0, false, true, false); + case 6: + // Test with missing vars + return generateInput(true, INSTRUCTION_MAX, 0, false, true, true); } // Run from random stack - return generateInput(true, INSTRUCTION_MAX, 0, false, false); + return generateInput(true, INSTRUCTION_MAX, 0, false, false, false); } /* @@ -173,7 +176,7 @@ public class Fuzzer { boolean stackFull = rand.nextInt(100) < STACK_FULL_PERCENTAGE; result.append(generateInput(false, - INSTRUCTION_MAX, MAX_STACK_SIZE, false, false)); + INSTRUCTION_MAX, MAX_STACK_SIZE, false, false, false)); // Increment generated generated += 1; } @@ -219,14 +222,14 @@ public class Fuzzer { * @param numInstructions for the line * @return the concatenated input for the program as a string */ - private static String generateInput(boolean correct, long numInstructions, int stackPreload, boolean dynamicProb, boolean longVarNames){ + private static String generateInput(boolean correct, long numInstructions, int stackPreload, boolean dynamicProb, boolean longVarNames, boolean badInstruct){ int stackSize = 0; int counter = 0; StringBuilder result = new StringBuilder(); for ( int i = 0 ; i < stackPreload ; i++ ) { - result.append(completeInstruction(true, Instruction.PUSH, false)); + result.append(completeInstruction(true, Instruction.PUSH, false, false)); stackSize++; } @@ -234,7 +237,7 @@ public class Fuzzer { while (counter < numInstructions) { Instruction newInstr = Instruction.getRandomInstruction(stackSize, instructionStack, pathwayProb); stackSize = stackSize + newInstr.getStackChange(); - result.append(completeInstruction(true, newInstr, false)); + result.append(completeInstruction(true, newInstr, false, false)); if (dynamicProb) { incrementStackAndCount(newInstr); } @@ -245,13 +248,13 @@ public class Fuzzer { Instruction newInstr; if (rand.nextInt(100) < LINE_ERROR_PERCENTAGE){ newInstr = Instruction.getRandomInstruction(2, instructionStack, pathwayProb); - result.append(completeInstruction(false, newInstr, longVarNames)); + result.append(completeInstruction(false, newInstr, longVarNames, badInstruct)); if (dynamicProb) { incrementStackAndCount(newInstr); } } else { newInstr = Instruction.getRandomInstruction(stackSize, instructionStack, pathwayProb); - result.append(completeInstruction(true, newInstr, false)); + result.append(completeInstruction(true, newInstr, false, false)); if (dynamicProb) { incrementStackAndCount(newInstr); } @@ -274,7 +277,7 @@ public class Fuzzer { * @param instruction type * @return string with parameter */ - private static String completeInstruction(boolean correct, Instruction instruction, boolean longVarNames){ + private static String completeInstruction(boolean correct, Instruction instruction, boolean longVarNames, boolean badInstruct){ String name = ""; switch (instruction) { @@ -284,15 +287,18 @@ public class Fuzzer { name = " " + ((Integer) randomRange(VAR_MIN, VAR_MAX)).toString(); } else { // If incorrect, increase the range to outside +- int31_t - - name = " " + ((Long) (randomRange(-1,1)*((long) VAR_MAX + (long) randomRange(0, VAR_MAX)))).toString(); + if (!badInstruct) { + name = " " + ((Long) (randomRange(-1, 1) * ((long) VAR_MAX + (long) randomRange(0, VAR_MAX)))).toString(); + } } break; case LOAD: case REM: // If not correct, make up a name not in the list if (!correct){ - name = generateName(longVarNames); + if (!badInstruct) { + name = generateName(longVarNames); + } } // If no variables, return empty string else if (vars.size() == 0){ @@ -314,7 +320,9 @@ public class Fuzzer { } // Otherwise get name from exiting, or no name else { + if (!badInstruct) { name = vars.get(randomRange(0, vars.size() - 1)); + } } @@ -324,7 +332,9 @@ public class Fuzzer { if (correct){ name = " " + generateName(false) + ".txt"; } else { + if (!badInstruct) { name = " " + generateName(longVarNames) + ".txt"; + } } break; case PLUS: