Home 20. 정적 분석
Post
Cancel

20. 정적 분석

정적 분석은 프로그램을 실행하지 않은 채로 소스 코드를 분석하여 버그나 안티패턴등의 잠재적인 문제를 찾아내는 것을 말한다.

정적 분석은 버그 찾기 이상의 혜택을 제공한다. 구글은 정적 분석을 이용해 모범 사례를 코드에 널리 배포하고, 최신 API를 이용하게 하며, 기술 부채를 막거나 줄여준다. 또 개발자 교육에도 유용하고 코드베이스에 안티패턴이 침투하는 걸 걸러준다는 증거도 많다.

20.1 효과적인 정적 분석의 특징

20.1.1 확장성

소프트웨어 덩치가 커지면서 분석에 걸리는 시간도 늘어나 분석 도구들은 코드량이 많아져도 결과를 제때 내놓을 수 있도록 확장성에 집중하기 시작했다.

구글의 정적 분석 도구는 수십억 줄의 코드베이스를 주무를 수 있어야 한다. 이를 위해 코드를 분할하고, 점진적으로 분석하는 길을 택했다. 분석 도구가 거대한 코드베이스를 다룰 수 있게 하는 동시에 제공하는 분석 기법 측면에서의 확장성에도 신경 썼다.

20.1.2 유용성

분석 유용성 측면에서는 사용자들의 비용-편익 트레이드오프를 고려해야 한다. 비용이라 하면 개발 시간과 코드 품질이 될 수 있다.

개발자의 시간은 소중하기 때문에 분석 보고서에서 중요한 문제를 선별하거나 강조된 문제를 수정하는 데 쓴 시간을 그 분석이 제공한 편익과 저울질해봐야 한다. 자동으로 수정할 수 있는 문제라면 뭐든 자동으로 해야 한다.

분석 결과 검토 비용을 더 줄이려면 개발자 워크플로에 자연스럽게 녹이는 데도 신경 써야 한다. 하나의 워크플로에 모든 것을 유기적으로 융합시키면 분석 도구와 소스 코드가 함께 진화한다는 장점이 생긴다.

20.2 정적 분석을 적용하며 깨우친 핵심 교훈

20.2.1 개발자 행복에 집중하자

20.2.2 정적 분석을 개발자 워크플로에 반드시 끼워 넣자

구글은 정적 분석을 코드 리뷰 도구에 통합하여 핵심 워크플로에 녹였다. 구글에서는 커밋되는 모든 코드를 사전에 검토한다. 분석 결과를 살펴본 리뷰어들이 정적 분석 경고를 해결하라며 압박을 줄 수 있고, 흔한 문제를 자동으로 부각시켜주기 때문에 리뷰어의 시간도 절약시켜준다.

20.2.3 사용자가 기여할 수 있도록 하자

구글에는 우수한 도메인 전문가가 많다. 전문가들은 새로운 분석 도구를 만들거나 기존 도구에 검사 로직을 추가하는 식으로 기여할 수 있다.

20.3 Tricorder: 구글의 정적 분석 플랫폼

구글 정적 분석의 핵심에는 Tricorder가 있다. Tricorder가 이전 실패작들과 크게 다른 점은 사용자에게 가치 있는 결과만을 제공하는 데 모든 노력을 쏟았다는 것이다. Critique에 통합되어 Critique의 디프 뷰어에 회색 댓글 상자로 경고를 표시해준다.

구글의 개발자 모두는 Tricorder 분석기를 직접 작성하거나 기존 분석기에 검사 항목을 추가하는 식으로 기여할 수 있다. 그러기 위해서는 다음 네 가지 조건을 충족해야 한다.

  • 이해하기 쉬움
  • 실행 가능 및 수정 용이
  • 유효 거짓 양성 비율 10% 미만
  • 코드 품질 개선에 크게 기여할 수 있는 잠재력

20.3.1 도구 통합

Tricorder에는 다양한 유형의 정적 분석 도구들이 통합되어 있다. (542p)

20.3.2 피드백 채널 통합

개발자가 얼마나 행복해하는지를 추적하고 관리하려면 분석기 사용자와 분석기 작성자를 잇는 피드백 루프를 반드시 구축해야 한다. 결과가 유용하지 않은 경우 그 이유를 분석기 작성자에게 직접 버그 형태로 전달할 수 있는 옵션도 가지고 있다.

분석기의 문제 원인이 아주 간단하여 바로 고칠 수 있을 때도 있다. 분석기가 출력하는 메시지의 텍스트를 다듬는 정도로 충분한 경우다. 진단 메시지를 다듬으면 무엇이, 왜, 잘못되었고 어떻게 수정해야 하는지를 가장 적절한 지점에서 바로 설명해줄 수 있다. 그렇게 하면 개발자는 메시지를 읽고 상황을 이해할 수 있다.

20.3.3 수정 제안

Tricorder 검사 항목은 가능한 경우 어떻게 수정해야 하는지까지 제안을 준다.

20.3.4 프로젝트별 맞춤 설정

적중률 높은 분석 결과만을 보여주어 신뢰를 쌓은 다음에는 기본 분석기 외에 프로젝트별로 선택적 분석기를 추가할 수 있게 하였다. 프로젝트 단위로 설정되도록 해야 모든 팀원이 일관된 분석 결과를 받아볼 수 있다.

20.3.5 프리서브밋

코드 리뷰시 표시되는 정적 분석 경고를 개발자가 무시할 수도 있다. 그래서 작성 중인 변경이 커밋되지 못하게 막는 분석기를 추가하였다. 이를 프리서브밋 검사 라고 한다. 프리서브밋 검사에서는 사용자화할 수 있는 매우 간단한 빌트인 검사들을 수행한다. 또 규칙을 추가할 수도 있다.

20.3.6 컴파일러에 통합

문제를 워크플로의 앞단에서 알려줄 방법을 찾기 위해 구글은 정적 분석을 가능한 한 컴파일러에 통합하려 노력한다.

빌드 속도가 느려지지 않도록 컴파일러 검사는 빠르게 수행되어야 한다. 그 괴에 다음의 세 가지 기준도 충족해야 한다.

  1. 쉽게 수정할 수 있음
  2. 유효 거짓 양성이 발생하지 않음
  3. 정확성 관련 문제만 보고

20.3.7 코드 편집 및 브라우징 중 분석

정적 분석을 통합 개발 환경에 통합할 수도 있다. 하지만 IDE에서는 분석을 빠르게 끝마쳐야 하므로 속도가 느린 분석기라면 통합하기 애매하다. 구글은 하나의 IDE를 모든 팀에 강제하지 않기 때문에 IDE와의 통합은 리뷰 프로세스에 통합하는 것보다 지저분한 경향이 있다.

548p

20.4 마치며

정적 분석은 코드베이스를 개선하고 버그를 조기에 발견해준다. 나아가 코드 리뷰와 테스트처럼 비용이 더 많이 드는 활동에서는 기계적으로 검증할 수 없는 문제에 집중하도록 해주는 훌륭한 도구이다.

20.5 핵심정리

  • 개발자 행복에 집중하자
  • 정적 분석을 개발자 워크플로에 반드시 포함하자(코드리뷰)
  • 사용자가 기여할 수 있도록 하자
This post is licensed under CC BY 4.0 by the author.

19. Critique 구글의 코드 리뷰 도구

21. 의존성 관리