6

¿Hay algún documento que describa algún algoritmo/técnica para deducir subrutinas de un programa compilado? En otras palabras: ¿hay un algoritmo para encontrar bloques de código que aparecen más de una vez en el programa? Estos bloques podrían tener las instrucciones reordenadas (sin cambio de comportamiento del programa, por supuesto) para que sea más probable encontrar una coincidencia.Inferencia de subrutina

Este proceso puede verse como lo opuesto a la subrutina en línea que hacen los compiladores para evitar llamadas, pero aumentando el tamaño del binario.

Me parece que este es un problema teórico muy difícil.

+0

Tal vez fenris http://lcamtuf.coredump.cx/fenris/whatis.shtml o alguna otra herramienta de ingeniería inversa lo hace? – ninjalj

Respuesta

6

Bueno, es un problema interesante. La gente realmente trabajó en esto. Una búsqueda rápida devuelve estos dos:

Pero probablemente haya muchas más. Puede usar Google Scholar para encontrar artículos más recientes que hagan referencia a estos anteriores.

+0

"Extendemos este algoritmo básico relajando la noción de" idéntico "a los nombres de registros abstractos ausentes: una mejora clave al comprimir el código compilado con un asignador de registro de coloreado de gráficos ." Eso es exactamente lo que tenía en mente. Muchas gracias! – philix

3

Lo que está buscando se llama "detector de clonación". Puede hacer esto en el código fuente o en el código objeto. La idea clave es decidir qué puntos de variabilidad quieres aceptar.

Puede read about our CloneDR detector de clonación, que encuentra el código duplicado mediante la comparación de los árboles de sintaxis de los archivos fuente, encontrando coincidencias exactas y cuasimilitudes. Lo hace a través de muchos archivos en lugar de solo dentro de un archivo fuente. Esto es algo así como la detección de "subexpresión común", pero funciona tanto en declaraciones como en código ejecutable. Cuando la coincidencia no es exacta, puede determinar los parámetros para la "subrutina" (abstracción).

Consulte mi artículo en Clone Detection Using Abstract Syntax trees para obtener una descripción algorítmica.

CloneDR hace esto para muchos idiomas, usando language-precise front end parsers.

El sitio describe cómo funciona CloneDR y compara CloneDR con otras herramientas de detección de clones.

CloneDR no maneja "reordenamiento de instrucciones". Los métodos menos escalables que encuentran duplicados mediante la comparación de PDG pueden hacer esto. Estos se acercan bastante a la comparación de gráficos de flujo de datos, lo que podría ser útil para encontrar coincidencias de código de instrucción de máquina.

-1

Quizás esto sea tonto ... pero considere "diff". Básicamente hace una versión restringida de esto.