PreStatementVisitor(CheckerContext context) { super(context.getState()); this.context = context; this.constraintManager = context.getConstraintManager(); }
private PreStatementVisitor(SECheck check, CheckerContext context) { super(context.getState()); this.context = context; this.constraintManager = context.getConstraintManager(); this.check = check; }
@Override public ProgramState checkPreStatement(CheckerContext context, Tree syntaxNode) { if (syntaxNode.is(Tree.Kind.METHOD_INVOCATION)) { methodInvocations.peek().add((MethodInvocationTree) syntaxNode); } // No operation on state, just monitoring return context.getState(); }
private static boolean isUndefinedOrNull(CheckerContext context, Symbol symbol) { ProgramState programState = context.getState(); SymbolicValue value = programState.getValue(symbol); return value == null; }
private PreStatementVisitor(SECheck check, CheckerContext context) { super(context.getState()); this.context = context; this.constraintManager = context.getConstraintManager(); this.check = check; }
private static boolean isUndefinedOrNull(CheckerContext context, Symbol symbol) { ProgramState programState = context.getState(); SymbolicValue value = programState.getValue(symbol); return value == null; }
private static List<ProgramState> setNullConstraint(CheckerContext context, Tree syntaxNode) { SymbolicValue val = context.getState().peekValue(); if (syntaxNode.is(Tree.Kind.METHOD_INVOCATION) && isAnnotatedCheckForNull((MethodInvocationTree) syntaxNode)) { Preconditions.checkNotNull(val); List<ProgramState> states = new ArrayList<>(); states.addAll(val.setConstraint(context.getState(), ObjectConstraint.NULL)); states.addAll(val.setConstraint(context.getState(), ObjectConstraint.NOT_NULL)); return states; } return Lists.newArrayList(context.getState()); }
private ProgramState handleMinMaxInvocation(CheckerContext context, MethodInvocationTree syntaxNode) { if (!MIN_MAX_MATCHER.matches(syntaxNode)) { return context.getState(); } ProgramState programState = context.getState(); ProgramState psBeforeInvocation = context.getNode().programState; List<SymbolicValue> args = psBeforeInvocation.peekValues(2); List<ConstraintsByDomain> constraintsByArgs = args.stream().map(programState::getConstraints).collect(Collectors.toList()); checkRangeInconsistencies(context, syntaxNode, constraintsByArgs); return context.getState(); }
private ProgramState handleMinMaxInvocation(CheckerContext context, MethodInvocationTree syntaxNode) { if (!MIN_MAX_MATCHER.matches(syntaxNode)) { return context.getState(); } ProgramState programState = context.getState(); ProgramState psBeforeInvocation = context.getNode().programState; List<SymbolicValue> args = psBeforeInvocation.peekValues(2); List<ConstraintsByDomain> constraintsByArgs = args.stream().map(programState::getConstraints).collect(Collectors.toList()); checkRangeInconsistencies(context, syntaxNode, constraintsByArgs); return context.getState(); }
@Override public void checkEndOfExecutionPath(CheckerContext context, ConstraintManager constraintManager) { if (context.getState().exitingOnRuntimeException()) { return; } ExplodedGraph.Node node = context.getNode(); context.getState().getValuesWithConstraints(LockConstraint.LOCKED).stream() .flatMap(lockedSv -> FlowComputation.flowWithoutExceptions(node, lockedSv, LockConstraint.LOCKED::equals, LockConstraint.UNLOCKED::equals, LOCK_CONSTRAINT_DOMAIN).stream()) .flatMap(Flow::firstFlowLocation) .forEach(this::reportIssue); }
private static Set<SymbolicValue> symbolicValuesToReport(CheckerContext context) { List<SymbolicValue> openSymbolicValues = context.getState().getValuesWithConstraints(OPEN); Set<SymbolicValue> svToReport = new HashSet<>(openSymbolicValues); // report only outermost OPEN symbolic value for (SymbolicValue openSymbolicValue : openSymbolicValues) { if (openSymbolicValue instanceof ResourceWrapperSymbolicValue) { svToReport.remove(openSymbolicValue.wrappedValue()); } } return svToReport; }
@Override public void checkEndOfExecutionPath(CheckerContext context, ConstraintManager constraintManager) { if (context.getState().exitingOnRuntimeException()) { return; } ExplodedGraph.Node node = context.getNode(); context.getState().getValuesWithConstraints(OPENED).forEach(sv -> processUnclosedSymbolicValue(node, sv)); }
@Override public void checkEndOfExecutionPath(CheckerContext context, ConstraintManager constraintManager) { if (context.getState().exitingOnRuntimeException()) { return; } ExplodedGraph.Node node = context.getNode(); context.getState().getValuesWithConstraints(OPENED).forEach(sv -> processUnclosedSymbolicValue(node, sv)); }
private static ProgramState handleNumericalLiteral(CheckerContext context, @Nullable Number value) { ProgramState programState = context.getState(); if (value == null) { return programState; } return programState.addConstraint(programState.peekValue(), new NumericalConstraint(value)); }
@Override public ProgramState checkPreStatement(CheckerContext context, Tree syntaxNode) { if (contexts.peek().isThreadRunMethod()) { // It is OK to have an endless Thread run method return context.getState(); } final PreStatementVisitor visitor = new PreStatementVisitor(context); syntaxNode.accept(visitor); return visitor.programState; }
private ProgramState checkMemberSelect(CheckerContext context, MemberSelectExpressionTree mse, SymbolicValue currentVal) { if ("class".equals(mse.identifier().name())) { // expression ClassName.class won't raise NPE. return context.getState(); } return checkConstraint(context, mse, currentVal); }
@Override public void checkEndOfExecutionPath(CheckerContext context, ConstraintManager constraintManager) { if (context.getState().exitingOnRuntimeException()) { return; } ExplodedGraph.Node node = context.getNode(); Set<SymbolicValue> svToReport = symbolicValuesToReport(context); svToReport.forEach(sv -> processUnclosedSymbolicValue(node, sv)); }
@Override public ProgramState checkPostStatement(CheckerContext context, Tree syntaxNode) { ProgramState state = context.getState(); if (isReturningPipeline(syntaxNode) || nonLocalAssignment(syntaxNode)) { return state.removeConstraintsOnDomain(state.peekValue(), StreamPipelineConstraint.class); } return state; }
@Override public ProgramState checkPostStatement(CheckerContext context, Tree syntaxNode) { ProgramState state = context.getState(); if (isReturningPipeline(syntaxNode) || nonLocalAssignment(syntaxNode)) { return state.removeConstraintsOnDomain(state.peekValue(), StreamPipelineConstraint.class); } return state; }
@Override public ProgramState checkPreStatement(CheckerContext context, Tree syntaxNode) { ProgramState state = context.getState(); if (syntaxNode.is(Tree.Kind.METHOD_INVOCATION)) { MethodInvocationTree mit = (MethodInvocationTree) syntaxNode; checkParameters(mit, mit.symbol(), mit.arguments(), state); } else if (syntaxNode.is(Tree.Kind.NEW_CLASS)) { NewClassTree nct = (NewClassTree) syntaxNode; checkParameters(nct, nct.constructorSymbol(), nct.arguments(), state); } return state; }