Search in sources :

Example 1 with POP

use of org.objectweb.asm.Opcodes.POP in project groovy by apache.

the class StaticTypesCallSiteWriter method writeListDotProperty.

private void writeListDotProperty(final Expression receiver, final String propertyName, final boolean safe) {
    // for lists, replace list.foo with:
    // def result = new ArrayList(list.size())
    // for (item in list) result.add(item.foo)
    // result
    ClassNode componentType = receiver.getNodeMetaData(StaticCompilationMetadataKeys.COMPONENT_TYPE);
    if (componentType == null) {
        componentType = OBJECT_TYPE;
    }
    CompileStack compileStack = controller.getCompileStack();
    MethodVisitor mv = controller.getMethodVisitor();
    Label exit = new Label();
    if (safe) {
        receiver.visit(controller.getAcg());
        Label doGet = new Label();
        mv.visitJumpInsn(IFNONNULL, doGet);
        controller.getOperandStack().remove(1);
        mv.visitInsn(ACONST_NULL);
        mv.visitJumpInsn(GOTO, exit);
        mv.visitLabel(doGet);
    }
    Variable tmpList = varX("tmpList", ClassHelper.make(ArrayList.class));
    int var = compileStack.defineTemporaryVariable(tmpList, false);
    Variable iterator = varX("iterator", Iterator_TYPE);
    int it = compileStack.defineTemporaryVariable(iterator, false);
    Variable nextVar = varX("next", componentType);
    final int next = compileStack.defineTemporaryVariable(nextVar, false);
    mv.visitTypeInsn(NEW, "java/util/ArrayList");
    mv.visitInsn(DUP);
    receiver.visit(controller.getAcg());
    mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "size", "()I", true);
    controller.getOperandStack().remove(1);
    mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "(I)V", false);
    mv.visitVarInsn(ASTORE, var);
    Label l1 = new Label();
    mv.visitLabel(l1);
    receiver.visit(controller.getAcg());
    mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "iterator", "()Ljava/util/Iterator;", true);
    controller.getOperandStack().remove(1);
    mv.visitVarInsn(ASTORE, it);
    Label l2 = new Label();
    mv.visitLabel(l2);
    mv.visitVarInsn(ALOAD, it);
    mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z", true);
    Label l3 = new Label();
    mv.visitJumpInsn(IFEQ, l3);
    mv.visitVarInsn(ALOAD, it);
    mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;", true);
    mv.visitTypeInsn(CHECKCAST, BytecodeHelper.getClassInternalName(componentType));
    mv.visitVarInsn(ASTORE, next);
    Label l4 = new Label();
    mv.visitLabel(l4);
    mv.visitVarInsn(ALOAD, var);
    PropertyExpression pexp = propX(bytecodeX(componentType, v -> v.visitVarInsn(ALOAD, next)), propertyName);
    pexp.visit(controller.getAcg());
    controller.getOperandStack().box();
    controller.getOperandStack().remove(1);
    mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z", true);
    mv.visitInsn(POP);
    Label l5 = new Label();
    mv.visitLabel(l5);
    mv.visitJumpInsn(GOTO, l2);
    mv.visitLabel(l3);
    mv.visitVarInsn(ALOAD, var);
    if (safe) {
        mv.visitLabel(exit);
    }
    controller.getOperandStack().push(ClassHelper.make(ArrayList.class));
    controller.getCompileStack().removeVar(next);
    controller.getCompileStack().removeVar(it);
    controller.getCompileStack().removeVar(var);
}
Also used : ASTORE(org.objectweb.asm.Opcodes.ASTORE) MethodVisitor(org.objectweb.asm.MethodVisitor) GETSTATIC(org.objectweb.asm.Opcodes.GETSTATIC) GeneralUtils.classX(org.codehaus.groovy.ast.tools.GeneralUtils.classX) Number_TYPE(org.codehaus.groovy.ast.ClassHelper.Number_TYPE) ClassHelper.isBigDecimalType(org.codehaus.groovy.ast.ClassHelper.isBigDecimalType) Variable(org.codehaus.groovy.ast.Variable) NEW(org.objectweb.asm.Opcodes.NEW) StaticTypeCheckingSupport.chooseBestMethod(org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.chooseBestMethod) INVOKEINTERFACE(org.objectweb.asm.Opcodes.INVOKEINTERFACE) BytecodeHelper(org.codehaus.groovy.classgen.asm.BytecodeHelper) GeneralUtils.nullX(org.codehaus.groovy.ast.tools.GeneralUtils.nullX) Map(java.util.Map) GeneralUtils.propX(org.codehaus.groovy.ast.tools.GeneralUtils.propX) AALOAD(org.objectweb.asm.Opcodes.AALOAD) ClassHelper.isBigIntegerType(org.codehaus.groovy.ast.ClassHelper.isBigIntegerType) BytecodeExpression(org.codehaus.groovy.classgen.BytecodeExpression) PropertyNode(org.codehaus.groovy.ast.PropertyNode) ClassHelper.isWrapperLong(org.codehaus.groovy.ast.ClassHelper.isWrapperLong) VariableExpression(org.codehaus.groovy.ast.expr.VariableExpression) GROOVY_OBJECT_TYPE(org.codehaus.groovy.ast.ClassHelper.GROOVY_OBJECT_TYPE) LIST_TYPE(org.codehaus.groovy.ast.ClassHelper.LIST_TYPE) Collection(java.util.Collection) GeneralUtils.args(org.codehaus.groovy.ast.tools.GeneralUtils.args) BeanUtils.capitalize(org.apache.groovy.util.BeanUtils.capitalize) IFNULL(org.objectweb.asm.Opcodes.IFNULL) MethodCallerMultiAdapter(org.codehaus.groovy.classgen.asm.MethodCallerMultiAdapter) ClassNodeUtils.getField(org.apache.groovy.ast.tools.ClassNodeUtils.getField) ClassHelper.getUnwrapper(org.codehaus.groovy.ast.ClassHelper.getUnwrapper) GeneralUtils.callX(org.codehaus.groovy.ast.tools.GeneralUtils.callX) InnerClassNode(org.codehaus.groovy.ast.InnerClassNode) GETFIELD(org.objectweb.asm.Opcodes.GETFIELD) GroovyBugError(org.codehaus.groovy.GroovyBugError) CallSiteWriter(org.codehaus.groovy.classgen.asm.CallSiteWriter) ExpressionUtils.isThisExpression(org.apache.groovy.ast.tools.ExpressionUtils.isThisExpression) StaticTypeCheckingSupport.findDGMMethodsByNameAndArguments(org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.findDGMMethodsByNameAndArguments) DUP(org.objectweb.asm.Opcodes.DUP) CLASS_Type(org.codehaus.groovy.ast.ClassHelper.CLASS_Type) List(java.util.List) StaticTypeCheckingSupport.implementsInterfaceOrIsSubclassOf(org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.implementsInterfaceOrIsSubclassOf) CompileStack(org.codehaus.groovy.classgen.asm.CompileStack) OBJECT_TYPE(org.codehaus.groovy.ast.ClassHelper.OBJECT_TYPE) GeneralUtils.bytecodeX(org.codehaus.groovy.ast.tools.GeneralUtils.bytecodeX) ACC_PUBLIC(org.objectweb.asm.Opcodes.ACC_PUBLIC) IFNONNULL(org.objectweb.asm.Opcodes.IFNONNULL) STRING_TYPE(org.codehaus.groovy.ast.ClassHelper.STRING_TYPE) ClassHelper.getWrapper(org.codehaus.groovy.ast.ClassHelper.getWrapper) GOTO(org.objectweb.asm.Opcodes.GOTO) GeneralUtils.constX(org.codehaus.groovy.ast.tools.GeneralUtils.constX) GeneralUtils.isOrImplements(org.codehaus.groovy.ast.tools.GeneralUtils.isOrImplements) PropertyExpression(org.codehaus.groovy.ast.expr.PropertyExpression) ClassHelper.int_TYPE(org.codehaus.groovy.ast.ClassHelper.int_TYPE) ClassHelper.isWrapperInteger(org.codehaus.groovy.ast.ClassHelper.isWrapperInteger) Label(org.objectweb.asm.Label) ACC_STATIC(org.objectweb.asm.Opcodes.ACC_STATIC) ArrayList(java.util.ArrayList) PUTFIELD(org.objectweb.asm.Opcodes.PUTFIELD) IFEQ(org.objectweb.asm.Opcodes.IFEQ) INVOKESTATIC(org.objectweb.asm.Opcodes.INVOKESTATIC) MethodNode(org.codehaus.groovy.ast.MethodNode) ACONST_NULL(org.objectweb.asm.Opcodes.ACONST_NULL) CLOSURE_TYPE(org.codehaus.groovy.ast.ClassHelper.CLOSURE_TYPE) MethodCallExpression(org.codehaus.groovy.ast.expr.MethodCallExpression) GeneralUtils.varX(org.codehaus.groovy.ast.tools.GeneralUtils.varX) Expression(org.codehaus.groovy.ast.expr.Expression) CHECKCAST(org.objectweb.asm.Opcodes.CHECKCAST) POP(org.objectweb.asm.Opcodes.POP) Parameter(org.codehaus.groovy.ast.Parameter) MAP_TYPE(org.codehaus.groovy.ast.ClassHelper.MAP_TYPE) InvokerHelper(org.codehaus.groovy.runtime.InvokerHelper) ClassNode(org.codehaus.groovy.ast.ClassNode) OperandStack(org.codehaus.groovy.classgen.asm.OperandStack) ClassHelper(org.codehaus.groovy.ast.ClassHelper) ClassHelper.isStringType(org.codehaus.groovy.ast.ClassHelper.isStringType) AsmClassGenerator(org.codehaus.groovy.classgen.AsmClassGenerator) ClassHelper.isPrimitiveBoolean(org.codehaus.groovy.ast.ClassHelper.isPrimitiveBoolean) GeneralUtils.castX(org.codehaus.groovy.ast.tools.GeneralUtils.castX) StaticCompilationMetadataKeys(org.codehaus.groovy.transform.sc.StaticCompilationMetadataKeys) StaticTypesMarker(org.codehaus.groovy.transform.stc.StaticTypesMarker) ClassHelper.isGeneratedFunction(org.codehaus.groovy.ast.ClassHelper.isGeneratedFunction) ARRAYLENGTH(org.objectweb.asm.Opcodes.ARRAYLENGTH) StaticTypeCheckingSupport.isClassClassNodeWrappingConcreteType(org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isClassClassNodeWrappingConcreteType) TypeChooser(org.codehaus.groovy.classgen.asm.TypeChooser) GeneralUtils.callThisX(org.codehaus.groovy.ast.tools.GeneralUtils.callThisX) ClassExpression(org.codehaus.groovy.ast.expr.ClassExpression) EmptyStatement(org.codehaus.groovy.ast.stmt.EmptyStatement) ASTNode(org.codehaus.groovy.ast.ASTNode) ClassHelper.isClassType(org.codehaus.groovy.ast.ClassHelper.isClassType) ClassHelper.isPrimitiveType(org.codehaus.groovy.ast.ClassHelper.isPrimitiveType) FieldNode(org.codehaus.groovy.ast.FieldNode) PUTSTATIC(org.objectweb.asm.Opcodes.PUTSTATIC) VariableSlotLoader(org.codehaus.groovy.classgen.asm.VariableSlotLoader) INVOKESPECIAL(org.objectweb.asm.Opcodes.INVOKESPECIAL) Iterator_TYPE(org.codehaus.groovy.ast.ClassHelper.Iterator_TYPE) SyntaxException(org.codehaus.groovy.syntax.SyntaxException) ALOAD(org.objectweb.asm.Opcodes.ALOAD) InnerClassNode(org.codehaus.groovy.ast.InnerClassNode) ClassNode(org.codehaus.groovy.ast.ClassNode) Variable(org.codehaus.groovy.ast.Variable) Label(org.objectweb.asm.Label) ArrayList(java.util.ArrayList) PropertyExpression(org.codehaus.groovy.ast.expr.PropertyExpression) CompileStack(org.codehaus.groovy.classgen.asm.CompileStack) MethodVisitor(org.objectweb.asm.MethodVisitor)

