Можно ли сказать clang не анализировать определенные файлы?
Вопрос
Я пытаюсь использовать 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))