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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

// Omit from static analysis.
#ifndef __clang_analyzer__

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

#endif // not __clang_analyzer__

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

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

Ответ 3

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

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