Example 2 with POP

use of org.objectweb.asm.Opcodes.POP in project sonar-java by SonarSource.

the class BytecodeEGWalker method branchingState.

@VisibleForTesting
ProgramState branchingState(Instruction terminator, ProgramState programState) {
    ProgramState.Pop pop;
    ProgramState ps;
    List<ProgramState.SymbolicValueSymbol> symbolicValueSymbols;
    switch(terminator.opcode) {
        case IFEQ:
        case IFNE:
        case IFLT:
        case IFGE:
        case IFGT:
        case IFLE:
            pop = programState.unstackValue(1);
            SymbolicValue svZero = new SymbolicValue();
            symbolicValueSymbols = ImmutableList.of(new ProgramState.SymbolicValueSymbol(svZero, null), pop.valuesAndSymbols.get(0));
            List<ProgramState> programStates = svZero.setConstraint(pop.state, DivisionByZeroCheck.ZeroConstraint.ZERO).stream().flatMap(s -> svZero.setConstraint(s, BooleanConstraint.FALSE).stream()).collect(Collectors.toList());
            Preconditions.checkState(programStates.size() == 1);
            ps = programStates.get(0);
            break;
        case IF_ICMPEQ:
        case IF_ICMPNE:
        case IF_ICMPLT:
        case IF_ICMPGE:
        case IF_ICMPGT:
        case IF_ICMPLE:
        case IF_ACMPEQ:
        case IF_ACMPNE:
            pop = programState.unstackValue(2);
            symbolicValueSymbols = pop.valuesAndSymbols;
            ps = pop.state;
            break;
        case IFNULL:
        case IFNONNULL:
            pop = programState.unstackValue(1);
            symbolicValueSymbols = ImmutableList.of(new ProgramState.SymbolicValueSymbol(SymbolicValue.NULL_LITERAL, null), pop.valuesAndSymbols.get(0));
            ps = pop.state;
            break;
        default:
            throw new IllegalStateException("Unexpected terminator " + terminator);
    }
    return ps.stackValue(constraintManager.createBinarySymbolicValue(terminator, symbolicValueSymbols));
}
Also used : ASTORE(org.objectweb.asm.Opcodes.ASTORE) ATHROW(org.objectweb.asm.Opcodes.ATHROW) DMUL(org.objectweb.asm.Opcodes.DMUL) F2D(org.objectweb.asm.Opcodes.F2D) LSHR(org.objectweb.asm.Opcodes.LSHR) IF_ICMPEQ(org.objectweb.asm.Opcodes.IF_ICMPEQ) F2I(org.objectweb.asm.Opcodes.F2I) IINC(org.objectweb.asm.Opcodes.IINC) IFGT(org.objectweb.asm.Opcodes.IFGT) LSHL(org.objectweb.asm.Opcodes.LSHL) IAND(org.objectweb.asm.Opcodes.IAND) DCMPL(org.objectweb.asm.Opcodes.DCMPL) LSTORE(org.objectweb.asm.Opcodes.LSTORE) TypedConstraint(org.sonar.java.se.constraint.TypedConstraint) DCMPG(org.objectweb.asm.Opcodes.DCMPG) IFNULL(org.objectweb.asm.Opcodes.IFNULL) FLOAD(org.objectweb.asm.Opcodes.FLOAD) INSTANCEOF(org.objectweb.asm.Opcodes.INSTANCEOF) IALOAD(org.objectweb.asm.Opcodes.IALOAD) DUP2_X2(org.objectweb.asm.Opcodes.DUP2_X2) DUP2_X1(org.objectweb.asm.Opcodes.DUP2_X1) PUTFIELD(org.objectweb.asm.Opcodes.PUTFIELD) IFEQ(org.objectweb.asm.Opcodes.IFEQ) Lists(com.google.common.collect.Lists) INVOKESTATIC(org.objectweb.asm.Opcodes.INVOKESTATIC) ACONST_NULL(org.objectweb.asm.Opcodes.ACONST_NULL) MethodBehavior(org.sonar.java.se.xproc.MethodBehavior) DALOAD(org.objectweb.asm.Opcodes.DALOAD) INEG(org.objectweb.asm.Opcodes.INEG) MONITORENTER(org.objectweb.asm.Opcodes.MONITORENTER) TABLESWITCH(org.objectweb.asm.Opcodes.TABLESWITCH) ICONST_5(org.objectweb.asm.Opcodes.ICONST_5) IMUL(org.objectweb.asm.Opcodes.IMUL) LOR(org.objectweb.asm.Opcodes.LOR) DASTORE(org.objectweb.asm.Opcodes.DASTORE) ICONST_4(org.objectweb.asm.Opcodes.ICONST_4) Opcodes(org.objectweb.asm.Opcodes) ICONST_3(org.objectweb.asm.Opcodes.ICONST_3) ICONST_2(org.objectweb.asm.Opcodes.ICONST_2) IFGE(org.objectweb.asm.Opcodes.IFGE) ICONST_1(org.objectweb.asm.Opcodes.ICONST_1) ICONST_0(org.objectweb.asm.Opcodes.ICONST_0) LADD(org.objectweb.asm.Opcodes.LADD) F2L(org.objectweb.asm.Opcodes.F2L) Printer(org.objectweb.asm.util.Printer) LREM(org.objectweb.asm.Opcodes.LREM) Preconditions(com.google.common.base.Preconditions) INVOKESPECIAL(org.objectweb.asm.Opcodes.INVOKESPECIAL) DNEG(org.objectweb.asm.Opcodes.DNEG) LDIV(org.objectweb.asm.Opcodes.LDIV) LLOAD(org.objectweb.asm.Opcodes.LLOAD) LCMP(org.objectweb.asm.Opcodes.LCMP) IXOR(org.objectweb.asm.Opcodes.IXOR) DSUB(org.objectweb.asm.Opcodes.DSUB) IFLE(org.objectweb.asm.Opcodes.IFLE) Loggers(org.sonar.api.utils.log.Loggers) LASTORE(org.objectweb.asm.Opcodes.LASTORE) FSTORE(org.objectweb.asm.Opcodes.FSTORE) INVOKEVIRTUAL(org.objectweb.asm.Opcodes.INVOKEVIRTUAL) Collectors(java.util.stream.Collectors) GETFIELD(org.objectweb.asm.Opcodes.GETFIELD) FNEG(org.objectweb.asm.Opcodes.FNEG) I2L(org.objectweb.asm.Opcodes.I2L) CASTORE(org.objectweb.asm.Opcodes.CASTORE) Instruction(org.sonar.java.bytecode.cfg.Instruction) GOTO(org.objectweb.asm.Opcodes.GOTO) I2S(org.objectweb.asm.Opcodes.I2S) Constraint(org.sonar.java.se.constraint.Constraint) ARETURN(org.objectweb.asm.Opcodes.ARETURN) IFLT(org.objectweb.asm.Opcodes.IFLT) IUSHR(org.objectweb.asm.Opcodes.IUSHR) Symbols(org.sonar.java.resolve.Symbols) IF_ACMPEQ(org.objectweb.asm.Opcodes.IF_ACMPEQ) LRETURN(org.objectweb.asm.Opcodes.LRETURN) DivisionByZeroCheck(org.sonar.java.se.checks.DivisionByZeroCheck) ConstraintManager(org.sonar.java.se.constraint.ConstraintManager) ImmutableList(com.google.common.collect.ImmutableList) SymbolicValue(org.sonar.java.se.symbolicvalues.SymbolicValue) LinkedList(java.util.LinkedList) BytecodeCFG(org.sonar.java.bytecode.cfg.BytecodeCFG) NOP(org.objectweb.asm.Opcodes.NOP) SquidClassLoader(org.sonar.java.bytecode.loader.SquidClassLoader) MONITOREXIT(org.objectweb.asm.Opcodes.MONITOREXIT) Type(org.sonar.plugins.java.api.semantic.Type) ISUB(org.objectweb.asm.Opcodes.ISUB) ARRAYLENGTH(org.objectweb.asm.Opcodes.ARRAYLENGTH) DUP_X2(org.objectweb.asm.Opcodes.DUP_X2) DUP_X1(org.objectweb.asm.Opcodes.DUP_X1) AASTORE(org.objectweb.asm.Opcodes.AASTORE) SemanticModel(org.sonar.java.resolve.SemanticModel) BALOAD(org.objectweb.asm.Opcodes.BALOAD) PUTSTATIC(org.objectweb.asm.Opcodes.PUTSTATIC) ProgramPoint(org.sonar.java.se.ProgramPoint) CheckForNull(javax.annotation.CheckForNull) LMUL(org.objectweb.asm.Opcodes.LMUL) INVOKEINTERFACE(org.objectweb.asm.Opcodes.INVOKEINTERFACE) BASTORE(org.objectweb.asm.Opcodes.BASTORE) IF_ICMPNE(org.objectweb.asm.Opcodes.IF_ICMPNE) AALOAD(org.objectweb.asm.Opcodes.AALOAD) BooleanConstraint(org.sonar.java.se.constraint.BooleanConstraint) ExceptionUtils(org.sonar.java.se.ExceptionUtils) FCONST_0(org.objectweb.asm.Opcodes.FCONST_0) FCONST_1(org.objectweb.asm.Opcodes.FCONST_1) FCONST_2(org.objectweb.asm.Opcodes.FCONST_2) DCONST_0(org.objectweb.asm.Opcodes.DCONST_0) SIPUSH(org.objectweb.asm.Opcodes.SIPUSH) Set(java.util.Set) IF_ICMPLT(org.objectweb.asm.Opcodes.IF_ICMPLT) DLOAD(org.objectweb.asm.Opcodes.DLOAD) DUP(org.objectweb.asm.Opcodes.DUP) FCMPG(org.objectweb.asm.Opcodes.FCMPG) LAND(org.objectweb.asm.Opcodes.LAND) FCMPL(org.objectweb.asm.Opcodes.FCMPL) LCONST_0(org.objectweb.asm.Opcodes.LCONST_0) SASTORE(org.objectweb.asm.Opcodes.SASTORE) LALOAD(org.objectweb.asm.Opcodes.LALOAD) DCONST_1(org.objectweb.asm.Opcodes.DCONST_1) LCONST_1(org.objectweb.asm.Opcodes.LCONST_1) IOR(org.objectweb.asm.Opcodes.IOR) ObjectConstraint(org.sonar.java.se.constraint.ObjectConstraint) DSTORE(org.objectweb.asm.Opcodes.DSTORE) CALOAD(org.objectweb.asm.Opcodes.CALOAD) FMUL(org.objectweb.asm.Opcodes.FMUL) LONG_OR_DOUBLE(org.sonar.java.bytecode.se.BytecodeEGWalker.StackValueCategoryConstraint.LONG_OR_DOUBLE) I2B(org.objectweb.asm.Opcodes.I2B) IFNE(org.objectweb.asm.Opcodes.IFNE) IREM(org.objectweb.asm.Opcodes.IREM) I2C(org.objectweb.asm.Opcodes.I2C) I2D(org.objectweb.asm.Opcodes.I2D) SWAP(org.objectweb.asm.Opcodes.SWAP) I2F(org.objectweb.asm.Opcodes.I2F) IADD(org.objectweb.asm.Opcodes.IADD) ISTORE(org.objectweb.asm.Opcodes.ISTORE) Pair(org.sonar.java.se.Pair) LOOKUPSWITCH(org.objectweb.asm.Opcodes.LOOKUPSWITCH) IF_ICMPLE(org.objectweb.asm.Opcodes.IF_ICMPLE) INVOKEDYNAMIC(org.objectweb.asm.Opcodes.INVOKEDYNAMIC) LinkedHashSet(java.util.LinkedHashSet) Nullable(javax.annotation.Nullable) Logger(org.sonar.api.utils.log.Logger) IDIV(org.objectweb.asm.Opcodes.IDIV) DREM(org.objectweb.asm.Opcodes.DREM) POP(org.objectweb.asm.Opcodes.POP) SALOAD(org.objectweb.asm.Opcodes.SALOAD) ISHR(org.objectweb.asm.Opcodes.ISHR) NEWARRAY(org.objectweb.asm.Opcodes.NEWARRAY) DADD(org.objectweb.asm.Opcodes.DADD) RelationalSymbolicValue(org.sonar.java.se.symbolicvalues.RelationalSymbolicValue) ICONST_M1(org.objectweb.asm.Opcodes.ICONST_M1) ISHL(org.objectweb.asm.Opcodes.ISHL) BehaviorCache(org.sonar.java.se.xproc.BehaviorCache) LNEG(org.objectweb.asm.Opcodes.LNEG) IRETURN(org.objectweb.asm.Opcodes.IRETURN) DDIV(org.objectweb.asm.Opcodes.DDIV) ALOAD(org.objectweb.asm.Opcodes.ALOAD) FALOAD(org.objectweb.asm.Opcodes.FALOAD) GETSTATIC(org.objectweb.asm.Opcodes.GETSTATIC) LSUB(org.objectweb.asm.Opcodes.LSUB) D2F(org.objectweb.asm.Opcodes.D2F) D2I(org.objectweb.asm.Opcodes.D2I) D2L(org.objectweb.asm.Opcodes.D2L) L2D(org.objectweb.asm.Opcodes.L2D) NEW(org.objectweb.asm.Opcodes.NEW) BytecodeCFGMethodVisitor(org.sonar.java.bytecode.cfg.BytecodeCFGMethodVisitor) MULTIANEWARRAY(org.objectweb.asm.Opcodes.MULTIANEWARRAY) FADD(org.objectweb.asm.Opcodes.FADD) BIPUSH(org.objectweb.asm.Opcodes.BIPUSH) IASTORE(org.objectweb.asm.Opcodes.IASTORE) FREM(org.objectweb.asm.Opcodes.FREM) List(java.util.List) FDIV(org.objectweb.asm.Opcodes.FDIV) DRETURN(org.objectweb.asm.Opcodes.DRETURN) LXOR(org.objectweb.asm.Opcodes.LXOR) FASTORE(org.objectweb.asm.Opcodes.FASTORE) IFNONNULL(org.objectweb.asm.Opcodes.IFNONNULL) FSUB(org.objectweb.asm.Opcodes.FSUB) LUSHR(org.objectweb.asm.Opcodes.LUSHR) IF_ACMPNE(org.objectweb.asm.Opcodes.IF_ACMPNE) ProgramState(org.sonar.java.se.ProgramState) Deque(java.util.Deque) IF_ICMPGT(org.objectweb.asm.Opcodes.IF_ICMPGT) ExplodedGraphWalker(org.sonar.java.se.ExplodedGraphWalker) LDC(org.objectweb.asm.Opcodes.LDC) CHECKCAST(org.objectweb.asm.Opcodes.CHECKCAST) DUP2(org.objectweb.asm.Opcodes.DUP2) ExplodedGraph(org.sonar.java.se.ExplodedGraph) L2F(org.objectweb.asm.Opcodes.L2F) ANEWARRAY(org.objectweb.asm.Opcodes.ANEWARRAY) L2I(org.objectweb.asm.Opcodes.L2I) RETURN(org.objectweb.asm.Opcodes.RETURN) ILOAD(org.objectweb.asm.Opcodes.ILOAD) FRETURN(org.objectweb.asm.Opcodes.FRETURN) VisibleForTesting(com.google.common.annotations.VisibleForTesting) Collections(java.util.Collections) POP2(org.objectweb.asm.Opcodes.POP2) IF_ICMPGE(org.objectweb.asm.Opcodes.IF_ICMPGE) ProgramState(org.sonar.java.se.ProgramState) SymbolicValue(org.sonar.java.se.symbolicvalues.SymbolicValue) RelationalSymbolicValue(org.sonar.java.se.symbolicvalues.RelationalSymbolicValue) VisibleForTesting(com.google.common.annotations.VisibleForTesting)

