Example usage for org.objectweb.asm.tree.analysis BasicVerifier BasicVerifier

List of usage examples for org.objectweb.asm.tree.analysis BasicVerifier BasicVerifier

Introduction

In this page you can find the example usage for org.objectweb.asm.tree.analysis BasicVerifier BasicVerifier.

Prototype

public BasicVerifier() 

Source Link

Document

Constructs a new BasicVerifier for the latest ASM API version.

Usage

From source file:com.googlecode.dex2jar.test.TestUtils.java

License:Apache License

@SuppressWarnings("rawtypes")
public static void verify(final ClassReader cr, PrintWriter out)
        throws AnalyzerException, IllegalArgumentException, IllegalAccessException {
    ClassNode cn = new ClassNode();
    cr.accept(new CheckClassAdapter(cn, false), ClassReader.SKIP_DEBUG);

    List methods = cn.methods;// ww  w.  j a v  a 2  s  .co m

    for (int i = 0; i < methods.size(); ++i) {
        MethodNode method = (MethodNode) methods.get(i);

        List tryCatchBlocks = method.tryCatchBlocks;
        for (int j = 0; j < tryCatchBlocks.size(); j++) {
            TryCatchBlockNode tcn = (TryCatchBlockNode) tryCatchBlocks.get(j);
            if (tcn.start.equals(tcn.end)) {
                throw new DexException("try/catch block %d in %s has same start(%s) and end(%s)", j,
                        method.name, tcn.start.getLabel(), tcn.end.getLabel());
            }
        }

        BasicVerifier verifier = new BasicVerifier();
        Analyzer a = new Analyzer(verifier);
        try {
            a.analyze(cn.name, method);
        } catch (Exception e) {
            out.println(cr.getClassName() + "." + method.name + method.desc);
            printAnalyzerResult(method, a, out);
            e.printStackTrace(out);
            out.flush();
            throw new DexException("method " + method.name + " " + method.desc, e);
        }
    }
}

From source file:com.googlecode.dex2jar.tools.AsmVerify.java

License:Apache License

@Override
protected void doCommandLine() throws Exception {
    if (remainingArgs.length < 1) {
        usage();/* www . ja  v  a2 s. c  om*/
        return;
    }

    List<Path> files = new ArrayList<>();
    for (String fn : remainingArgs) {
        Path file = new File(fn).toPath();
        if (!Files.exists(file)) {
            System.err.println(fn + " is not exists");
            usage();
            return;
        }
        files.add(file);
    }

    for (Path file : files) {
        System.out.println("verify " + file);
        walkJarOrDir(file, new FileVisitorX() {
            @Override
            public void visitFile(Path file, Path relative) throws IOException {
                if (file.getFileName().toString().endsWith(".class")) {
                    ClassReader cr = new ClassReader(Files.readAllBytes(file));
                    ClassNode cn = new ClassNode();
                    cr.accept(new CheckClassAdapter(cn, false), ClassReader.SKIP_DEBUG);
                    for (MethodNode method : cn.methods) {
                        BasicVerifier verifier = new BasicVerifier();
                        Analyzer<BasicValue> a = new Analyzer<>(verifier);
                        try {
                            a.analyze(cn.name, method);
                        } catch (Exception ex) {
                            System.err.println("Error verify method " + cr.getClassName() + "." + method.name
                                    + " " + method.desc);
                            if (detail) {
                                ex.printStackTrace(System.err);
                                printAnalyzerResult(method, a, new PrintWriter(
                                        new OutputStreamWriter(System.err, StandardCharsets.UTF_8)));
                            }
                        }
                    }
                }
            }
        });
    }
}

From source file:de.unisb.cs.st.javaslicer.tracer.instrumentation.Transformer.java

License:Open Source License

