Опитвам се да използвам clang за профил на проект, върху който работя. Проектът включва доста голяма статична библиотека, която е включена в Xcode като зависимост.
Наистина бих искал Кланг да не анализира файловете на зависимостите, тъй като изглежда, че клангът се проваля. Възможно ли е това? Чета документацията на кланг и не съм го намерил.
Отговори:
13 за отговор № 1В краен случай има опция за груба сила.
Добавете това в началото на файл:
// Omit from static analysis.
#ifndef __clang_analyzer__
Добавете това към края:
#endif // not __clang_analyzer__
и clang --analyze няма да видите съдържанието на файла.
справка: Контрол на диагностиката на статичния анализатор
4 за отговор № 2
Така че, това наистина не е отговор, но работи достатъчно добре.
Това, което в крайна сметка правех, беше изграждането на статикатабиблиотека преди време и след това изграждане на проекта с помощта на сканиране. Тъй като вече имаше актуална конструкция на статичната библиотека, тя не беше преустроена и по този начин не беше сканирана.
Все пак обичам да имам истински отговор за това.
1 за отговор № 3
Не използвам XCode, но използвам scan-build в Linuxследните работи за мен. Аз моят случай, искам да стартирам статичния анализ на всички първи страни, генериран код. Въпреки това искам да избегна пускането му върху код на трета страна и генериран код.
В командния ред кланг-анализаторът е закаченв изграждането, когато сканиране-сглобяване задава променливите на средата CC и CXX на ccc-анализатор и c ++ - местата на анализатора. Написах два прости скрипта, наречени 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))