2011-07-22 10 views
19

Me encanta el análisis estático y las comprobaciones en tiempo de compilación, casi como una falla, pero la mayor parte de mi trabajo diario está en Objective-C. Para resolver esta tensión, me gustaría poder escribir mis propias herramientas de análisis que puedo ejecutar en mis proyectos de Objective-C.Análisis del código Objective-C para análisis estático

Pero buscar en Google sugiere que las personas tienen dificultades para armar una gramática completa de Objective-C. One site básicamente recomienda darse por vencido.

Encontré una gramática on the ANTLR website, pero cuando la encendí, no conseguí analizar nada. Por ejemplo, se respondió a la línea:

void x(); 

con src/main/resources/somecode.m line 1:0 no viable alternative at input 'void'

:(

Me tomó un vistazo más de cerca a la gramática y encontré la siguiente renuncia desalentador:

it's a work in progress, most of the .h file can be parsed 

Pero necesito algo que pueda analizar tanto la interfaz como la implementación.

¿Hay alguna gramática completa de Objective-C 2.0 en alguna parte? Prefiero algo que pueda funcionar con Scala (así que cualquier cosa compatible con Java, como ANTLR, sería perfecto), pero en este punto estaría dispuesto a adaptar algo diseñado para otro paquete de herramientas de analizador.

+0

gcc puede compilar los programas de Objective-C (suponiendo que no esté utilizando la API de Apple), por lo que debería haber una gramática en alguna parte de la fuente de gcc, ¿no es así? - Oh, veo que tu primer enlace habla de eso. – JAB

Respuesta

16

Como mencionaron otros, Clang sería la solución correcta. Puede proporcionar sus propios consumidores de AST, es decir, clases que se invocarán al pasar por AST, sin tener que preocuparse por el análisis ni por la gramática.

Clang admite Objective-C en su totalidad, y ya hay muchas clases en el analizador estático con las que puede modelar sus propias comprobaciones. (en clang/lib/StaticAnalyzer/Checkers).

Ese directorio contiene una gran cantidad de comprobadores de analizadores estáticos, pero también puede crear un consumidor normal de AST. Consulte http://code.google.com/p/chromium/wiki/WritingClangPlugins para obtener más información.

6

Clang es una herramienta de análisis estático que admite Objective-C. Lo he encontrado muy útil en el pasado.

http://clang-analyzer.llvm.org/

+0

Sí, sé de clang.Pero quiero algo que sea fácilmente extensible y que me permita escribir mis propios programas para analizar el AST. – Bill

+2

@Bill: ¿Eso es para ser irónico? Uno de los principales [puntos de venta] de clang (http://clang.llvm.org/features.html#libraryarch) es su arquitectura basada en librerías y fácil de ampliar. –

+0

@Sedate: No, por supuesto que no. Pensé que se suponía que clang sería más fácil para los escritores de compilación extenderse: no sabía que podrías escribir programas de controlador sencillos para recorrer el AST. – Bill

4

sonido metálico es extensible; puede ampliar su análisis estático existente o crear el suyo propio. llvm/clang está diseñado como una serie de bibliotecas a las que puedes vincular (dinámicamente o estáticamente). Un gran punto de partida es el migrador ARC (recuento automático de referencias) library, que se encarga de analizar estáticamente y reescribir código objetivo-c.

arcmt-test es un pequeño programa de ejemplo que consume la biblioteca de migradores de ARC.

1

Puede usar OCDepend, es una herramienta de análisis estático basada en Clang que simplifica la gestión de la calidad del código Objective-C y proporciona un marco de consulta de código altamente flexible.

Cuestiones relacionadas