private boolean checkClass(final byte[] newClassfileBuffer, final String classname,
        byte[] origClassfileBuffer) {
    final ClassNode cn = new ClassNode();
    final ClassReader cr = new ClassReader(newClassfileBuffer);
    //cr.accept(new CheckClassAdapter(cn), ClassReader.SKIP_DEBUG);
    cr.accept(new CheckClassAdapter(cn), 0);

    for (final Object methodObj : cn.methods) {
        final MethodNode method = (MethodNode) methodObj;
        final Analyzer a = new Analyzer(new BasicVerifier());
        // SimpleVerifier has problems with sub-classes, e.g. you cannot use PrintStream for Appendable and so on...
        //final Analyzer a = new Analyzer(new SimpleVerifier(
        //    Type.getObjectType(cn.name), Type.getObjectType(cn.superName),
        //    (cn.access & Opcodes.ACC_INTERFACE) != 0));
        try {//  ww  w  .j a  v  a2s .  c o m
            a.analyze(cn.name, method);
        } catch (final AnalyzerException e) {
            System.err.println("Error in method " + classname + "." + method.name + method.desc + ": " + e);
            //e.printStackTrace(System.err);
            printMethod(a, System.err, method);
            if (newClassfileBuffer == origClassfileBuffer) {
                System.err.println("This is the original bytecode!");
            } else {
                System.err.println("original bytecode:");
                ClassReader origClassReader = new ClassReader(origClassfileBuffer);
                ClassNode origClassNode = new ClassNode();
                origClassReader.accept(origClassNode, 0);
                for (Object origMethodObj : origClassNode.methods) {
                    MethodNode origMethod = (MethodNode) origMethodObj;
                    if (origMethod.name.equals(method.name) && origMethod.desc.equals(method.desc))
                        printMethod(System.err, origMethod);

                }
            }
            return false;
        }
    }
    return true;
}

From source file:de.unisb.cs.st.javaslicer.tracer.instrumentation.Transformer.java

License:Open Source License

@SuppressWarnings("unused")
private static void printClass(final byte[] classfileBuffer, final String classname) {
    /*//from  ww  w . j  a v a 2 s.co  m
    final TraceClassVisitor v = new TraceClassVisitor(new PrintWriter(System.out));
    new ClassReader(classfileBuffer).accept(v, ClassReader.SKIP_DEBUG);
    */
    final ClassNode cn = new ClassNode();
    final ClassReader cr = new ClassReader(classfileBuffer);
    //cr.accept(new CheckClassAdapter(cn), ClassReader.SKIP_DEBUG);
    cr.accept(new CheckClassAdapter(cn), 0);

    for (final Object methodObj : cn.methods) {
        final MethodNode method = (MethodNode) methodObj;
        final Analyzer a = new Analyzer(new BasicVerifier());
        //final Analyzer a = new Analyzer(new SimpleVerifier());
        try {
            a.analyze(cn.name, method);
        } catch (final AnalyzerException e) {
            System.err.println("// error in method " + classname + "." + method.name + method.desc + ":" + e);
        }
        printMethod(a, System.err, method);
    }
}

From source file:pku.sei.checkedcoverage.tracer.instrumentation.Transformer.java

License:Creative Commons License

private boolean checkClass(final byte[] newClassfileBuffer, final String classname) {
    final ClassNode cn = new ClassNode();
    final ClassReader cr = new ClassReader(newClassfileBuffer);
    //cr.accept(new CheckClassAdapter(cn), ClassReader.SKIP_DEBUG);
    cr.accept(new CheckClassAdapter(cn), 0);

    for (final Object methodObj : cn.methods) {
        final MethodNode method = (MethodNode) methodObj;
        final Analyzer a = new Analyzer(new BasicVerifier());
        // SimpleVerifier has problems with sub-classes, e.g. you cannot use PrintStream for Appendable and so on...
        //final Analyzer a = new Analyzer(new SimpleVerifier(
        //    Type.getObjectType(cn.name), Type.getObjectType(cn.superName),
        //    (cn.access & Opcodes.ACC_INTERFACE) != 0));
        try {//  www  . j a  v a 2s. c  o m
            a.analyze(cn.name, method);
        } catch (final AnalyzerException e) {
            System.err.println("Error in method " + classname + "." + method.name + method.desc + ":");
            e.printStackTrace(System.err);
            printMethod(a, System.err, method);
            return false;
        }
    }
    return true;
}