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

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

Ответы [ 4 ]

69 голосов
/ 29 апреля 2011

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

#ifndef __clang_analyzer__

// Code not to be analyzed

#endif

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

8 голосов
/ 13 августа 2011

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

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

С этой страницы:

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

6 голосов
/ 11 ноября 2011

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

0 голосов
/ 25 февраля 2016

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

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

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

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

...