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