4
070 GUEST ARTICLE GUEST ARTICLE SW적인 방법

GGUUEESSTT ARTICLE - index-of.co.ukindex-of.co.uk/Reverse-Engineering/SW2.pdf · Î Çà ¡ÉÏÙ. Ì øº áú¦ html üÂÎ ¸éî»ç Html áú¡Â ¢

Embed Size (px)

Citation preview

Page 1: GGUUEESSTT ARTICLE - index-of.co.ukindex-of.co.uk/Reverse-Engineering/SW2.pdf · Î Çà ¡ÉÏÙ. Ì øº áú¦ html üÂÎ ¸éî»ç Html áú¡Â ¢

070

GGUUEESSTT

ARTICLE

소프트웨어 개발자라면 누구나 소프트웨어 디펙트(Software Defect, 주1)로 고생한

기억이 있을 것이다. 예를 들어, 내가 며칠 동안 못 찾은 디펙트를 동료 개발자가

몇 분 만에 찾는 경우도 있고 복잡한 디버깅 과정을 거쳐 디펙트의 원인을 분석해

본결과지역변수를초기화하지않아생긴단순한문제도있다.

글 : 이창호주임 / MDS테크놀로지 TA(Test Automation)사업팀

www.mdstec.com

소프트웨어는형체가없기때문에사람이코드의의미를해석해문제점이나디

펙트를찾는다는것은정말어려운일이다. 출시이전에디펙트가발견되면금전

적인손실은어느정도막을수있지만, 불과몇년사이에소스코드의크기와복

잡도가너무나도많이증가했으므로코드상의모든부분을개발자가하나하나테

스트하고디펙트를찾아내수정하는작업은거의불가능하다고볼수있다.

정적분석기법이란

시간과인력이많이소모되는소프트웨어테스팅과정을신속하고정확하게진

행하기위한기법과툴들이연구되고있다. 이번기고에서필자는정적분석툴

CodeSonar를기준으로실행되는정적분석기법(Static Analysis)에대해소개

하도록하겠다. 정적분석기법은소스코드실행없이코드의의미를분석해디

GGUUEESSTT ARTICLE

SW개발 과정에서 효과적인

정적 분석 기법 적용방법

그림 1. Codesonar 분석과정

SourceCode

ProgramModel

Constructor

ProgramPath

Analyzer

Static Analysis Tool

AbstractProgram

Representation

DefectWarningDatabase

Web-Baseduser Interface

Page 2: GGUUEESSTT ARTICLE - index-of.co.ukindex-of.co.uk/Reverse-Engineering/SW2.pdf · Î Çà ¡ÉÏÙ. Ì øº áú¦ html üÂÎ ¸éî»ç Html áú¡Â ¢

071

펙트를찾는방법이다. 그림 1에서와같이

입력된 소스 코드를 Program Model

Constructor가 분석하면 실행시의 동작

을 표현한 중간코드로 변환된다. 이 중간

코드에는변수의범위나실행경로를추적

할수있는정보들이담겨져있다. 변환된

코드를 Program Path Analyzer가분석

해실제실행되는경로를추적하고그중

디펙트로의심되는항목을찾아리스트를

작성함으로써, 사용자는웹을통해작성된

디펙트리스트를검토하고실제디펙트를

찾아낸다. 그림 2는 CodeSonar와 실제

빌드환경과의 연동 과정을 나타내고 있

다. CodeSonar는 빌드 과정을 감시하는

기능을제공하기때문에간단한세팅만으

로 실행 가능하다. 이 툴은 결과를 html

형태로만들어내며 Html 결과에는각변

수와함수의링크가포함되어클릭몇번

만으로디펙트를추적및원인분석이가

능하다(그림 3참조).

정적 분석 기법을 적용한 코딩 단

계의세부과정

소프트웨어 개발 과정을 크게 5단계로

요약한다면그림 4와같다.

개발자 입장에서 코딩단계를 살펴보면

버전관리툴에서체크아웃하고코드를작

성한 후 컴파일러를 통해 작성된 코드의

Syntax Error를체크한다. 에러수정이완

료되면체크-인을실시한다.(그림 5참조)

이과정에정적분석툴로디펙트를체

크하는단계를포함시키면그림 6과같은

AROUND THE EMBEDDED

FEATURE STORY

GUSET ARTICLE

PRODUCT FEATURE

그림 2. Codesonar와빌드환경의연동

그림 3. Codesonar 결과화면

Build Information(e.g., Makefiles orIDE-based build)

CodeSonarBuild Watcher

CodeSonarAnalyzer

Defect warningdatabase

SourceCode

RegularCompilation Regular

Object Code

Regular BuildEnvironment

Web-based user interface

(248라인에서 사이즈 값이 1이 되면 256라인의 리턴문이 실행되어 270라인 pSum 변수 초기화 부분이 실행되지 않는다. 따라서 497 라인에서 sum 변수는 초기화 되지 않고 사용 되었다는 디펙트가 검출된다.)

Page 3: GGUUEESSTT ARTICLE - index-of.co.ukindex-of.co.uk/Reverse-Engineering/SW2.pdf · Î Çà ¡ÉÏÙ. Ì øº áú¦ html üÂÎ ¸éî»ç Html áú¡Â ¢

072

진행이이루어지며, 개발자는 syntax error가없는코드를정적분석툴로분석해

