@Override public ExprCaseLabel clone() { return new ExprCaseLabel(expr.clone()); }
@Override public void visitExprCaseLabel(ExprCaseLabel exprCaseLabel) { visitChildFromParent(exprCaseLabel.getExpr(), exprCaseLabel); }
private boolean isZeroSwitchCase(Stmt stmt) { return stmt instanceof ExprCaseLabel && ((IntConstantExpr) ((ExprCaseLabel) stmt).getExpr()).getValue().equals("0"); }
private List<Stmt> generateUnreachableSwitchContent(int numCases, List<Integer> usedLabels, Fuzzer stmtFuzzer, IRandom generator) { List<Stmt> stmts = new ArrayList<>(); for (int i = 0; i < numCases; i++) { Integer caseLabel = getCaseLabel(usedLabels, generator); final Stmt fuzzedStmt = stmtFuzzer.fuzzStmt(); stmts.add(new ExprCaseLabel( new IntConstantExpr(caseLabel.toString()))); stmts.add(fuzzedStmt); } return stmts; }
private boolean isZeroLabel(ExprCaseLabel label) { return isZero(label.getExpr()); }
private List<Stmt> generateReachableSwitchCases(BlockStmt block, int numCases, List<Integer> usedLabels, IRandom generator) { // Index i of this list stores the case labels to appear before statement i List<List<Integer>> stmtIndexToCaseLabels = new ArrayList<>(); // Initially make the label sets empty for (int i = 0; i < block.getNumStmts(); i++) { stmtIndexToCaseLabels.add(new ArrayList<>()); } // Label 0, which is what we should actually jump to, is the first label. stmtIndexToCaseLabels.get(0).add(0); for (int i = 0; i < numCases; i++) { stmtIndexToCaseLabels.get(generator.nextInt(block.getNumStmts())) .add(getCaseLabel(usedLabels, generator)); } List<Stmt> result = new ArrayList<>(); for (int i = 0; i < block.getNumStmts(); i++) { result.addAll(stmtIndexToCaseLabels.get(i) .stream().map(item -> new ExprCaseLabel(new IntConstantExpr(item.toString()))) .collect(Collectors.toList())); result.add(block.getStmt(i)); } result.add(BreakStmt.INSTANCE); return result; }
public void notifySwitchCase(ExprCaseLabel caseLabel) { assert !switchStmts.isEmpty(); Optional<SwitchCaseStatus> status = switchStmts.peekLast(); if (!status.isPresent()) { return; } if (status.get() == SwitchCaseStatus.NO_LABEL_YET) { status = resetSwitchCaseStatus(SwitchCaseStatus.BEFORE_ORIGINAL_CODE); } if (((IntConstantExpr) caseLabel.getExpr()).getValue().equals("0")) { assert status.get() == SwitchCaseStatus.BEFORE_ORIGINAL_CODE; resetSwitchCaseStatus(SwitchCaseStatus.IN_ORIGINAL_CODE); } }
@Override public CaseLabel visitCase_label(Case_labelContext ctx) { if (ctx.DEFAULT() != null) { return DefaultCaseLabel.INSTANCE; } return new ExprCaseLabel(visitExpression(ctx.expression())); }
@Override public void visitExprCaseLabel(ExprCaseLabel exprCaseLabel) { out.append(indent()); out.append("case "); visit(exprCaseLabel.getExpr()); out.append(":" + newLine()); }