linux kernel - nucleo - Generación de gráfico de llamada estática para el kernel de Linux
linux kernel version (1)
Hemos hecho análisis de puntos globales (con punteros de función indirecta) y construcción de gráficos de llamada completa de sistemas C monolíticos de 26 millones de líneas (18,000 unidades de compilación).
Lo hicimos usando nuestro DMS Software Reengineering Toolkit , su C Front End y su maquinaria asociada de análisis de flujo . La maquinaria de análisis de puntos (y los otros análisis) son conservadores; sí, obtienes algunos puntos falsos y, por lo tanto, llamas bordes como consecuencia. Estos son bastante difíciles de evitar Puede ayudar a tales analizadores proporcionando ciertos datos cruciales sobre las funciones clave, y aprovechando conocimientos como "los sistemas integrados [y los sistemas operativos] tienden a no tener ciclos en el gráfico de llamadas", lo que significa que puede eliminar algunos de estos. Por supuesto, debes permitir excepciones; mi moral: "en los sistemas grandes, todo sucede".
El problema particular incluía los módulos C cargados dinámicamente (!) Usando un esquema de carga especial específico para este software en particular, pero eso simplemente se agregó al problema.
Los lanzamientos en punteros de función no deben perder bordes; un análisis conservador debería simplemente asumir que el puntero de conversión coincide con cualquier función en el sistema con la firma correspondiente al resultado arrojado. Más problemáticos son los moldes que producen firmas de tipo compatible; si lanza un puntero de función a void * foo (uint) cuando la función real a la que se llama acepta un int, los puntos para el análisis elegirán de forma conservadora las funciones incorrectas. No puedes culpar al analizador por eso; el reparto yace en ese caso. Sí, vimos este tipo de basura en el sistema de 26 millones de líneas.
Esta es ciertamente la escala correcta para analizar Linux (que creo que es solo de 8 millones de líneas más o menos :-). Pero no lo hemos probado específicamente en Linux.
La configuración de esta herramienta es complicada porque debe capturar todos los detalles sobre las compilaciones en sí, y en particular la configuración del kernel de Linux que desea generar. Así que tienes que interceptar las llamadas del compilador para obtener los conmutadores de línea de comando, etc.
Estoy buscando una herramienta para generar de forma estática un gráfico de llamadas del kernel de Linux (para una configuración de kernel dada). El gráfico de llamadas generado debe ser "completo", en el sentido de que todas las llamadas están incluidas, incluidas las potenciales indirectas, que podemos suponer que solo se realizan mediante el uso de punteros de función en el caso del kernel de Linux.
Por ejemplo, esto podría hacerse analizando los tipos de puntero a función: este enfoque daría lugar a bordes superfluos en el gráfico, pero eso está bien para mí.
ncc parece implementar esta idea, sin embargo, no tuve éxito en hacerlo funcionar en el kernel 3.0. ¿Cualquier otra sugerencia?
Supongo que este enfoque también podría dar lugar a que falten bordes en los casos en que se utilizan moldes de punteros de función, por lo que también me interesaría saber si esto es probable en el kernel de Linux.
Como nota al margen, parece haber otras herramientas que pueden hacer análisis semánticos de la fuente para inferir valores de punteros potenciales, pero AFAICT, ninguno de ellos está diseñado para ser utilizado en un proyecto como el kernel de Linux.
Cualquier ayuda sería muy apreciada.