Можно ли подавить предупреждения статического анализатора Xcode 4?

статический анализатор Xcode 4 сообщает в моем коде некоторые ложные срабатывания. Есть ли способ подавить их?

4 ответов


Я нашел решение: ложных срабатываний (например, Шаблона дизайна Apple singleton) можно избежать с помощью:

#ifndef __clang_analyzer__

// Code not to be analyzed

#endif

Analyzer не будет анализировать код между этими директивами препроцессора.


взгляните на эту страницу, которая показывает, как использовать несколько #defines для аннотирования методов и параметров objective-c, чтобы помочь статическому анализатору (clang) сделать правильную вещь

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

страницы:

интерфейс Clang поддерживает несколько аннотаций исходного уровня в форма атрибутов и прагм GCC-типа которые могут помочь сделать используя Clang статический анализатор более полезен. Эти аннотации могут помочь подавление ложных срабатываний, а также повышение способности анализатора найти ошибки.


см. мой ответ здесь. Вы можете добавить флаг компиляции в файлы, и статический анализатор проигнорирует их. Это, вероятно, лучше для кода третьей стороны, о котором вы не беспокоитесь, а не для кода первой стороны, который вы пишете.


большую часть времени, используя такие вещи, как CF_RETURNS_RETAINED и следуя правилу "create", работает для меня, но я столкнулся с делом, которое я мог не подавлять. Наконец, нашел способ подавить анализатор, посмотрев на исходный код llvm:

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

" Проверьте, подавляем ли мы ошибку при сохранении указателя на a глобальный."

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;
}

по какой-то причине присвоение статическому массиву не подавить предупреждение, но назначить простой старый статический "sSuppressStaticAnalyzer"тут. Кстати, вышеупомянутый метод, используя CGLayerRef, - это самый быстрый способ перерисовать кэшированные изображения (кроме OpenGL).