@Override public void visitFile(Path file, String 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 | ClassReader.EXPAND_FRAMES | ClassReader.SKIP_FRAMES); 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))); } } } } } });
cr.accept(new CheckClassAdapter(ca), ClassWriter.COMPUTE_MAXS); boolean failed = false;
@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; 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); } } }
public DetectIgnoredCodeClassVisitor(ClassVisitor cv, boolean ignoreTrivial, Set<String> ignoreAnnotations) { super(Opcodes.ASM4, new CheckClassAdapter(cv, false)); this.ignoreTrivial = ignoreTrivial; this.ignoreAnnotations = ignoreAnnotations; }
/** * @param cv - a listener for code-instrumentation events * @param ignoreRegexp - list of patters of method calls that should be ignored from line-coverage-measurement * @param duplicatedLinesMap - map of found duplicates in the class. You should use {@link DetectDuplicatedCodeClassVisitor} to find the duplicated lines. */ public AbstractFindTouchPointsClassInstrumenter(ClassVisitor cv, Collection<Pattern> ignoreRegexp, Map<Integer, Map<Integer, Integer>> duplicatedLinesMap) { super(Opcodes.ASM4, new CheckClassAdapter(cv, false)); this.ignoreRegexp = ignoreRegexp; this.duplicatedLinesMap = duplicatedLinesMap; }
public DetectIgnoredCodeClassVisitor(ClassVisitor cv, boolean ignoreTrivial, Set<String> ignoreAnnotations) { super(Opcodes.ASM4, new CheckClassAdapter(cv, false)); this.ignoreTrivial = ignoreTrivial; this.ignoreAnnotations = ignoreAnnotations; }
/** * @param cv - a listener for code-instrumentation events * @param ignoreRegexp - list of patters of method calls that should be ignored from line-coverage-measurement * @param duplicatedLinesMap - map of found duplicates in the class. You should use {@link DetectDuplicatedCodeClassVisitor} to find the duplicated lines. */ public AbstractFindTouchPointsClassInstrumenter(ClassVisitor cv, Collection<Pattern> ignoreRegexp, Map<Integer, Map<Integer, Integer>> duplicatedLinesMap) { super(Opcodes.ASM4, new CheckClassAdapter(cv, false)); this.ignoreRegexp = ignoreRegexp; this.duplicatedLinesMap = duplicatedLinesMap; }
public static void checkClass(byte[] classfileBuffer) { ClassReader cr2 = new ClassReader(classfileBuffer); CheckClassAdapter check = new CheckClassAdapter(new ClassWriter( ClassWriter.COMPUTE_MAXS)); cr2.accept(check, ClassReader.SKIP_FRAMES); } }
public static byte[] compile(MessageBundle bundle, String parentClassName, String className) { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); CheckClassAdapter ca = new CheckClassAdapter(cw, true); compile(ca, bundle, parentClassName, className); return cw.toByteArray(); }
@Override protected ClassVisitor classVisitorFactory(ClassWriter cw) { ClassVisitor cc = new CheckClassAdapter(cw); return new PossibilitiesRicClassAdapter(cc, mpc); } }
@Override protected ClassVisitor classVisitorFactory(ClassWriter cw) { ClassVisitor cc = new CheckClassAdapter(cw); return new NegateJumpsPossibilitiesClassAdapter(cc, mpc); } }
@Override protected ClassVisitor classVisitorFactory(ClassWriter cw) { ClassVisitor cc = new CheckClassAdapter(cw); return new PossibilitiesRicClassAdapter(cc, mpc); } }
@Override protected ClassVisitor classVisitorFactory(ClassWriter cw) { ClassVisitor cc = new CheckClassAdapter(cw); return new PossibilitiesArithmeticReplaceClassAdapter(cc, mpc); } }
@Override protected ClassVisitor classVisitorFactory(ClassWriter cw) { ClassVisitor cc = new CheckClassAdapter(cw); return new MonitorRemovePossibilitiesClassAdapter(cc, mpc); }
public static byte[] compile(MessageBundle bundle, String parentClassName, String className) { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); CheckClassAdapter ca = new CheckClassAdapter(cw, true); compile(ca, bundle, parentClassName, className); return cw.toByteArray(); }
static byte[] instrumentClass(MethodDatabase db, byte[] data, boolean check) { ClassReader r = new ClassReader(data); ClassWriter cw = new DBClassWriter(db, r); ClassVisitor cv = check ? new CheckClassAdapter(cw) : cw; InstrumentClass ic = new InstrumentClass(cv, db, false); r.accept(ic, ClassReader.SKIP_FRAMES); return cw.toByteArray(); }
@Override protected ClassVisitor classVisitorFactory(ClassWriter cw) { ClassVisitor cc = new CheckClassAdapter(cw); cc = new TraceClassVisitor(cc, new PrintWriter(System.out)); return new PossibilitiesRicClassAdapter(cc, mpc); } }
@Override protected ClassVisitor classVisitorFactory(ClassWriter cw) { ClassVisitor cc = new CheckClassAdapter(cw); cc = new TraceClassVisitor(cc, new PrintWriter(System.out)); return new RicClassAdapter(cc); } }
private static byte[] generateClass(String internalClassName, Type testClassType, int iThread, List<Actor> actors, List<Object> objArgs, boolean waitsEnabled) { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); CheckClassAdapter cca = new CheckClassAdapter(cw, false); cca.visit(52, ACC_PUBLIC + ACC_SUPER, internalClassName, null, TEST_THREAD_EXECUTION_TYPE.getInternalName(), null); generateConstructor(cca); generateRun(cca, testClassType, iThread, actors, objArgs, waitsEnabled); cca.visitEnd(); return cw.toByteArray(); }
public static void debugByteCode(ClassDefinition classDefinition, PrintWriter writer) { ClassReader reader = new ClassReader(classDefinition.getBytecode()); reader.accept(new CheckClassAdapter(new TraceClassVisitor(writer)), 0); File file = new File("/tmp/" + classDefinition.getInternalName() + ".class"); file.getParentFile().mkdirs(); writer.println(file); writer.flush(); try { ByteStreams.write(classDefinition.getBytecode(), Files.newOutputStreamSupplier(file)); } catch (IOException e) { e.printStackTrace(); } }