objective-c xcode4 clang clang-static-analyzer

objective c - ¿Es posible suprimir las advertencias del analizador estático Xcode 4?



objective-c xcode4 (4)

Eche un vistazo a esta página que muestra cómo usar varias # definiciones para anotar métodos y parámetros de Object-c para ayudar al analizador estático (clang) a hacer lo correcto.

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

Desde esa página:

La interfaz de Clang admite varias anotaciones de nivel de fuente en forma de atributos y pragmas de estilo GCC que pueden ayudar a que el uso del Analizador estático Clang sea más útil. Estas anotaciones pueden ayudar a suprimir los falsos positivos y mejorar la capacidad del analizador para detectar errores.

El analizador estático Xcode 4 informa en mi código algunos falsos positivos. ¿Hay alguna forma de suprimirlos?


Encontré una solución: los falsos positivos (como el patrón de diseño singleton de Apple) se pueden evitar con:

#ifndef __clang_analyzer__ // Code not to be analyzed #endif

El analizador no analizará el código entre esas directivas de preprocesador.


Vea mi respuesta here . Puede agregar un indicador de compilación a los archivos y el analizador estático los ignorará. Probablemente sea mejor para el código de terceros que no le preocupa, y no para el código de la primera parte que está escribiendo.


la mayoría de las veces, usar cosas como CF_RETURNS_RETAINED y seguir la regla ''crear'' me funciona, pero me topé con un caso que NO pude suprimir. Finalmente encontró una forma de suprimir el analizador mirando el código fuente de llvm:

https://llvm.org/svn/llvm-project/cfe/trunk/test/ARCMT/objcmt-arc-cf-annotations.m.result

"Prueba para ver si suprimimos un error cuando almacenamos el puntero en un global".

static CGLayerRef sSuppressStaticAnalyzer; static CGLayerRef sDmxImg[2][2][1000]; // a cache of quartz drawings. CGLayerRef CachedDmxImg(...) // which lives for lifetime of app! { ... CGLayerRef img = sDmxImg[isDefault][leadingZeroes][dmxVal]; if ( !img ) { NSRect imgRect = <some cool rectangle>; [NSGraphicsContext saveGraphicsState]; CGContextRef ctx = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; CGLayerRef cgLayerRef = CGLayerCreateWithContext(ctx, imgRect.size, NULL); CGContextRef layerCtx = CGLayerGetContext(cgLayerRef); [NSGraphicsContext setCurrentContext: [NSGraphicsContext graphicsContextWithGraphicsPort:layerCtx flipped:YES]]; ... draw some gorgeous expensive Quartz stuff ... img = cgLayerRef; sDmxImg[isDefault][leadingZeroes][dmxVal] = cgLayerRef; sSuppressStaticAnalyzer = cgLayerRef; // suppress static analyzer warning! [NSGraphicsContext restoreGraphicsState]; } return img; }

Por alguna razón, la asignación a una matriz estática no suprimió la advertencia, pero la asignación a un antiguo estático ''sSuppressStaticAnalyzer'' sí lo hace . Por cierto, el método anterior, el uso de CGLayerRef es la forma más rápida que he encontrado para volver a dibujar las imágenes en caché (además de OpenGL).