2009-05-13 3 views
15

Я пытаюсь использовать clang для профилирования проекта, над которым я работаю. Проект включает довольно большую статическую библиотеку, которая включена в Xcode в качестве зависимости.Можете ли clang сказать не анализировать определенные файлы?

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

+0

Apple, имеет приличный форум для конфиденциального обсуждения продуктов, выпущенных под NDA в http://devforums.apple.com в котором на такие вопросы могут ответить представители Apple и другие раскрытые разработчики. – cdespinosa

+0

(если вы не просите об использовании инструмента построения сканирования по адресу http://clang.llvm.org/StaticAnalysis.html, который действительно является общедоступным. В этом случае просто укажите исходные файлы, которые вы хотите проанализировать, как показано в основном использовании на этой странице.) – cdespinosa

+0

Я просто говорю об инструменте сканирования. К сожалению, при базовом использовании он не имеет ничего об исключении файлов из анализа. Если вы используете scan-build для проекта, он по умолчанию анализирует все файлы в этом проекте, включая мою массивную статическую библиотеку. –

ответ

4

Итак, на самом деле это не ответ, но он работал достаточно хорошо.

Что я в конечном итоге делал, так это создание статической библиотеки раньше времени, а затем создание проекта с помощью scan-build. Поскольку уже существовала обновленная сборка статической библиотеки, она не была перестроена и, следовательно, не была отсканирована.

Я все равно хотел бы получить реальный ответ на это.

13

В крайнем случае существует опция грубой силы.

Добавить это в начале файла:

// Omit from static analysis. 
#ifndef __clang_analyzer__ 

Добавьте к этому концу:

#endif // not __clang_analyzer__ 

и лязг --analyze не будет видеть содержимое файла.

ссылка: Controlling Static Analyzer Diagnostics

+1

Это означает, что я должен установить этот макрос в каждом исходном файле в статической библиотеке, не так ли? Это не поддается ИМО. Я не буду изменять мои зависимости вообще, поскольку я использую CocoaPods для моих проектов iOS. –

1

Я не использую XCode, но с помощью скан-сборки в Linux следующие работы для меня. Я в моем случае, я хочу запустить статический анализ во всех первых, не сгенерированных кода. Тем не менее, я хочу, чтобы не запускать его по коду third_party и сгенерированному коду.

В командной строке clang-analyzer подключается к сборке, когда scan-build устанавливает переменные окружения CC и CXX в ccc-анализатор и C++ - места анализатора. Я написал два простых сценария ccc-analyzer.py и C++ - analyzer.py и подключил их к компиляции вместо значения по умолчанию. В этих сценариях оболочки я просто смотрел на путь скомпилированного файла, а затем запускал либо исходный компилятор напрямую (если я хочу избежать статического анализа), либо c * -анализатор (если я хочу, чтобы статический анализ имел место). Мой скрипт в Python и привязан к моей конкретной системе сборки, но в качестве примера, который нуждается в модификации:

import subprocess 
import sys 

def main(argv): 
    is_third_party_code = False 
    for i in range(len(argv)): 
    arg = argv[i] 
    if arg == '-c': 
     file_to_compile = argv[i + 1] 
     if '/third_party/' in file_to_compile or \ 
      file_to_compile.startswith('gen/'): 
     is_third_party_code = True 
     break 
    if is_third_party_code: 
    argv[0] = '/samegoal/bin/clang++' 
    else: 
    argv[0] = '/samegoal/scan-build/c++-analyzer' 
    return subprocess.call(argv) 

if __name__ == '__main__': 
    sys.exit(main(sys.argv))