¿Cómo puedo comprobar si dos clases de Java son semánticamente idénticos?

agdev84:

Necesito combinar dos grandes proyectos similares (1000 clases). El segundo es un tenedor de la primera, y que contiene un comportamiento específico de país. Los dos proyectos divergen mucho, porque de versiones SVN se manejó muy mal.

A menudo sucede que dos clases son semánticamente idénticos. Sus códigos fuentes sólo se diferencian en cuanto a las advertencias, instrucciones de importación, el orden de algunos métodos o variables, el formato de código, comentarios, etc.

¿Hay una manera de comprobar automáticamente si dos clases son semánticamente idénticos?

Sazzadur Rahaman:

Usted debe considerar el uso de herramientas de análisis de programa como el hollín . El hollín tiene excelentes API para analizar código que es el más adecuado para su propósito. Por ejemplo, para comprobar si dos clases "semánticamente idénticos", se puede considerar (1) si ambos tienen las clases mismas (o similares campos) (2) tanto de las clases tiene mismas (o similares métodos).

Los campos que se representan como SootFielden el hollín. Usted tendrá toda la información necesaria en un SootFieldobjeto que se desea utilizar para la comparación. Para comprobar la similitud semántica de los dos métodos que puede comprobar si sus gráficas de control de flujo ( CFGS ) son similares o no (Los detalles están en la Sección 5.7 de esta guía ).

Consejos sobre cómo se puede utilizar el hollín.

Si su directorio de fuentes es srcDir, Java es Inicio javaHomey la lista de clases es classNames, a continuación, puede utilizar el siguiente fragmento de código para cargar sus clases de programación en el hollín conjunto de herramientas.

 String sootClassPath = srcDir + ":" 
            + javaHome + "/jre/lib/rt.jar:"
            +javaHome + "/jre/lib/jce.jar";

    Options.v().set_output_format(Options.output_format_jimple);
    Options.v().set_src_prec(Options.src_prec_java);

    for (String className : classNames) { // // "className" is like a.b.Myclass
        Options.v().classes().add(className);
    }

    Options.v().set_keep_line_number(true);
    Options.v().set_allow_phantom_refs(true);
    Scene.v().setSootClassPath(sootClassPath);

    Scene.v().loadBasicClasses();

Cuando se cargan sus clases, puede acceder a una clase, como a continuación:

 SootClass sClass = Scene.v().loadClassAndSupport(className); // "className" is like a.b.Myclass

Ahora se puede acceder a los campos y métodos de sClasscomo a continuación:

 Chain<SootField> fieldList =  sClass.getFields(); // import soot.util.Chain;
 List<SootMethod> methods = sClass.getMethods();

Se puede recorrer la CFG de un método, como a continuación para obtener la lista de instrucciones de la misma,

  if (method.isConcrete()) {

     List<Unit> instructionList = new ArrayList<>();

     Body b = method.retrieveActiveBody();
     DirectedGraph g = new ExceptionalUnitGraph(b);
     Iterator gitr = g.iterator();
     while (gitr.hasNext()) {
          Unit unit = (Unit) gitr.next();
          instructionList.add(unit);
     }
  }

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=137219&siteId=1
Recomendado
Clasificación