Understand 사용법: 코드 구조 분석부터 함수 호출 관계, 복잡도 및 정적 분석까지

min Read

기존 프로젝트의 코드를 수정하려면 함수의 구현뿐 아니라 호출 관계와 복잡도도 살펴봐야 합니다. 어떤 코드와 연결되어 있는지, 어디부터 자세히 읽어야 하는지 알아야 수정 범위를 정할 수 있기 때문입니다.

Understand는 소스 코드를 정적으로 분석해 구조와 참조 관계, 메트릭, 규칙 검사 결과를 보여주는 도구입니다. 이번 글에서는 PuTTY 프로젝트를 예로 들어 코드 정보 확인, 함수 관계 탐색, 메트릭 분석, 리포트, CodeCheck를 차례로 살펴봅니다.

Information Browser에서 코드 정보 확인하기

코드 분석

Information Browser는 선택한 파일이나 함수, 변수의 분석 정보를 모아 보여주는 화면입니다. 파일에 포함된 함수와 변수, 함수의 매개변수와 호출 관계, 메트릭 등 선택한 대상에 맞는 정보를 확인할 수 있습니다.

예를 들어 파일을 선택해 포함된 함수를 살펴본 뒤, 관심 있는 함수를 선택해 관련 정보를 이어서 확인할 수 있습니다. 관계 항목을 펼치면 연결된 대상까지 따라가 볼 수 있습니다.

낯선 코드를 읽을 때 소스와 Information Browser를 나란히 놓고 보면, 지금 읽는 코드가 어떤 대상과 연결되어 있는지 함께 확인할 수 있습니다.

Called By와 Butterfly로 함수 관계 확인하기

함수의 구현을 읽고 나면 이 함수가 어디서 호출되는지 궁금해집니다. 특히 공통 처리 함수를 수정할 때는 이를 사용하는 코드도 함께 살펴봐야 합니다.

Understand의 그래프는 이런 호출 관계를 시각적으로 보여줍니다.

코드 분석
그래프
확인할 수 있는 내용
Called By
선택한 함수를 호출하는 함수와 상위 호출 관계
Butterfly
선택한 함수를 호출하는 쪽과 선택한 함수가 호출하는 쪽의 관계

Called By로 호출하는 쪽을 따라가면 수정한 함수를 사용하는 기능을 찾는 데 도움이 됩니다. Butterfly에서는 양쪽 관계를 함께 보며 해당 함수가 전체 처리 과정의 어디쯤에 있는지 가늠할 수 있니다.

그래프에서 관계를 확인한 뒤 실제 호출 코드로 이동하면, 수정 전에 함께 검토할 범위를 좁힐 수 있습니다. 다만 그래프에 나타나는 것은 소스를 정적으로 분석한 호출 관계입니다.

메트릭으로 코드 길이와 복잡도 함께 보기

코드 분석

코드가 짧아도 분기가 많으면 처리 흐름은 복잡할 수 있습니다. 짧은 함수에도 조건문이나 여러 갈래의 분기가 모여 있으면 확인해야 할 경우가 많아집니다.

Cyclomatic Complexity는 함수 안에서 독립적인 실행 경로가 얼마나 되는지를 나타내는 지표입니다. 조건과 분기로 처리 경로가 나뉘는 정도를 수치로 살펴볼 수 있습니다.

Metrics Browser에서 함수별 값을 비교하거나, Metrics Treemap에서 여러 파일의 규모와 복잡도를 함께 확인할 수 있습니다.

크기와 색상을 함께 보면 규모가 큰 파일과 복잡한 함수를 포함한 파일을 구분할 수 있습니다. 여기서 관심 있는 파일을 고른 뒤 함수별 메트릭과 실제 소스를 확인하면 검토할 부분을 더 구체적으로 정할 수 있습니다.

복잡도는 코드를 자세히 검토할 순서를 정하는 근거로 활용할 수 있습니다. 값이 높다는 사실만으로 결함이 있다고 판단할 수는 없습니다.

분석 결과를 리포트로 정리하기

분석한 내용을 다른 사람과 검토하거나 기록으로 남길 때는 리포트를 활용할 수 있습니다. Understand는 코드 줄 수를 정리하는 Line Metrics, 함수별 복잡도를 정리하는 Complexity Metrics 등 목적에 맞는 리포트를 지원합니다.

뒤에서 살펴볼 CodeCheck 결과도 규칙별 또는 파일별 리포트로 확인할 수 있습니다.

위 예시에서는 어떤 규칙의 위반이 많이 보고되었는지 표로 확인할 수 있습니다. 전체 분포를 먼저 본 뒤 자세히 검토할 규칙이나 파일을 고르는 데 쓰면 됩니다.

CodeCheck로 규칙 위반과 잠재적 결함 확인하기

코드 분석

