Можно ли сказать, что Clang не анализирует определенные файлы? - PullRequest
17 голосов
/ 13 мая 2009

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

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

Ответы [ 3 ]

15 голосов
/ 10 марта 2011

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

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

// Omit from static analysis.
#ifndef __clang_analyzer__

Добавить в конец:

#endif // not __clang_analyzer__

и clang --analyze не увидит содержимое файла.

ссылка: Управление диагностикой статического анализатора

5 голосов
/ 23 мая 2009

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

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

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

3 голосов
/ 08 января 2013

Я не использую XCode, но при использовании scan-build в linux у меня работает следующее. В моем случае, я хочу запустить статический анализ для всего первого, не сгенерированного кода. Тем не менее, я хочу избежать запуска его для кода третьего_партии и сгенерированного кода.

В командной строке clang-analyzer подключается к сборке, когда scan-build устанавливает переменные среды CC и CXX в местоположения ccc-analyzer и c ++ - analyzer. Я написал два простых скрипта с именами 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))
...