2010-04-27 18 views
17

Estoy buscando un comprobador estático gratuito para el código C99 (incluidas las extensiones GCC) con la capacidad de decir explícitamente "estas macros de preprocesador siempre están definidas".Comprobador estático gratuito para el código C99

Necesito esa última parte porque estoy compilando código incrustado para un único procesador de destino. El compilador (Microchip's C32, basado en GCC) establece una macro basada en el procesador seleccionado, que luego se utiliza en los archivos de encabezado PIC32 para seleccionar un archivo de encabezado específico del procesador para incluir. cppcheck, por lo tanto, falla porque detecta los 30 diferentes #ifdef s utilizados para seleccionar uno de los muchos procesadores PIC32 posibles, intenta analizar todas las combinaciones posibles de estos más todos los demás #define s, y falla.

Por ejemplo, si splint podría procesar código C99, me gustaría utilizar

splint -D__PIC32_FEATURE_SET__=460 -D__32MX460F512L__ \ 
-D__LANGUAGE_C__ -I/path/to/my/includes source.c 

Un problema adicional es que el compilador PIC32 cadena de herramientas se llama pic32-gcc y no sólo gcc, aunque todavía no he llegado a la punto de necesidad de dar cuenta de esto.

Actualización # 1 - Una cosa que me interesa, pero es ortogonal a esta pregunta, es la integración de Eclipse (que sería bueno no tener que escribir un makefile durante más de 30 unidades de compilación). Pregunté sobre esto en el Eclipse forums (aunque la discusión allí es más acerca de la integración en Eclipse). Nada innovador.

Actualización # 2 - acaba de intentar scan-build de clang, usando:

scan-build --use-cc=/usr/local/bin/pic32-gcc make -B -k all 

... (también sin la bandera --use-cc), pero todo lo que conseguí fue el resultado de generación típica, un ejemplo de los cuales es :

Building file: ../src/MoreMath.c 
Invoking: PIC C32 C Compiler 
pic32-gcc -D__DEBUG -I/usr/local/pic32-libs/include -O0 -Wall -c -fmessage-length=0 -std=gnu99 -Werror-implicit-function-declaration -MMD -MP -MF"src/MoreMath.d" -MT"src/MoreMath.d" -mprocessor=32MX460F512L -D__DEBUG -g -o"src/MoreMath.o" "../src/MoreMath.c" 
Finished building: ../src/MoreMath.c 

... y al final:

Building target: MyBinary.elf 
Invoking: PIC C32 C Linker 
pic32-gcc -Wl,-Map,MyBinary.map -mprocessor=32MX460F512L --defsym=__MPLAB_DEBUG=1 -o"MyBinary.elf" <<ALL OF MY *.o FILES HERE>> 
Finished building target: MyBinary.elf 

scan-build: Removing directory '/tmp/scan-build-2010-06-21-1' because it contains no reports. 

Por lo tanto, mi código es perfecto según scan-build, o no está haciendo nada. No estoy seguro de qué tan buena prueba podría ser para ver si funciona.

+0

Debe agregar su estipulación para ser utilizada en Eclipse a su pregunta si ese es realmente un requisito para su solución. –

+0

No, sería una ventaja añadida. Editaré la pregunta para que quede más claro. Todavía estoy tratando de hacer que 'scan-build' trabaje con la cadena de herramientas PIC32, y si lo hago, aceptaré la respuesta a continuación. – detly

+0

@ Adam Davis - Iba a modificar la pregunta para enfatizar mejor mi uso de la cadena de herramientas PIC32, pero no sé si esto interferirá con tu motivación para poner una recompensa. Avísame si quieres que espere. – detly

Respuesta

5

Clang's static analyzer debería funcionar.

Otra opción con el código fuente #defines es que podría ejecutar cpp sobre el código fuente con algunas de las declaraciones del preprocesador, y luego ejecutar ese código resultante a través de un analizador estático.

+0

Creo que 'scan-build' es lo mejor que puedo obtener. Estoy desarrollando bajo Eclipse y usando el constructor interno (es decir, sin makefile explícito), y no creo que haya ninguna integración clang para Eclipse CDT. Podría valer la pena cambiar a un proyecto basado en el archivo MAKE. – detly

+0

Lamentablemente, no veo la manera de hacer que 'scan-build' (o cualquier herramienta de Clang) funcione con Eclipse. – detly

+2

@detly: ¿Por qué en la Tierra es un programador de C hábil como usted ligado a una abominación impía como Eclipse? –

3

sólo podría añadir algo de código como este a la parte superior de la cabecera que garantiza que se define:

#ifndef MACRO_I_NEED 
#error "MACRO_I_NEED should be defined" 
#define MACRO_I_NEED // to appease cppcheck 
#endif 
+1

¿No necesitaría hacer eso para cada archivo de código fuente sin embargo? – detly

+1

@detly: no necesariamente: si tiene un archivo de encabezado que incluye cada archivo (como un encabezado precompilado), puede ponerlo en la parte superior. –

1

Esto no se puede dar directamente la solución, pero es posible considerar la posibilidad de una mirada a Coverity, que es un analizador de sintaxis estático patentado, pero que es gratuito para los proyectos de SO. ¡Debería hacer el trabajo relacionado con sus necesidades!

¡Salud!

+0

No es un proyecto de OSS. – detly

1

Puede usar una herramienta como sunifdef para preprocesar parcialmente el código fuente de acuerdo con las macros definidas asumidas.Tendría que hacer copias de los encabezados del sistema y de la biblioteca que se ven afectados por esas definiciones y procesarlas también. Luego, al hacer el análisis estático, debe especificar una ruta de inclusión diferente que apunte a sus encabezados ya procesados.

+0

Coan (http://coan2.sourceforge.net/) parece ser la última bifurcación/extensión del conjunto de herramientas unifdef –

2

En lugar de utilizar scan-build con clang, ¡considere intercambiar gcc por completo! El soporte C de Clang es estable (y hace todo lo posible para emular gcc), y debería manejar su código perfectamente.

¡Pruebe algo como make -j3 CC=clang y vea qué pasa!

PS. Esa sintaxis puede ser totalmente incorrecta. No he usado makefiles en años (CMake es sorprendente por cierto).

+2

cmake es horrible! –

+0

No es compatible con la opción '-MT', lo que significa que tengo que reescribir muchos makefiles. Actualmente, la compilación utiliza archivos de autodependencia, archivos '.d', que contienen las dependencias del encabezado para cada archivo' .o'. Pasará un tiempo antes de que pueda probar esto. – detly

+0

@detly, genera los archivos de dependencia y corta su manejo (en su mayoría, plantillas, supongo) en tu Makefile)? – vonbrand

2

Según los análisis reales que desee ejecutar en su código, puede consultar Frama-C. Utiliza el preprocesador C que le indique, para que pueda usar el CPP de PIC32 si lo desea.

Cuestiones relacionadas