public FunctionPrototype(String name, Type returnType, Type... args) { this.name = name; this.returnType = returnType; this.parameters = new ArrayList<>(); for (int i = 0; i < args.length; i++) { this.parameters.add(new ParameterDecl("p" + i, args[i], null)); } }
@Override public ParameterDecl clone() { return new ParameterDecl(name, type.clone(), arrayInfo == null ? null : arrayInfo.clone()); }
@Override public ParameterDecl visitParameter_declaration(Parameter_declarationContext ctx) { List<TypeQualifier> qualifiers = getQualifiers(ctx.parameter_qualifier()); if (ctx.parameter_type_specifier() != null) { final Type type = getType(ctx.parameter_type_specifier().type_specifier(), qualifiers); return new ParameterDecl(null, type, null); } else { final Type type = getType(ctx.parameter_declarator().type_specifier(), qualifiers); return new ParameterDecl(ctx.parameter_declarator().IDENTIFIER().getText(), type, ctx.parameter_declarator().array_specifier() == null ? null : getArrayInfo(ctx.parameter_declarator().array_specifier())); } }
private FunctionDefinition fuzzFunction() { fuzzingContext.enterScope(); List<ParameterDecl> params = new ArrayList<>(); for (int i = 0; i < generator.nextInt(MAX_FUNCTION_PARAMS); i++) { final String name = "p" + i; final Type type = fuzzType(); // TODO: consider adding array parameters final ParameterDecl parameterDecl = new ParameterDecl(name, type, null); fuzzingContext.addParameter(parameterDecl); params.add(parameterDecl); } FunctionPrototype prototype = new FunctionPrototype(createName("f"), fuzzType(), params); fuzzingContext.enterFunction(prototype); final BlockStmt body = fuzzBlockStmt(false); if (!containsReturnStmt(body)) { body.addStmt(fuzzReturnStmt()); } FunctionDefinition functionDefinition = new FunctionDefinition( prototype, body); fuzzingContext.leaveFunction(); fuzzingContext.leaveScope(); return functionDefinition; }
final Type varType = type.clone().getWithoutQualifiers(); assert !(varType.getWithoutQualifiers() instanceof ArrayType); params.add(new ParameterDecl(v, varType, null));