Xcode 3에서 clang 정적 코드 분석의 경고를 오류로 처리하는 방법은 무엇입니까?
-
14-11-2019 - |
문제
질문
RUN_CLANG_STATIC_ANALYZER("정적 분석기 실행") 프로젝트 설정이 우리 프로젝트에서 중요한 문제를 발견했습니다.우리는 이 문제를 해결했으며 향후 문제가 발생하는 것을 방지하고 싶습니다.
우리는 Clang 분석 경고가 오류로 취급되도록 노력하고 있습니다. 우리 빌드를 깨뜨려라.-Werror("경고를 오류로 처리")를 활성화했음에도 불구하고 지금까지는 성공하지 못했습니다.
문제의 예
Xcode 내에서 생성된 다음 분석 호출은 다음과 같습니다.
/Developer/usr/bin/clang -x 목표-c [...] --analyze [...]/TroubledCode.m -o [...]/TroubledTarget.build/StaticAnalyzer/normal/i386/TroubledCode. plist
정적 코드 분석 경고를 생성합니다.
[...]/TroubledCode.m:38:34: warning: Potential leak of an object allocated on line 38 and stored into 'leakingManager'
Manager *leakingManager = [[Manager alloc] init];
^
1 warning generated.
하지만 Xcode에서는 "빌드가 성공했습니다...분석기 결과 1개'.우리가 찾고 있는 솔루션은 위의 예에서 "빌드 실패"를 생성하도록 만드는 것입니다.
해결책
나는 Jim의 조언을 받아들여 빌드 스크립트를 만들었습니다.
잘못된 경보를 피하기 위해 외부 분석 잔여물을 무시하는지 확인하는 수고를 겪었습니다.이 솔루션은 Xcode IDE에서 빌드할 때와 다음을 사용하여 프로젝트를 빌드할 때 작동합니다. xcodebuild
.
Xcode 3 분석 경고를 빌드 오류로 바꾸려면:
- 문제의 프로젝트나 대상을 두 번 클릭합니다.
- 빌드 탭에서 설정 > 연결 > 링크 맵 파일 쓰기 아래의 확인란을 선택하세요.
해당 설정은 다음과 같이 알려져 있습니다. LD_GENERATE_MAP_FILE
.
- "그룹 및 파일" > "대상"에서 이 기능을 추가하려는 대상의 펼침 삼각형을 클릭하세요.
- "Link Binary With Libraries" 단계를 마우스 오른쪽 버튼으로 클릭합니다.
- 추가 > 새 빌드 단계 > 새 실행 스크립트 빌드 단계를 선택합니다.
- 선택 과목:방금 "Clang 경고를 오류로 처리"에 추가한 "스크립트 실행" 단계의 이름을 바꿉니다.
- 아직 열려 있지 않은 경우 새 스크립트 단계를 두 번 클릭합니다.
아래 내용을 복사하여 "스크립트" 섹션에 붙여넣으세요.
error_count=0
##
function verify_clang_analysis_at_path()
{
local analysis_path=$1
local plist_tool=/usr/libexec/PlistBuddy
local diagnostics=$($plist_tool -c "print diagnostics" $analysis_path)
if [[ $diagnostics != $'Array {\n}' ]]
then
((error_count++))
fi
}
function verify_clang_analysis_for_object_file()
{
local object_file=$1
local analysis_directory=$TARGET_TEMP_DIR/StaticAnalyzer/$CURRENT_VARIANT/$CURRENT_ARCH
local analysis_path=$analysis_directory/${object_file%.*}.plist
# if this object file corresponds to a source file that clang analyzed...
if [ -e $analysis_path ]
then
verify_clang_analysis_at_path $analysis_path
fi
}
##
object_directory=$OBJECT_FILE_DIR-$CURRENT_VARIANT/$CURRENT_ARCH
object_path_pattern=${object_directory}'/\(.\)\+\.o$'
index_pattern='\[[[:space:]0-9]*\][[:space:]]'
object_paths=$(
grep $object_path_pattern $LD_MAP_FILE_PATH | sed s/$index_pattern//
)
##
for object_path in $object_paths
do
object_file=${object_path##*/}
verify_clang_analysis_for_object_file $object_file
done
if [ $error_count -gt 0 ]
then
echo "Clang static code analysis failed for" $error_count "source file(s)."
fi
exit $error_count
업데이트
해결책
우리는 분석기를 실행하고 결과를 확인하기 위해 별도의 빌드 단계를 가질 계획이었습니다.그런 식으로 빌드 서버의 빌드가 실패하게 됩니다.하지만 현지에서는 도움이 되지 않습니다.
다른 팁
Xcode에는 "경고를 오류로 처리" 확인란이 있습니다.일부 iPhone 프로젝트에서 말한 것처럼 찾을 수 없는 경우 문제의 대상에 대한 빌드 설정에서 WARNING_CFLAGS에 "-Werror"를 추가하세요.