@Override public void visitUnaryExpr(UnaryExpr unaryExpr) { super.visitUnaryExpr(unaryExpr); // TODO: need to check, but as a first approximation a unary always returns the same type as // its argument Type argType = types.get(unaryExpr.getExpr()); if (argType != null) { types.put(unaryExpr, argType); } }
@Override public void visitUnaryExpr(UnaryExpr unaryExpr) { visitChildFromParent(unaryExpr.getExpr(), unaryExpr); }
private static void replaceLoopCounterInIncrement(Expr increment, String newLoopCounter) { ((VariableIdentifierExpr) ((UnaryExpr) increment).getExpr()).setName(newLoopCounter); }
@Override public boolean preconditionHolds() { if (!enclosingBlock.getStmts().contains(secondLoop)) { return false; } if (!(firstLoop.getIncrement() instanceof UnaryExpr)) { return false; } if (!(((UnaryExpr) firstLoop.getIncrement()).getExpr() instanceof VariableIdentifierExpr)) { return false; } return true; }
private Optional<Integer> getAsConstant(Expr expr) { if (expr instanceof ParenExpr) { return getAsConstant(((ParenExpr)expr).getExpr()); } if (expr instanceof IntConstantExpr) { return Optional.of(Integer.valueOf(((IntConstantExpr) expr).getValue())); } if (expr instanceof UnaryExpr) { final UnaryExpr unaryExpr = (UnaryExpr) expr; switch (unaryExpr.getOp()) { case MINUS: return getAsConstant(unaryExpr.getExpr()).map(item -> -item); case PLUS: return getAsConstant(unaryExpr.getExpr()); default: return Optional.empty(); } } return Optional.empty(); }
private Optional<Integer> getIncrementValue(Expr incr, String loopCounterName) { if (incr instanceof UnaryExpr && isSameVarIdentifier(((UnaryExpr) incr).getExpr(), loopCounterName)) { switch (((UnaryExpr) incr).getOp()) { case POST_INC:
Expr incrementTarget = ((UnaryExpr) increment).getExpr(); if (!maybeGetName(incrementTarget).isPresent()) { return Optional.empty();
assert false : "Unknown unary operator " + unaryExpr.getOp(); visit(unaryExpr.getExpr()); switch (unaryExpr.getOp()) { case POST_DEC:
final Expr arg = maybeUe.get().getExpr(); switch (maybeUe.get().getOp()) { case PLUS:
/** * Determines whether the given statement came from a live code injection. * * @param stmt A statement to be analysed * @return Whether the statement is injected live code or not */ public static boolean isSimpleLiveCodeInjection(Stmt stmt) { if (!(stmt instanceof ExprStmt)) { return false; } final Expr expr = ((ExprStmt) stmt).getExpr(); if (expr instanceof BinaryExpr) { if (!((BinaryExpr) expr).getOp().isSideEffecting()) { return false; } return isLiveInjectionVariableReference(((BinaryExpr) expr).getLhs()); } if (expr instanceof UnaryExpr) { if (!((UnaryExpr) expr).getOp().isSideEffecting()) { return false; } return isLiveInjectionVariableReference(((UnaryExpr) expr).getExpr()); } if (expr instanceof FunctionCallExpr) { return ((FunctionCallExpr) expr).getCallee().startsWith(Constants.LIVE_PREFIX); } return false; }