동적 프로그램 분석
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
동적 프로그램 분석은 프로그램을 실행하여 런타임 동작을 관찰하고 분석하는 기법으로, 계측 또는 변환을 통해 이루어진다. 기능적 테스팅, 코드 커버리지, 동적 테스팅, 메모리 오류 탐지, 퍼징, 동적 기호 실행, 동적 데이터 흐름 분석, 불변식 추론, 보안 분석, 동시성 오류, 프로그램 슬라이싱, 성능 분석 등 다양한 유형이 존재하며, 각 기법은 프로그램의 결함을 발견하고 성능을 향상시키는 데 기여한다. 정적 분석과 상호 보완적인 관계를 가지며, 버그 탐지 정확도와 속도를 높이는 데 활용된다. 동적 분석을 위한 다양한 도구들이 개발되어 사용되고 있다.
더 읽어볼만한 페이지
- 프로그램 분석 - 데이터 흐름 분석
데이터 흐름 분석은 프로그램의 제어 흐름 그래프를 바탕으로 변수의 정의, 사용, 생존 여부를 분석하며, 전이 함수와 결합 연산을 통해 데이터 흐름 정보를 계산하고 반복적으로 갱신하여 해를 구한다. - 프로그램 분석 - 정적 프로그램 분석
정적 프로그램 분석은 소프트웨어 개발 시 코드를 실행 없이 분석하여 오류, 보안 취약점, 코딩 표준 위반 등을 탐지하는 기술로, 개발 비용 절감, 품질 향상, 시스템 신뢰성 확보에 기여하며 다양한 레벨로 분석 가능하다. - 소프트웨어 테스트 - 보안 취약점
보안 취약점은 시스템의 설계, 구현, 운영, 관리상 결함이나 약점으로, 위협에 의해 악용되어 시스템 보안 정책을 위반할 수 있는 요소이며, ISO 27005, IETF RFC 4949, NIST SP 800-30, ENISA 등 다양한 기관에서 정의하고 있다. - 소프트웨어 테스트 - A/B 테스트
A/B 테스트는 두 가지 이상의 대안을 비교하여 더 나은 성과를 판단하는 방법으로, 웹사이트, 애플리케이션 등 다양한 분야에서 사용자 인터페이스 등을 테스트하며 통계적 가설 검정을 기반으로 한다.
동적 프로그램 분석 | |
---|---|
개요 | |
분야 | 소프트웨어 테스트 |
목적 | 프로그램 실행 중 분석 |
상세 정보 | |
유형 | 런타임 분석 |
반대 개념 | 정적 프로그램 분석 |
2. 유형
동적 프로그램 분석은 프로그램을 실제로 실행하면서 분석하는 기법으로, 코드를 실행하지 않고 분석하는 정적 분석과는 상호 보완적인 관계를 가진다. 예를 들어, 멀티스레드 환경에서 여러 스레드가 실행되는 순서는 비결정적이어서 정적 분석만으로는 버그를 예측하기 어려운 경우가 많다. 이러한 실행 시점의 문제를 파악하기 위해 동적 분석이 필요하다.
정적 분석과 동적 분석을 함께 활용하면 버그 탐지 정확도와 속도를 높이고, 경합 상태, 데드락, 리소스 누수 등 실행 중에만 드러나는 복잡한 문제들을 효과적으로 분석할 수 있다[7]。 동적 분석은 다양한 목적과 기법에 따라 여러 유형으로 나뉜다.
2. 1. 기능적 테스팅
기능적 테스팅은 단위 테스팅, 통합 테스팅 및 시스템 테스팅과 같은 비교적 일반적인 컴퓨터 프로그래밍 기술을 포함한다.[2]2. 2. 코드 커버리지
테스트의 코드 커버리지를 계산하면 어떤 코드가 테스트되지 않았는지 식별할 수 있다. 즉, 테스트 과정에서 실행되지 않은 코드 부분을 찾아내는 것이다.이 분석 방법은 테스트되지 않은 코드를 찾아내는 데 유용하지만, 테스트된 코드가 '적절하게' 테스트되었는지까지는 판단하지 못한다. 어떤 코드가 테스트 중에 실행되었다 하더라도, 해당 테스트가 실제로 프로그램의 올바른 동작을 확인하는지는 보장할 수 없기 때문이다.
- Gcov는 GNU 프로젝트에서 제공하는 소스 코드 커버리지 프로그램이다.
- VB Watch는 Visual Basic 프로그램에 동적 분석 코드를 삽입하여 코드 커버리지, 호출 스택, 실행 추적, 객체 및 변수 상태 등을 모니터링하는 도구이다.
2. 3. 동적 테스팅
동적 테스팅은 일련의 테스트 케이스를 통해 프로그램을 실제로 실행하며 그 결과를 분석하는 방법이다. 이는 프로그램을 실행하지 않고 분석하는 정적 분석과는 상호 보완적인 기술이다. 예를 들어, 여러 스레드가 어떤 순서로 동작할지는 실행 환경에 따라 달라지기 때문에 정적 분석만으로는 예측하기 어렵다. 이러한 멀티스레드 처리와 관련된 버그는 동적 분석을 통해 발견해야 할 필요가 있다.정적 분석과 동적 분석을 함께 사용하면 버그 탐지의 정확도와 속도를 높일 수 있다. 특히 경합 상태, 데드락, 리소스 누수와 같이 프로그램을 실행해야만 드러나는 문제들을 효과적으로 분석할 수 있다[7]。 때로는 모델 검사나 증명 시스템과 같은 방법이 특정 버그를 찾는 데 더 효율적일 수 있으며, 이러한 기능이 동적 분석 도구에 포함되기도 한다.
프로그램의 품질과 안전성은 정적 분석으로 확인할 수 있는 부분이 많을수록 확보하기 쉽지만, 사용하는 프로그래밍 언어의 특성에 따라 적용 가능한 분석 방법이 달라진다. 정적 타입 언어는 동적 타입 언어보다 정적 분석 단계에서 더 많은 정보를 제공한다. 예를 들어, 자바와 같이 타입 시스템이 엄격한 언어는 위험한 타입 변환을 허용하지 않아 타입 안전성을 정적으로 보장하기 비교적 쉽다[8]。 반면, C/C++처럼 타입 시스템이 유연한 언어는 프로그래머가 타입 검사를 우회하여 타입 안전성을 해칠 수 있으므로, 정적 분석과 동적 분석을 병행하여 타입 관련 문제를 점검해야 한다. 최근에는 자바스크립트에 타입스크립트처럼 정적 타입 검사 기능을 도입하여, 동적 언어의 안전성을 강화하고 대규모 개발을 지원하려는 시도도 있다[9]。
2. 4. 메모리 오류 탐지
프로그램 실행 중 발생하는 메모리 누수, 잘못된 메모리 접근 등 메모리 관련 오류를 탐지하는 기법이다. 주요 도구는 다음과 같다.- AddressSanitizer: 리눅스, macOS, 윈도우 등에서 메모리 오류를 감지하는 도구이다. LLVM의 일부이다.
- Valgrind: 가상 프로세서에서 프로그램을 실행하며, malloc과 free의 오용과 같은 메모리 오류, 그리고 멀티스레드 프로그램의 경합 조건을 탐지할 수 있다.
- BoundsChecker: 윈도우 기반 애플리케이션의 메모리 오류를 감지하는 도구이다. Micro Focus의 DevPartner의 일부이다.
- Dmalloc: 메모리 할당과 누수를 점검하는 라이브러리이다. 소프트웨어를 다시 컴파일해야 하며, 모든 파일은 특수 C 헤더 파일 dmalloc.h를 포함해야 한다.
- Intel Inspector: C, C++, 그리고 포트란 애플리케이션을 위한 동적 메모리 오류 디버거로 윈도우와 리눅스에서 실행된다.
- OpenPAT: 프로그램 실행 시 동적 실행 추적 정보와 함께 툴을 호출해서 정적으로 어셈블리와 바이트코드를 인스트루먼트한다. 메모리 누수 감시에 사용된다.
- Parasoft Insure++는 런타임 메모리 분석과 오류 탐지 툴이다. 이것의 Inuse 컴포넌트는 시간에 따른 메모리 할당과 힙 사용, 블록 할당 등의 그래픽 뷰를 제공한다.
- Purify: 주로 메모리 손상 감지 및 메모리 누수 감지를 수행한다.
- Vector Fabrics Pareon Verify: 메모리 오류와 스레딩 오류를 애플리케이션에서 찾는다.
2. 5. 퍼징
퍼징은 다양한 입력을 사용하여 프로그램을 실행하는 테스트 기법이다. 종종 이러한 입력은 (적어도 부분적으로) 무작위로 생성된다. 그레이 박스 퍼저는 코드 커버리지를 사용하여 입력 생성을 안내한다.2. 6. 동적 기호 실행
동적 기호 실행(Dynamic Symbolic Executioneng|DSE) 또는 혼합 실행은 구체적인 입력을 기반으로 테스트 프로그램을 실행하고, 실행과 관련된 경로 제약 조건을 수집한다. 이후 제약 조건 해결기(일반적으로 SMT 해결기)를 사용하여 프로그램이 다른 제어 흐름 경로를 따르도록 하는 새로운 입력을 생성함으로써 테스트 스위트의 코드 범위를 늘리는 기법이다.[3] 동적 기호 실행은 일종의 퍼징(특히 "화이트 박스" 퍼징)으로 간주될 수 있다.2. 7. 동적 데이터 흐름 분석
동적 데이터 흐름 분석은 정보의 흐름을 소스에서 싱크로 추적한다.[4][5] 동적 데이터 흐름 분석의 형태에는 동적 테인트 분석과 동적 기호 실행 등이 있다.[4][5]2. 8. 불변식 추론
불변식(invariant) 추론은 프로그램이 실행되는 동안 변하지 않는 속성을 찾아내는 기법이다. Daikon은 이러한 동적 불변식 감지를 구현한 대표적인 시스템이다. Daikon은 프로그램을 실제로 실행시키면서 프로그램이 계산하는 값들을 관찰한다. 이후, 관찰된 실행 과정에서 항상 참(true)으로 유지되었던 속성들을 보고하는데, 이 속성들은 프로그램의 모든 실행에서도 참일 가능성이 높은 불변식으로 간주될 수 있다.2. 9. 보안 분석
동적 프로그램 분석은 프로그램 실행 중에 발생할 수 있는 보안 취약점을 찾아내는 데 효과적으로 활용될 수 있다.대표적인 예로 IBM Rational AppScan을 들 수 있는데, 이는 소프트웨어 개발 과정의 다양한 단계에서 적용 가능한 애플리케이션 보안 솔루션 제품군이다. 이 제품군에는 주로 동적 분석을 수행하는 'IBM Rational AppScan Standard Edition'과 'IBM Rational AppScan Enterprise Edition'이 포함된다. 부가적으로 정적 분석 기능을 제공하는 'IBM Rational AppScan Source Edition'도 함께 구성되어 있다.
2. 10. 동시성 오류
멀티스레드 프로그램에서는 여러 스레드가 실행되는 순서가 비결정적이기 때문에 경쟁 상태(Race condition)나 교착 상태(Deadlock)와 같은 동시성 오류가 발생하기 쉽다. 이러한 오류는 프로그램을 실행해보지 않고는 발견하기 어려운 경우가 많아 정적 분석만으로는 한계가 있다. 따라서 동적 분석을 통해 실제 실행 환경에서 발생할 수 있는 동시성 문제를 탐지하는 것이 중요하다.동적 분석을 이용해 동시성 오류를 탐지하는 여러 도구들이 있다.
- Parasoft Jtest: 런타임 오류 감지 기능을 사용하여 경쟁 상태, 예외 처리, 자원 및 메모리 누수, 보안 공격 취약점 등을 탐지한다.
- Valgrind: 프로그램을 가상 프로세서에서 실행하여 메모리 오류와 함께 멀티스레드 프로그램의 경쟁 상태를 탐지한다.
- Vector Fabrics Pareon Verify: 애플리케이션의 메모리 오류와 스레딩 오류를 찾는다.
- 인텔 인스펙터(Intel Inspector): Windows 환경에서 런타임 스레딩 오류 및 메모리 오류를 분석한다.
- 구글의 ThreadSanitizer: 데이터 경쟁(Data race) 감지 도구로, 경쟁적인 메모리 접근을 포착하기 위해 LLVM IR(Intermediate Representation)을 계측(instrument)한다.
정적 분석과 동적 분석은 상호 보완적인 기술이다. 두 가지 분석 방법을 조합하면 버그 탐지 정확도와 속도를 높일 수 있으며, 특히 경쟁 상태, 교착 상태, 리소스 누수와 같이 실제 실행을 통해 표면화되는 문제들을 효과적으로 분석할 수 있다[7].
2. 11. 프로그램 슬라이싱
프로그램 슬라이싱은 프로그램의 특정 동작에 영향을 미치는 코드 부분만을 추출하여, 해당 동작을 그대로 재현하는 최소한의 형태로 프로그램을 줄이는 기법이다. 이렇게 축소된 프로그램을 '슬라이스(slice)'라고 부르며, 이는 특정 동작 범위 내에서 원본 프로그램의 핵심 기능을 유지한다.완벽한 슬라이스를 찾는 것은 이론적으로 매우 어렵지만, 실제로는 특정 변수들의 값 변화를 추적하는 데이터 흐름 분석과 같은 알고리즘을 이용해 근사적인 슬라이스를 얻을 수 있다. 프로그램 슬라이싱은 주로 개발자가 프로그램 디버깅 과정에서 오류의 원인이 되는 코드 부분을 효율적으로 찾아내는 데 활용된다.
2. 12. 성능 분석
대부분의 성능 분석 도구는 동적 프로그램 분석 기법을 사용한다. 예를 들어, VB Watch는 비주얼 베이직 프로그램 실행 중 성능, 콜 스택, 실행 추적, 객체 상태, 변수 값, 코드 커버리지 등을 모니터링하여 성능 병목 현상을 파악하는 데 도움을 준다. OpenPAT는 프로그램 실행 시 동적 실행 추적 정보를 제공하여 성능 분석에 활용될 수 있다. Parasoft Insure++의 Inuse 컴포넌트는 시간에 따른 메모리 할당 및 힙 사용량 등을 시각적으로 보여주어 메모리 관련 성능 문제를 진단하는 데 유용하다. 또한, Valgrind는 프로그램을 가상 프로세서 환경에서 실행시켜 메모리 오류나 멀티스레드 환경에서의 경쟁 상태를 탐지함으로써 성능 저하의 근본적인 원인을 찾는 데 기여할 수 있다.3. 정적 분석과의 관계
정적 분석과 동적 분석은 상호 보완적인 기술이다. 예를 들어, 플랫폼이나 프로그래밍 언어에 관계없이 여러 스레드가 실행 환경에서 어떤 순서로 동작하는지는 일반적으로 비결정적이며, 정적 분석으로는 판단할 수 없는 경우가 많아 멀티스레드 처리에 관련된 버그를 간과할 우려가 있다. 이것을 동적 분석으로 보완할 필요가 있다.
정적 분석과 동적 분석을 조합함으로써 버그 탐지 정확도와 속도가 높아지고, 경합 상태나 데드락, 리소스 누수 등 실행해 보지 않으면 표면화되지 않는 처리를 철저하게 분석할 수 있다[7]。
정적 분석, 동적 분석으로 발견할 수 있는 것은 모델 검사, 증명 시스템으로 더욱 효율적으로 발견할 수 있는 경우도 있다. 이러한 기능을 동적 분석 안에 포함하고 있는 경우도 있다.
프로그램을 실행하지 않고도, 즉 정적 분석으로 판단할 수 있는 경우가 많을수록 프로그램의 품질과 안전성을 담보하기 쉬워지지만, 프로그래밍 언어에 따라 적용 가능한 분석 방법의 정도가 달라지기도 한다. 정적 타입 언어는 동적 타입 언어보다 정적 분석 시 더 많은 정보를 제공할 수 있다. 자바와 같이 강력한 타입 언어에서는 타입 시스템을 무시한 위험한 변환을 허용하지 않으므로, 타입 안전성을 정적으로 보장하기 쉽다[8]。한편 C/C++와 같이 약하게 타입이 지정된 언어에서는 타입 시스템을 무시한 위험한 변환으로 컴파일 시의 타입 검사를 우회하는 것도 가능하며, 프로그래머가 타입 안전성을 쉽게 파괴할 수도 있기 때문에 타입 안전성에 관해서도 정적 분석과 동적 분석을 병용할 필요가 있다. 자바스크립트에 대한 타입스크립트와 같이, 정적 분석을 촉진하여 안전성을 강화하고 대규모 개발에도 견딜 수 있도록 동적 언어에 대해 정적 타입 검사 기구를 도입한 사례도 존재한다[9]。
4. 도구
- Avalanche
- BoundsChecker: 윈도우 기반 애플리케이션의 메모리 오류를 탐지한다. 현재는 DevPartner의 일부이다.
- Cenzic: 보안 취약점 분석을 위한 웹 애플리케이션 스캐닝 도구를 제공한다.
- ClearSQL: PL/SQL 코드의 리뷰, 품질 관리, 시각화를 지원한다.
- CodeDynamics[10]
- Daikon: 프로그램 실행 중 변하지 않는 값(불변값)을 동적으로 탐지한다. 프로그램 실행 결과를 관찰하여 전체 실행 기간 동안 참일 가능성이 높은 값을 보고한다.
- Dmalloc: 메모리 할당 오류와 누수를 검사하는 라이브러리이다. 사용하려면 소프트웨어를 재컴파일하고 모든 파일에 특정 헤더 파일(dmalloc.h)을 포함해야 한다.
- DynInst: 런타임 코드 패칭 라이브러리로, 컴파일된 실행 파일에 동적 분석 코드를 삽입하는 도구를 개발하는 데 유용하다. 일반적으로 소스 코드 수정이나 재컴파일 없이 사용할 수 있지만, 디버깅 정보가 있으면 더 용이하다.
- Gcov: GNU 프로젝트의 소스 코드 커버리지 측정 프로그램이다.
- HP Security Suite
- IBM Rational AppScan
- Iroh.js: 자바스크립트를 위한 런타임 코드 분석 라이브러리이다. 코드 실행 경로 추적, 특정 패턴 감지, 실행 동작 조작 등의 기능을 제공한다.
- Intel Thread Checker
- Intel Parallel Inspector
- Jalangi
- MemoryScape[11]
- OpenPAT: 프로그램 실행 시 동적 실행 추적 정보를 이용해 정적으로 어셈블리나 바이트코드를 수정(인스트루먼트)한다. 메모리 누수 감시에 사용된다.
- Parasoft Insure++: 런타임 메모리 분석 및 오류 탐지 도구이다. 시간에 따른 메모리 할당, 힙 사용량 등을 시각적으로 보여주는 기능을 포함한다.
- Parasoft Jtest: 경쟁 상태, 예외 처리, 자원 및 메모리 누수, 보안 취약점 등의 결함을 찾기 위해 런타임 오류 탐지 기능을 사용한다.
- CriticalBlue의 Prism
- Purify: 주로 메모리 오염 및 메모리 누수를 탐지한다.
- TotalView[12]
- Valgrind: 프로그램을 가상 프로세서 환경에서 실행하여 메모리 오류나 멀티스레드 프로그램의 경쟁 상태 등을 탐지한다.
- VB Watch: 비주얼 베이직 프로그램에 동적 분석 코드를 삽입하여 성능, 호출 스택, 실행 추적, 객체 상태, 변수 값, 코드 커버리지 등을 모니터링한다.
- Vector Fabrics Pareon Verify: 애플리케이션의 메모리 오류와 스레딩 오류를 찾는다.
참조
[1]
학술지
Just enough semantics: An information theoretic approach for IR-based software bug localization
https://linkinghub.e[...]
2018-01-01
[2]
서적
The Art of Software Testing
John Wiley and Sons.
1979
[3]
학술지
State of the art: Dynamic symbolic execution for automated test generation
https://www.scienced[...]
2013-09-01
[4]
서적
"{SYMSAN}: Time and Space Efficient Concolic Execution via Dynamic Data-flow Analysis"
https://www.usenix.o[...]
2022
[5]
서적
Proceedings of the 15th ACM conference on Computer and communications security
Association for Computing Machinery
2008-10-27
[6]
간행물
The Ariane 5 Software Failure
Software Engineering Notes
1997-03
[7]
웹사이트
동적 분석
http://www.coverity.[...]
Coverity, Inc.
[8]
웹사이트
強く型付けされているJavaの理解に必修の“型変換”:【改訂版】Eclipseではじめるプログラミング(18)(2/3 ページ) - @IT
https://atmarkit.itm[...]
[9]
웹사이트
静的型チェックを行うTypeScriptで品質を担保しよう (1/3)|CodeZine(コードジン)
https://codezine.jp/[...]
[10]
웹사이트
CodeDynamics
http://www.roguewave[...]
[11]
웹사이트
MemoryScape
http://roguewave.jp/[...]
[12]
웹사이트
TotalView
http://roguewave.jp/[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com