Example 3 with POP

use of org.objectweb.asm.Opcodes.POP in project sonar-java by SonarSource.

the class BytecodeEGWalker method handleMethodInvocation.

private boolean handleMethodInvocation(Instruction instruction) {
    boolean isStatic = instruction.opcode == Opcodes.INVOKESTATIC;
    int arity = isStatic ? instruction.arity() : (instruction.arity() + 1);
    ProgramState.Pop pop = programState.unstackValue(arity);
    Preconditions.checkState(pop.values.size() == arity, "Arguments mismatch for INVOKE");
    // TODO use constraintManager.createMethodSymbolicValue to create relational SV for equals
    programState = pop.state;
    SymbolicValue returnSV = instruction.hasReturnValue() ? constraintManager.createSymbolicValue(instruction) : null;
    String signature = instruction.fieldOrMethod.completeSignature();
    MethodBehavior methodInvokedBehavior = behaviorCache.get(signature);
    enqueueUncheckedExceptions();
    // FIXME : empty yields here should not happen, for now act as if behavior was not resolved.
    if (methodInvokedBehavior != null && methodInvokedBehavior.isComplete() && !methodInvokedBehavior.yields().isEmpty()) {
        List<SymbolicValue> stack = Lists.reverse(pop.values);
        if (!isStatic) {
            // remove "thisSV" from stack before trying to apply any yield, as it should not match with arguments
            stack = stack.subList(1, stack.size());
        }
        List<SymbolicValue> arguments = stack;
        methodInvokedBehavior.happyPathYields().forEach(yield -> yield.statesAfterInvocation(arguments, Collections.emptyList(), programState, () -> returnSV).forEach(ps -> {
            checkerDispatcher.methodYield = yield;
            if (ps.peekValue() != null) {
                ps = setDoubleOrLong(ps, ps.peekValue(), instruction.isLongOrDoubleValue());
            }
            checkerDispatcher.addTransition(ps);
            checkerDispatcher.methodYield = null;
        }));
        methodInvokedBehavior.exceptionalPathYields().forEach(yield -> {
            Type exceptionType = yield.exceptionType(semanticModel);
            yield.statesAfterInvocation(arguments, Collections.emptyList(), programState, () -> constraintManager.createExceptionalSymbolicValue(exceptionType)).forEach(ps -> {
                ps.storeExitValue();
                enqueueExceptionHandlers(exceptionType, ps);
            });
        });
        return true;
    }
    if (methodInvokedBehavior != null) {
        methodInvokedBehavior.getDeclaredExceptions().forEach(exception -> {
            Type exceptionType = semanticModel.getClassType(exception);
            ProgramState ps = programState.stackValue(constraintManager.createExceptionalSymbolicValue(exceptionType));
            enqueueExceptionHandlers(exceptionType, ps);
        });
    }
    if (instruction.hasReturnValue()) {
        programState = programState.stackValue(returnSV);
        programState = setDoubleOrLong(returnSV, instruction.isLongOrDoubleValue());
    }
    return false;
}
Also used : ASTORE(org.objectweb.asm.Opcodes.ASTORE) ATHROW(org.objectweb.asm.Opcodes.ATHROW) DMUL(org.objectweb.asm.Opcodes.DMUL) F2D(org.objectweb.asm.Opcodes.F2D) LSHR(org.objectweb.asm.Opcodes.LSHR) IF_ICMPEQ(org.objectweb.asm.Opcodes.IF_ICMPEQ) F2I(org.objectweb.asm.Opcodes.F2I) IINC(org.objectweb.asm.Opcodes.IINC) IFGT(org.objectweb.asm.Opcodes.IFGT) LSHL(org.objectweb.asm.Opcodes.LSHL) IAND(org.objectweb.asm.Opcodes.IAND) DCMPL(org.objectweb.asm.Opcodes.DCMPL) LSTORE(org.objectweb.asm.Opcodes.LSTORE) TypedConstraint(org.sonar.java.se.constraint.TypedConstraint) DCMPG(org.objectweb.asm.Opcodes.DCMPG) IFNULL(org.objectweb.asm.Opcodes.IFNULL) FLOAD(org.objectweb.asm.Opcodes.FLOAD) INSTANCEOF(org.objectweb.asm.Opcodes.INSTANCEOF) IALOAD(org.objectweb.asm.Opcodes.IALOAD) DUP2_X2(org.objectweb.asm.Opcodes.DUP2_X2) DUP2_X1(org.objectweb.asm.Opcodes.DUP2_X1) PUTFIELD(org.objectweb.asm.Opcodes.PUTFIELD) IFEQ(org.objectweb.asm.Opcodes.IFEQ) Lists(com.google.common.collect.Lists) INVOKESTATIC(org.objectweb.asm.Opcodes.INVOKESTATIC) ACONST_NULL(org.objectweb.asm.Opcodes.ACONST_NULL) MethodBehavior(org.sonar.java.se.xproc.MethodBehavior) DALOAD(org.objectweb.asm.Opcodes.DALOAD) INEG(org.objectweb.asm.Opcodes.INEG) MONITORENTER(org.objectweb.asm.Opcodes.MONITORENTER) TABLESWITCH(org.objectweb.asm.Opcodes.TABLESWITCH) ICONST_5(org.objectweb.asm.Opcodes.ICONST_5) IMUL(org.objectweb.asm.Opcodes.IMUL) LOR(org.objectweb.asm.Opcodes.LOR) DASTORE(org.objectweb.asm.Opcodes.DASTORE) ICONST_4(org.objectweb.asm.Opcodes.ICONST_4) Opcodes(org.objectweb.asm.Opcodes) ICONST_3(org.objectweb.asm.Opcodes.ICONST_3) ICONST_2(org.objectweb.asm.Opcodes.ICONST_2) IFGE(org.objectweb.asm.Opcodes.IFGE) ICONST_1(org.objectweb.asm.Opcodes.ICONST_1) ICONST_0(org.objectweb.asm.Opcodes.ICONST_0) LADD(org.objectweb.asm.Opcodes.LADD) F2L(org.objectweb.asm.Opcodes.F2L) Printer(org.objectweb.asm.util.Printer) LREM(org.objectweb.asm.Opcodes.LREM) Preconditions(com.google.common.base.Preconditions) INVOKESPECIAL(org.objectweb.asm.Opcodes.INVOKESPECIAL) DNEG(org.objectweb.asm.Opcodes.DNEG) LDIV(org.objectweb.asm.Opcodes.LDIV) LLOAD(org.objectweb.asm.Opcodes.LLOAD) LCMP(org.objectweb.asm.Opcodes.LCMP) IXOR(org.objectweb.asm.Opcodes.IXOR) DSUB(org.objectweb.asm.Opcodes.DSUB) IFLE(org.objectweb.asm.Opcodes.IFLE) Loggers(org.sonar.api.utils.log.Loggers) LASTORE(org.objectweb.asm.Opcodes.LASTORE) FSTORE(org.objectweb.asm.Opcodes.FSTORE) INVOKEVIRTUAL(org.objectweb.asm.Opcodes.INVOKEVIRTUAL) Collectors(java.util.stream.Collectors) GETFIELD(org.objectweb.asm.Opcodes.GETFIELD) FNEG(org.objectweb.asm.Opcodes.FNEG) I2L(org.objectweb.asm.Opcodes.I2L) CASTORE(org.objectweb.asm.Opcodes.CASTORE) Instruction(org.sonar.java.bytecode.cfg.Instruction) GOTO(org.objectweb.asm.Opcodes.GOTO) I2S(org.objectweb.asm.Opcodes.I2S) Constraint(org.sonar.java.se.constraint.Constraint) ARETURN(org.objectweb.asm.Opcodes.ARETURN) IFLT(org.objectweb.asm.Opcodes.IFLT) IUSHR(org.objectweb.asm.Opcodes.IUSHR) Symbols(org.sonar.java.resolve.Symbols) IF_ACMPEQ(org.objectweb.asm.Opcodes.IF_ACMPEQ) LRETURN(org.objectweb.asm.Opcodes.LRETURN) DivisionByZeroCheck(org.sonar.java.se.checks.DivisionByZeroCheck) ConstraintManager(org.sonar.java.se.constraint.ConstraintManager) ImmutableList(com.google.common.collect.ImmutableList) SymbolicValue(org.sonar.java.se.symbolicvalues.SymbolicValue) LinkedList(java.util.LinkedList) BytecodeCFG(org.sonar.java.bytecode.cfg.BytecodeCFG) NOP(org.objectweb.asm.Opcodes.NOP) SquidClassLoader(org.sonar.java.bytecode.loader.SquidClassLoader) MONITOREXIT(org.objectweb.asm.Opcodes.MONITOREXIT) Type(org.sonar.plugins.java.api.semantic.Type) ISUB(org.objectweb.asm.Opcodes.ISUB) ARRAYLENGTH(org.objectweb.asm.Opcodes.ARRAYLENGTH) DUP_X2(org.objectweb.asm.Opcodes.DUP_X2) DUP_X1(org.objectweb.asm.Opcodes.DUP_X1) AASTORE(org.objectweb.asm.Opcodes.AASTORE) SemanticModel(org.sonar.java.resolve.SemanticModel) BALOAD(org.objectweb.asm.Opcodes.BALOAD) PUTSTATIC(org.objectweb.asm.Opcodes.PUTSTATIC) ProgramPoint(org.sonar.java.se.ProgramPoint) CheckForNull(javax.annotation.CheckForNull) LMUL(org.objectweb.asm.Opcodes.LMUL) INVOKEINTERFACE(org.objectweb.asm.Opcodes.INVOKEINTERFACE) BASTORE(org.objectweb.asm.Opcodes.BASTORE) IF_ICMPNE(org.objectweb.asm.Opcodes.IF_ICMPNE) AALOAD(org.objectweb.asm.Opcodes.AALOAD) BooleanConstraint(org.sonar.java.se.constraint.BooleanConstraint) ExceptionUtils(org.sonar.java.se.ExceptionUtils) FCONST_0(org.objectweb.asm.Opcodes.FCONST_0) FCONST_1(org.objectweb.asm.Opcodes.FCONST_1) FCONST_2(org.objectweb.asm.Opcodes.FCONST_2) DCONST_0(org.objectweb.asm.Opcodes.DCONST_0) SIPUSH(org.objectweb.asm.Opcodes.SIPUSH) Set(java.util.Set) IF_ICMPLT(org.objectweb.asm.Opcodes.IF_ICMPLT) DLOAD(org.objectweb.asm.Opcodes.DLOAD) DUP(org.objectweb.asm.Opcodes.DUP) FCMPG(org.objectweb.asm.Opcodes.FCMPG) LAND(org.objectweb.asm.Opcodes.LAND) FCMPL(org.objectweb.asm.Opcodes.FCMPL) LCONST_0(org.objectweb.asm.Opcodes.LCONST_0) SASTORE(org.objectweb.asm.Opcodes.SASTORE) LALOAD(org.objectweb.asm.Opcodes.LALOAD) DCONST_1(org.objectweb.asm.Opcodes.DCONST_1) LCONST_1(org.objectweb.asm.Opcodes.LCONST_1) IOR(org.objectweb.asm.Opcodes.IOR) ObjectConstraint(org.sonar.java.se.constraint.ObjectConstraint) DSTORE(org.objectweb.asm.Opcodes.DSTORE) CALOAD(org.objectweb.asm.Opcodes.CALOAD) FMUL(org.objectweb.asm.Opcodes.FMUL) LONG_OR_DOUBLE(org.sonar.java.bytecode.se.BytecodeEGWalker.StackValueCategoryConstraint.LONG_OR_DOUBLE) I2B(org.objectweb.asm.Opcodes.I2B) IFNE(org.objectweb.asm.Opcodes.IFNE) IREM(org.objectweb.asm.Opcodes.IREM) I2C(org.objectweb.asm.Opcodes.I2C) I2D(org.objectweb.asm.Opcodes.I2D) SWAP(org.objectweb.asm.Opcodes.SWAP) I2F(org.objectweb.asm.Opcodes.I2F) IADD(org.objectweb.asm.Opcodes.IADD) ISTORE(org.objectweb.asm.Opcodes.ISTORE) Pair(org.sonar.java.se.Pair) LOOKUPSWITCH(org.objectweb.asm.Opcodes.LOOKUPSWITCH) IF_ICMPLE(org.objectweb.asm.Opcodes.IF_ICMPLE) INVOKEDYNAMIC(org.objectweb.asm.Opcodes.INVOKEDYNAMIC) LinkedHashSet(java.util.LinkedHashSet) Nullable(javax.annotation.Nullable) Logger(org.sonar.api.utils.log.Logger) IDIV(org.objectweb.asm.Opcodes.IDIV) DREM(org.objectweb.asm.Opcodes.DREM) POP(org.objectweb.asm.Opcodes.POP) SALOAD(org.objectweb.asm.Opcodes.SALOAD) ISHR(org.objectweb.asm.Opcodes.ISHR) NEWARRAY(org.objectweb.asm.Opcodes.NEWARRAY) DADD(org.objectweb.asm.Opcodes.DADD) RelationalSymbolicValue(org.sonar.java.se.symbolicvalues.RelationalSymbolicValue) ICONST_M1(org.objectweb.asm.Opcodes.ICONST_M1) ISHL(org.objectweb.asm.Opcodes.ISHL) BehaviorCache(org.sonar.java.se.xproc.BehaviorCache) LNEG(org.objectweb.asm.Opcodes.LNEG) IRETURN(org.objectweb.asm.Opcodes.IRETURN) DDIV(org.objectweb.asm.Opcodes.DDIV) ALOAD(org.objectweb.asm.Opcodes.ALOAD) FALOAD(org.objectweb.asm.Opcodes.FALOAD) GETSTATIC(org.objectweb.asm.Opcodes.GETSTATIC) LSUB(org.objectweb.asm.Opcodes.LSUB) D2F(org.objectweb.asm.Opcodes.D2F) D2I(org.objectweb.asm.Opcodes.D2I) D2L(org.objectweb.asm.Opcodes.D2L) L2D(org.objectweb.asm.Opcodes.L2D) NEW(org.objectweb.asm.Opcodes.NEW) BytecodeCFGMethodVisitor(org.sonar.java.bytecode.cfg.BytecodeCFGMethodVisitor) MULTIANEWARRAY(org.objectweb.asm.Opcodes.MULTIANEWARRAY) FADD(org.objectweb.asm.Opcodes.FADD) BIPUSH(org.objectweb.asm.Opcodes.BIPUSH) IASTORE(org.objectweb.asm.Opcodes.IASTORE) FREM(org.objectweb.asm.Opcodes.FREM) List(java.util.List) FDIV(org.objectweb.asm.Opcodes.FDIV) DRETURN(org.objectweb.asm.Opcodes.DRETURN) LXOR(org.objectweb.asm.Opcodes.LXOR) FASTORE(org.objectweb.asm.Opcodes.FASTORE) IFNONNULL(org.objectweb.asm.Opcodes.IFNONNULL) FSUB(org.objectweb.asm.Opcodes.FSUB) LUSHR(org.objectweb.asm.Opcodes.LUSHR) IF_ACMPNE(org.objectweb.asm.Opcodes.IF_ACMPNE) ProgramState(org.sonar.java.se.ProgramState) Deque(java.util.Deque) IF_ICMPGT(org.objectweb.asm.Opcodes.IF_ICMPGT) ExplodedGraphWalker(org.sonar.java.se.ExplodedGraphWalker) LDC(org.objectweb.asm.Opcodes.LDC) CHECKCAST(org.objectweb.asm.Opcodes.CHECKCAST) DUP2(org.objectweb.asm.Opcodes.DUP2) ExplodedGraph(org.sonar.java.se.ExplodedGraph) L2F(org.objectweb.asm.Opcodes.L2F) ANEWARRAY(org.objectweb.asm.Opcodes.ANEWARRAY) L2I(org.objectweb.asm.Opcodes.L2I) RETURN(org.objectweb.asm.Opcodes.RETURN) ILOAD(org.objectweb.asm.Opcodes.ILOAD) FRETURN(org.objectweb.asm.Opcodes.FRETURN) VisibleForTesting(com.google.common.annotations.VisibleForTesting) Collections(java.util.Collections) POP2(org.objectweb.asm.Opcodes.POP2) IF_ICMPGE(org.objectweb.asm.Opcodes.IF_ICMPGE) Type(org.sonar.plugins.java.api.semantic.Type) MethodBehavior(org.sonar.java.se.xproc.MethodBehavior) ProgramState(org.sonar.java.se.ProgramState) SymbolicValue(org.sonar.java.se.symbolicvalues.SymbolicValue) RelationalSymbolicValue(org.sonar.java.se.symbolicvalues.RelationalSymbolicValue) TypedConstraint(org.sonar.java.se.constraint.TypedConstraint) Constraint(org.sonar.java.se.constraint.Constraint) ProgramPoint(org.sonar.java.se.ProgramPoint) BooleanConstraint(org.sonar.java.se.constraint.BooleanConstraint) ObjectConstraint(org.sonar.java.se.constraint.ObjectConstraint)

Aggregations

List (java.util.List)3 VisibleForTesting (com.google.common.annotations.VisibleForTesting)2 Preconditions (com.google.common.base.Preconditions)2 ImmutableList (com.google.common.collect.ImmutableList)2 Lists (com.google.common.collect.Lists)2 Collections (java.util.Collections)2 Deque (java.util.Deque)2 LinkedHashSet (java.util.LinkedHashSet)2 LinkedList (java.util.LinkedList)2 Set (java.util.Set)2 Collectors (java.util.stream.Collectors)2 CheckForNull (javax.annotation.CheckForNull)2 Nullable (javax.annotation.Nullable)2 Opcodes (org.objectweb.asm.Opcodes)2 AALOAD (org.objectweb.asm.Opcodes.AALOAD)2 AASTORE (org.objectweb.asm.Opcodes.AASTORE)2 ACONST_NULL (org.objectweb.asm.Opcodes.ACONST_NULL)2 ALOAD (org.objectweb.asm.Opcodes.ALOAD)2 ANEWARRAY (org.objectweb.asm.Opcodes.ANEWARRAY)2 ARETURN (org.objectweb.asm.Opcodes.ARETURN)2