발견된디펙트를수정할수있다. 예를들어, 개발자가오늘작성한코드에버퍼

오버런이있었다고가정할경우, 그림 5와같은순서로코딩을하는개발자는해

당부분이테스트되지않는이상버퍼오버런의존재여부를판단할수없다. 이

경우, 코딩후바로수정하는것보다수정작업이훨씬어려워진다. 이미변수나

라인은다른곳과연관되어있을확률이크고문제가발견된부분을수정함으로써

또다른문제가유발될수있기때문이다. 하지만그림 6과같이정적분석기법을

적용해개발을진행하는개발자는코딩후정적분석툴을실행함으로써발견된버

퍼오버런을수정할수있다. 이작업은수정된부분이다른코드에미치는영향을

최소화하기때문에, 테스팅단계의업무강도를줄이고높은품질의소프트웨어

제품을조기출시할수있는환경을제공

한다.

글을마치며

CodeSonar가찾아내는디펙트항목은

약 50여 가지이며 앞으로도 계속 추가될

예정이다. 이가운데발생시시스템에심

각한영향을미칠수있는크리티컬디펙

트들은그림 7과같다.

필자는약 3년동안다양한소프트웨어

관련 기업들을 방문해 많은 라인의 소스

코드를 분석하였다. 필자의 경험에 비추

어볼때, Buffer Overflow(주2), Buffer

Underflow(주3), Resource Leak, Null

Pointer Deference, Uninitialized

variable의 5개 크리티컬 디펙트들이 전

체의 80% 이상을차지하고있다. 배열의

길이를선언할때는숫자를직접넣는것

보다는 정의된 값을 이용하고 포인터 변

GGUUEESSTT ARTICLE

Buffer Overrun Return pointer to Freed

Buffer Underrun Type Overrun

Division By Zero Type Underrun

Double Free Uninitialized Variable

Free Non-HeapUse After FreeVariable

Free Null Pointer Double Close

Resource Leak Double Lock

Missing ReturnDouble Unlock

Statement

Null Pointer Memcpy Length Dereference Unreasonable

Return Pointer Strcpy Length To Local Unreasonable

그림 7. Codesonar에서검출가능한크리티컬디펙트리스트

그림 4. 일반적인소프트웨어개발과정

그림 5. 일반적인코딩과정 그림 6. 정적분석툴을이용한코딩과정

요구분석 설 계 코 딩 테스팅 유지보수요구분석 설 계 코 딩 테스팅 유지보수

Check Out

Check Out

코드 작성

코드 작성

코드 수정

코드 수정

Compile Error 발견?

Compile Error 발견?

Defect발견?

yes

yes

yes

Check In

Check In

no

no

no

Page 4: GGUUEESSTT ARTICLE - index-of.co.ukindex-of.co.uk/Reverse-Engineering/SW2.pdf · Î Çà ¡ÉÏÙ. Ì øº áú¦ html üÂÎ ¸éî»ç Html áú¡Â ¢

073

AROUND THE EMBEDDED

FEATURE STORY

GUSET ARTICLE

PRODUCT FEATURE

AROUND THE EMBEDDED

FEATURE STORY

GUSET ARTICLE

PRODUCT FEATURE

수를참조할때Null 유무를체크하며, 로컬변수

를 선언할 때 초기화를 해주는 코딩 습관으로도

많은디펙트를줄일수있다. 하지만라인이크거

나구조가복잡한코드를분석하고검증하기위해

서는객관적인툴이꼭필요하다. 또한, 툴이발견

한디펙트들을분석해발생원인을밝혀내고개발

자들끼리 정보를 공유함으로써 해당 디펙트들이

재발하지않도록관리하는것도정말필요한시스

템이라고생각한다. 무조건만들어서먼저출시하

고향후에A/S나펌웨어업데이트로수정하면된

다는생각으로제작된소프트웨어는시장경쟁에

서살아남을수없다. 따라서여유있는개발기간

을통해높은품질의소프트웨어를조기에출시하

기위해서는개발에도움을줄수있는도구들을

잘활용해야만할것이다.

▶주 1) 디펙트(Defect) : 시스템의 성능을 떨어뜨리

거나 멈춤, 오동작을 유발하는 소프트웨어의 구문.

일반적으로설계상의오류도포함됨.

▶주 2) Buffer Overflow : 배열이나 포인터의 유효

범위를 어드레스 증가방향으로 벗어나는 디펙트.

CodeSonar에서는 버퍼 오버런과 타입 언더런이

해당된다.

▶주 3) Buffer Underflow : 배열이나포인터의유효

범위를 어드레스 감소방향으로 벗어나는 디펙트.

CodeSonar에서는버퍼언더런, 타입언더런이해

당된다.

02-2026-5700

www.Embeddedworld.co.kr

인터넷에서읽는Embedded World,

e-Magazine서비스

+ + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +

의 특징은 제작비용, 및 유통비용, 판매가격이 상대적

으로 인쇄책자보다 저렴하며 수정 및 재가공이 가능합니다.

또한 멀티미디어 기능이 있어 표현이 다양하고 광고효과가

뛰어난장점을지니고있습니다.

를 www.EmbeddedWorld.co.kr에서 이용하시려면

Adobe Acrobat eBook Reader를설치해야합니다.

(eBook Service 참조)

언제, 어디서나빠르고손쉽게

를만나자!