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).