Xcode 3에서 clang 정적 코드 분석의 경고를 오류로 처리하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/5033417

문제

질문

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 5용으로 이 스크립트의 업그레이드된 버전.

도움이 되었습니까?

해결책

우리는 분석기를 실행하고 결과를 확인하기 위해 별도의 빌드 단계를 가질 계획이었습니다.그런 식으로 빌드 서버의 빌드가 실패하게 됩니다.하지만 현지에서는 도움이 되지 않습니다.

다른 팁

Xcode에는 "경고를 오류로 처리" 확인란이 있습니다.일부 iPhone 프로젝트에서 말한 것처럼 찾을 수 없는 경우 문제의 대상에 대한 빌드 설정에서 WARNING_CFLAGS에 "-Werror"를 추가하세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top