Можно ли сказать clang не анализировать определенные файлы?

StackOverflow https://stackoverflow.com/questions/856895

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение 2

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

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

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

Другие советы

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

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

// Omit from static analysis.
#ifndef __clang_analyzer__

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

#endif // not __clang_analyzer__

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

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

Я не использую 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))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top