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; }
public PreStatementVisitor(CheckerContext context) { super(context.getState()); constraintManager = context.getConstraintManager(); }
private PreStatementVisitor(SECheck check, CheckerContext context) { super(context.getState()); this.context = context; this.constraintManager = context.getConstraintManager(); this.check = check; }
PreStatementVisitor(CheckerContext context) { super(context.getState()); this.context = context; this.constraintManager = context.getConstraintManager(); }
PreStatementVisitor(CheckerContext context) { super(context.getState()); constraintManager = context.getConstraintManager(); }
public PreStatementVisitor(CheckerContext context) { super(context.getState()); constraintManager = context.getConstraintManager(); }
public PreStatementVisitor(CheckerContext context) { super(context.getState()); constraintManager = context.getConstraintManager(); }
PreStatementVisitor(CheckerContext context) { super(context.getState()); constraintManager = context.getConstraintManager(); }
PreStatementVisitor(CheckerContext context) { super(context.getState()); constraintManager = context.getConstraintManager(); }
@Override public ProgramState checkPostStatement(CheckerContext context, Tree syntaxNode) { if (syntaxNode.is(Tree.Kind.SWITCH_STATEMENT, Tree.Kind.THROW_STATEMENT) && context.getConstraintManager().isNull(context.getState(), context.getState().peekValue())) { NullDereferenceIssue issue = new NullDereferenceIssue(context.getNode(), context.getState().peekValue(), syntaxNode); detectedIssues.peek().add(issue); context.createSink(); return context.getState(); } List<ProgramState> programStates = setNullConstraint(context, syntaxNode); for (ProgramState programState : programStates) { context.addTransition(programState); } return context.getState(); }
@Override public ProgramState checkPostStatement(CheckerContext context, Tree syntaxNode) { if (syntaxNode.is(Tree.Kind.SWITCH_STATEMENT, Tree.Kind.THROW_STATEMENT) && context.getConstraintManager().isNull(context.getState(), context.getState().peekValue())) { NullDereferenceIssue issue = new NullDereferenceIssue(context.getNode(), context.getState().peekValue(), syntaxNode); detectedIssues.peek().add(issue); context.createSink(); return context.getState(); } List<ProgramState> programStates = setNullConstraint(context, syntaxNode); for (ProgramState programState : programStates) { context.addTransition(programState); } return context.getState(); }
private ProgramState handleMethodInvocation(CheckerContext context, MethodInvocationTree mit) { ProgramState programState = context.getState(); programState = removeConstraintOnArgs(programState, mit.arguments().size()); SymbolicValue invocationTarget = invocationTarget(programState, mit); if ((isIntermediateOperation(mit) || isTerminalOperation(mit)) && isPipelineConsumed(programState, invocationTarget)) { reportIssue(mit, "Refactor this code so that this consumed stream pipeline is not reused.", flow(invocationTarget, context.getNode())); return null; } if (isIntermediateOperation(mit)) { // intermediate operations return same stream pipeline, so we reuse SV context.getConstraintManager().setValueFactory(() -> invocationTarget); return Iterables.getOnlyElement(invocationTarget.setConstraint(programState, StreamPipelineConstraint.NOT_CONSUMED)); } if (isTerminalOperation(mit)) { return Iterables.getOnlyElement(invocationTarget.setConstraint(programState, StreamPipelineConstraint.CONSUMED)); } if (mit.symbol().isUnknown()) { // lambdas used in pipelines are sometimes not resolved properly, this is to shutdown the noise programState = programState.removeConstraintsOnDomain(invocationTarget, StreamPipelineConstraint.class); } return programState; }
@Override public ProgramState checkPostStatement(CheckerContext context, Tree syntaxNode) { if (syntaxNode.is(Tree.Kind.SWITCH_STATEMENT) && context.getConstraintManager().isNull(context.getState(), context.getState().peekValue())) { context.reportIssue(syntaxNode, this, "NullPointerException might be thrown as '" + SyntaxTreeNameFinder.getName(syntaxNode) + "' is nullable here"); context.createSink(); return context.getState(); } List<ProgramState> programStates = setNullConstraint(context, syntaxNode); for (ProgramState programState : programStates) { context.addTransition(programState); } return context.getState(); }
private ProgramState handleMethodInvocation(CheckerContext context, MethodInvocationTree mit) { ProgramState programState = context.getState(); programState = removeConstraintOnArgs(programState, mit.arguments().size()); SymbolicValue invocationTarget = invocationTarget(programState, mit); if ((isIntermediateOperation(mit) || isTerminalOperation(mit)) && isPipelineConsumed(programState, invocationTarget)) { reportIssue(mit, "Refactor this code so that this consumed stream pipeline is not reused.", flow(invocationTarget, context.getNode())); return null; } if (isIntermediateOperation(mit)) { // intermediate operations return same stream pipeline, so we reuse SV context.getConstraintManager().setValueFactory(() -> invocationTarget); return Iterables.getOnlyElement(invocationTarget.setConstraint(programState, StreamPipelineConstraint.NOT_CONSUMED)); } if (isTerminalOperation(mit)) { return Iterables.getOnlyElement(invocationTarget.setConstraint(programState, StreamPipelineConstraint.CONSUMED)); } if (mit.symbol().isUnknown()) { // lambdas used in pipelines are sometimes not resolved properly, this is to shutdown the noise programState = programState.removeConstraintsOnDomain(invocationTarget, StreamPipelineConstraint.class); } return programState; }