A method of generating a program control flow definition from the program
code determines entry points in the program. The code is followed, or
scanned, from an entry point to a branch or jump instruction, or control
flow instruction. A code block is then defined as the code from the entry
point up to and including the control flow instruction. From the control
flow instruction, additional entry points are identified. This is repeated
for each entry point having a known value, resulting in a partial control
flow definition. For entry points having unknown values, a constant
propagation analysis is performed on the partial control flow definition
to convert unknown entry point values to known values. Finally, the entry
points determined by the constant propagation analysis are used as
starting points in the scanning step to define additional entry points.
The steps of scanning from known block entry points to determine
additional points and using constant propagation for determining
additional block entry points for unknown values are repeated to extend
the control flow definition. Constant propagation is only used when there
are no known block entry points. Heuristics may be used to determine
certain unknown values. In addition, a knowledge of the operating system
under which the program is running may be used to determine certain
unknown values. A preferred embodiment is implemented with a block
worklist which comprises a list of all known blocks within the program and
which defines the partial control flow for the computer program during
analysis, and the complete control flow upon completion of analysis. A
block entry worklist comprises a list of all known block entry points
whose blocks are unknown, such that each block entry point in the block
entry worklist is analyzed.
Un método de generar una definición del flujo del control de programa del código del programa determina puntos de entrada en el programa. El código se sigue, o se explora, de un punto de entrada a una instrucción del rama o de salto, o a la instrucción del flujo del control. Un bloque del código entonces se define como el código del punto de entrada hasta y de incluir la instrucción del flujo del control. De la instrucción del flujo del control, se identifican los puntos de entrada adicional. Esto se repite para cada punto de entrada que tiene un valor conocido, dando por resultado una definición parcial del flujo del control. Para los puntos de entrada que tienen valores desconocidos, un análisis constante de la propagación se realiza en la definición parcial del flujo del control para convertir valores desconocidos del punto de entrada a los valores conocidos. Finalmente, los puntos de entrada determinados por el análisis constante de la propagación se utilizan como puntos de partida en el paso de la exploración para definir puntos de entrada adicional. Los pasos de la exploración de puntos de entrada sabidos del bloque para determinar puntos adicionales y de usar la propagación constante para determinar los puntos de entrada adicionales del bloque para los valores desconocidos se repiten para ampliar la definición del flujo del control. La propagación constante se utiliza solamente cuando no hay puntos de entrada sabidos del bloque. La heurística se puede utilizar para determinar ciertos valores desconocidos. Además, un conocimiento del sistema operativo bajo el cual el programa está funcionando se puede utilizar para determinar ciertos valores desconocidos. Una encarnación preferida se pone en ejecucio'n con un worklist del bloque que abarque una lista de todos los bloques sabidos dentro del programa y que defina el flujo parcial del control para el programa de computadora durante análisis, y el flujo completo del control sobre la terminación del análisis. Un worklist de la entrada del bloque abarca una lista de todos los puntos de entrada sabidos del bloque que bloques sean desconocidos, tales que cada punto de entrada del bloque en el worklist de la entrada del bloque está analizado.