Fundamento: En mi desarrollo de código del día a día, C++, frecuencia necesito responder a preguntas básicas como quién llama a lo que en un gran código C++ base que está cambiando frecuentemente. Pero, también necesito tener alguna forma automática para identificar exactamente lo que el código está haciendo alrededor de un área de código particular . Las herramientas "grep" como Cscope son útiles (y las uso mucho), pero no son C++ - sensibles al lenguaje: no dan ninguna forma de identificar los tipos y tipos de entorno léxico de un uso dado de un tipo o función de tal manera que sea propicio para la automatización (incluso si dicha automatización está limitada a operaciones de "solo lectura" tales como exploración y navegación de códigos, pero estoy pidiendo mucho más que eso a continuación).de código abierto C++ exploración de la biblioteca
Pregunta: ¿Tiene ya existe un código abierto de C/C++ - biblioteca basada (nativo, no se logró, no por Microsoft o Linux-específica) de código que puede escanear de forma estática o analizar un gran árbol de C++ , y puede producir conjuntos de resultados que responden a las preguntas detalladas, tales como:
- ¿Qué funciones son llamados por alguna función suministrada?
- ¿Qué funciones hacen uso de este tipo suministrado?
- Responda a las preguntas anteriores si se trata de clases C++ o plantillas de clase.
El conjunto de resultados debe proporcionar algún tipo de "control". Debería ser capaz de alimentar a que manejar de nuevo a la biblioteca para realizar los siguientes tipos de introspección:
- ¿Cuál es el desplazamiento dentro del fichero donde se hizo la referencia de bytes?
- ¿Cuál es la referencia al árbol de sintaxis abstracta (AST) de esa referencia , de modo que pueda inspeccionar las construcciones del código circundante? Y cada entidad AST también tendría datos de tipografía de ruta de archivo, byte-offset y asociados, de modo que podría caminar recíprocamente en el gráfico de los llamadores o referentes para realizar operaciones útiles.
La respuesta debe cumplir con los siguientes requisitos:
- API: La API expuesta debe ser uno de los siguientes:
- C o C++ y probablemente es "mango C" o C++ -class-instance-based (y si lo es, debe ser código C o C++ genérico y no Microsoft- o construcciones de código específicas de Linux a menos que sea para conocer los detalles de la plataforma dada), o
- Entrada estándar de línea de comandos y salida estándar.
- C++ conscientes: no se limita al código C, pero entiende lenguaje C++ construcciones en detalle incluyendo la conciencia de clase entre relaciones de herencia y las plantillas de C++.
- Rápido: Debe escanear bases de código grande significativamente más rápido que compilando todo el código base desde cero. Esto probablemente necesite relajar, pero solo si Recuperación de resultados incrementales y Resiliente a pequeños cambios de código Los requisitos se cumplen completamente a continuación.
- Proporcionar Resultado cuenta: yo debería ser capaz de preguntar "¿Cuántos resultados le proporcionará a alguna petición (y no no me permite enviar todos los resultados )?" que responde en el orden de menos de 3 segundos versus teniendo que recuperar todos los resultados para cualquier pregunta dada. Si toma demasiado tiempo para obtener esa respuesta, entonces desperdicia tiempo de desarrollo. Esto es junto con el siguiente requisito.
- recuperación resultado incremental: yo debería ser capaz de entonces pedir "Dame sólo los siguientes N resultados de esta solicitud", y luego un identificador para el resultado puse para que pueda hacer la pregunta en varias ocasiones, por lo tanto incrementalmente sacando los resultados en etapas. Esto significa que I no debería tener que esperar todo el conjunto de resultados antes de ver algún subconjunto de todos los resultados. Y que puedo cancelar la operación de forma segura si he visto suficientes resultados. Motivo: Necesito responder a la pregunta: "¿Cuál es el impacto de compilación o desarrollo de al cambiar alguna firma de función particular?"
- resistente al código de pequeños cambios: Si cambio de un encabezado o fuente archivo, que no debería tener que esperar a que todo el código base para ser analizados de nuevo , sino sólo que el archivo de cabecera o fuente de rescanned. La nueva exploración debe ser rápida. Por ejemplo, no haga lo que cscope requiere que haga, que es volver a examinar toda la base de códigos para pequeños cambios. Se entiende que si cambia un encabezado, entonces el escaneo puede tomar más tiempo ya que otros archivos que incluyen ese encabezado tendrían que volver a escanearse.
- IDE Agnóstico: ¿Es editor de texto agnóstico (no me hagas usar un editor de texto específico , he hecho mi elección ya, gracias!)
- independiente de la plataforma: ¿Es independiente de la plataforma (no me hagas usarlo solo en Linux o solo en Windows, ya que tengo que usar ambas plataformas en mi rutina diaria, pero necesito que la herramienta sea útil en ya que tengo sandboxes de código en ambas plataformas)
- No binario: No debería costar nada más que tiempo para descargar y compilar la biblioteca y todas sus dependencias.
- No prueba-ware.
- apoyado activamente: Es probable que el envío de solicitudes de ayuda a las listas de correo o foros asociados es probable que obtenga una respuesta en menos de 2 días .
- red agnóstica: Bases de datos de la biblioteca se construye debe ser capaz de ser utilizado directamente en una red de sistemas de 32 bits y 64 bits, Linux y Windows indistintamente, al mismo tiempo, y no incrustar codificado rutas a sistemas de archivos que de otra manera "enraizarían" la base de datos a una red particular .
- entorno de construcción agnóstico: No requiere conocimiento íntimo de mi entorno de construcción, con la excepción notable de requerir posiblemente el conocimiento del compilador suministrados CPP macro definiciones (por ejemplo -Dmacro = valor).
Esta pregunta parece que compraría algo que se ajuste a sus especificaciones ... pero no, la quiere gratis :) ¿O qué quiere decir con "código abierto" en realidad? –
No creo que el análisis estático sea lo que realmente desea. El análisis estático consiste en buscar invariantes del programa e informar posibles errores en los programas. Lo que quieres es indexar. –
@ matthieu-m: Tiene toda la razón. Desde entonces eliminé el "análisis estático" en el título. – bgoodr