Clang은 특정 파일을 분석하지 말라고 할 수 있습니까?
문제
나는 Clang을 사용하여 내가 작업중 인 프로젝트를 프로파일 링하려고합니다. 이 프로젝트에는 Xcode에 종속성으로 포함 된 다소 대형 정적 라이브러리가 포함되어 있습니다.
Clang이 Clang이 실패하게 만드는 것처럼 보이기 때문에 Clang이 종속성 파일을 분석하지 않기를 정말로 원합니다. 이게 가능해? 나는 Clang 문서를 읽고 있었는데 그것을 찾지 못했습니다.
해결책 2
따라서 이것은 실제로 답이 아니지만 충분히 잘 작동했습니다.
내가 한 일은 정적 라이브러리를 미리 구축 한 다음 Scan-Build를 사용하여 프로젝트를 구축하는 것이 었습니다. 정적 라이브러리의 최신 빌드가 이미 있었기 때문에 재건되지 않았으므로 스캔되지 않았습니다.
그래도 나는 여전히 이것에 대한 진정한 답을 갖고 싶어합니다.
다른 팁
최후의 수단으로서, 무차별 인력 옵션이 있습니다.
파일의 시작 부분에 이것을 추가하십시오.
// Omit from static analysis.
#ifndef __clang_analyzer__
이것을 끝에 추가하십시오.
#endif // not __clang_analyzer__
그리고 Clang -Analyze는 파일의 내용을 볼 수 없습니다.
참조: 정적 분석기 진단 제어
나는 Xcode를 사용하지 않지만 Linux에서 Scan-Build를 사용하는 것은 다음과 같습니다. 제 경우에는 모든 제 1 자, 비 생성 코드에서 정적 분석을 실행하고 싶습니다. 그러나 Third_Party 코드 및 생성 코드에서 실행되지 않도록하고 싶습니다.
명령 줄에서 Clang-Analyzer는 CC 및 CXX 환경 변수를 CCC-Analyzer 및 C ++-분석기 위치로 설정할 때 빌드에 연결됩니다. 나는 ccc-analyzer.py와 c ++-analyzer.py라는 두 가지 간단한 스크립트를 작성하여 기본 대신 컴파일에 연결했습니다. 이 래퍼 스크립트에서는 컴파일중인 파일의 경로를 간단히 살펴본 다음 원시 컴파일러를 직접 실행하거나 (정적 분석을 피하려는 경우) C*-analyzer (정적 분석이 발생하려면). 내 스크립트는 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))