코드의 구조와 복잡도를 확인했다면 CodeCheck로 규칙 위반과 잠재적 결함을 살펴볼 수 있습니다. 이번 예제에서는 MISRA와 Bug Hunter 검사 결과를 확인합니다.

검사
살펴보는 내용
MISRA
선택한 MISRA 규칙에 대한 코드의 위반 여부
Bug Hunter
C/C++ 코드에서 초기화되지 않은 값 사용, 널 포인터 역참조, 메모리 누수 등 잠재적 결함

MISRA 검사 결과에서는 규칙 ID와 설명, 관련 파일과 줄 번호를 확인할 수 있습니다. 위 예시에는 가능한 경우 포인터가 const로 한정된 타입을 가리키도록 권고하는 규칙에 대한 결과가 표시됩니다. 결과를 선택하면 해당 위치의 코드와 규칙 설명을 함께 살펴볼 수 있습니다.

Bug Hunter는 분석한 경로에 따라 문제가 발생할 수 있는 지점을 알려줍니다. 특히 Related Locations에서 결과와 관련된 코드 위치와 분기 과정을 따라갈 수 있습니다.

위 화면에서는 uxpgnt.c의 함수 호출에서 네 번째 인자가 초기화되지 않은 값일 수 있다는 결과가 표시됩니다. Related Locations에는 restr 변수의 선언 위치와 조건 판단, 선택한 분기, 함수 호출과 반환 과정 등이 나열되어 있습니다.

각 항목의 줄 번호를 따라가면 어떤 경로에서 이 결과가 보고되었는지 알 수 있습니다. 문제가 표시된 줄뿐 아니라 그 앞에서 값이 어떻게 처리되었는지도 확인할 수 있습니다. 검출 결과는 분석 설정과 주변 코드의 문맥을 함께 검토해 판단합니다.

AI Code Search와 AI Overview로 자연어로 코드 찾기

함수 이름을 모르는 상태에서 처음 보는 프로젝트를 탐색하면, 어떤 키워드로 검색해야 할지부터 막힐 수 있습니다. 예를 들어 “SSH 인증을 처리하는 코드가 어디 있지?”라는 질문은 있지만, 실제 함수 이름이 auth_로 시작하는지 userauth를 포함하는지는 알 수 없습니다.

Understand의 AI Code Search에서는 이런 질문을 자연어로 입력할 수 있습니다. 위 화면에서는 “handle SSH authentication”을 입력했고, 오른쪽 패널에 관련성이 높은 대상이 일치도(Match)와 함께 표시됩니다.

코드 분석
패널
확인할 수 있는 내용
AI Code Search
입력한 문장과 관련된 함수·구조체·파일 목록과 일치도
AI Overview
선택한 대상이 어떤 역할을 하는지에 대한 요약

검색 결과에는 함수뿐 아니라 ssh2_userauth_state 같은 구조체와 uxserver.c 같은 파일도 함께 나타납니다. 이름에 “auth”가 들어가지 않은 대상도 의미가 가까우면 목록에 포함되므로, 정확한 이름을 몰라도 살펴볼 후보를 모을 수 있습니다.

목록에서 파일을 선택하면 AI Overview에 해당 파일의 역할과 주요 동작이 요약되어 표시됩니다. 소스를 한 줄씩 읽기 전에 이 파일이 어떤 목적의 코드인지 먼저 파악할 수 있습니다.

다만 일치도가 높아도 질문과 직접 관련이 적은 대상이 함께 나타날 수 있습니다. AI 화면에도 검증되지 않은 정보라는 안내가 표시됩니다. 따라서 AI 검색 결과는 살펴볼 후보를 찾는 데 쓰고, 실제 판단은 Information Browser와 호출 관계 그래프, 소스 코드로 확인하는 것이 좋습니다.

이번 글에서는 PuTTY 프로젝트를 예시로 Understand의 기본 기능을 살펴봤습니다.

Understand에서는 코드 정보를 확인하고, 호출 관계를 따라가고, 메트릭과 검사 결과를 실제 소스와 연결해 볼 수 있습니다. 이 흐름대로 따라가면 처음 보는 프로젝트에서도 어떤 코드를 왜 검토해야 하는지 구체적으로 정할 수 있습니다.

낯선 프로젝트의 코드 구조를 파악하는 정적 분석 도구, Understand

우리 기업의 개발 환경에 맞는 코드 분석 방법을 Understand로 확인해 보세요.

Latest Posts

SOLUTION

Tags

Category

Latest Posts

© SLEXN, Inc. All rights reserved.

ALM 신규 도입부터 기존 개발 관리 환경의 통합·확장까지, 우리 조직에 맞는 ALM 선택 가이드를 이번 슬렉슨 웨비나에서 확인해 보세요.

Days
Hours
Minutes
Seconds