프로그램 분석
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
프로그램 분석은 프로그램의 특성을 파악하기 위한 기법으로, 크게 정적 분석과 동적 분석으로 나뉜다. 정적 프로그램 분석은 프로그램을 실행하지 않고 소스 코드나 바이너리 코드를 분석하여 컴파일러 최적화, 보안 취약점 분석, 코드 품질 검사 등에 활용된다. 정적 분석은 제어 흐름 분석, 데이터 흐름 분석, 추상 해석, 타입 시스템, 효과 시스템, 모델 검사 등 다양한 기법을 포함한다. 동적 프로그램 분석은 프로그램을 실행하면서 프로그램의 동작을 분석하며, 테스팅, 모니터링, 프로그램 슬라이싱 등이 있다.
더 읽어볼만한 페이지
- 프로그램 분석 - 데이터 흐름 분석
데이터 흐름 분석은 프로그램의 제어 흐름 그래프를 바탕으로 변수의 정의, 사용, 생존 여부를 분석하며, 전이 함수와 결합 연산을 통해 데이터 흐름 정보를 계산하고 반복적으로 갱신하여 해를 구한다. - 프로그램 분석 - 정적 프로그램 분석
정적 프로그램 분석은 소프트웨어 개발 시 코드를 실행 없이 분석하여 오류, 보안 취약점, 코딩 표준 위반 등을 탐지하는 기술로, 개발 비용 절감, 품질 향상, 시스템 신뢰성 확보에 기여하며 다양한 레벨로 분석 가능하다.
프로그램 분석 | |
---|---|
프로그램 분석 | |
분야 | 컴퓨터 과학 |
유형 | 자동화 분석, 수동 분석 |
관련 주제 | 프로그래밍 언어, 컴파일러, 소프트웨어 테스팅, 소프트웨어 유지보수, 소프트웨어 신뢰성 |
주요 분석 기법 | |
정적 분석 | 추상 해석, 형식 검사, 데이터 흐름 분석, 제어 흐름 분석 |
동적 분석 | 프로파일링 (컴퓨터 프로그래밍), 테스팅, 기호 실행 |
응용 분야 | |
소프트웨어 개발 | 컴파일러 최적화, 버그 탐지, 취약점 분석 |
보안 | 악성코드 분석, 침입 탐지 |
도구 | |
정적 분석 도구 | FindBugs, SonarQube |
동적 분석 도구 | Valgrind, GDB |
2. 정적 프로그램 분석
정적 프로그램 분석은 프로그램을 실행하지 않고 소스 코드나 바이너리 코드를 분석하여 프로그램의 특성을 파악하는 기법이다.[2] 컴파일러 최적화, 보안 취약점 분석, 코드 품질 검사 등 다양한 목적으로 활용된다.
정적 분석은 프로그램 개발 단계에서 취약점을 발견하여 수정하기 쉽게 만들어 준다.[2] 이는 테스트 단계에서 발견된 취약점을 수정하는 것보다 효율적이다.
하지만 정적 분석은 계산적으로 결정 불가능 문제가 많아, 항상 올바른 답을 보장하지는 않는다.[2] 거짓 부정 (문제를 놓침) 또는 거짓 긍정 (문제가 없는데 있다고 판단)이 발생할 수 있다. 그럼에도 불구하고 정적 분석은 취약점 수를 줄이거나 특정 유형의 취약점이 없음을 보증하는 데 유용하다.
프로그램 최적화 측면에서 계산 불가능한 분석을 다루는 두 가지 전략은 다음과 같다.
# 최적화 컴파일러처럼 빠른 시간 안에 완료되어야 하는 경우, 제한된 시간 안에 올바른 최적화만 찾는 분석의 축소 버전을 사용한다.
# 타사 최적화 도구는 잘못된 최적화를 생성하지 않도록 구현되지만, 최적화를 찾을 때까지 무한정 실행될 수 있다. 이 경우 개발자가 직접 중지하거나 코드를 수정해야 할 수 있다.
C와 같이 완전히 정의되지 않은 언어의 경우, 최적화 컴파일러는 의미가 지정되지 않은 코드를 발견하면 런타임에 어떤 결과(충돌 포함)든 생성할 수 있다.
2. 1. 제어 흐름 분석
제어 흐름 분석은 프로그램 실행 중에 어떤 함수가 호출될 수 있는지에 대한 정보를 얻는 것을 목표로 한다. 수집된 정보는 프로그램의 명령어를 노드로, 제어 흐름을 간선으로 나타내는 제어 흐름 그래프(CFG)로 표현된다. CFG는 코드 블록과 루프를 식별하여 컴파일러 최적화의 시작점이 된다.[2]2. 2. 데이터 흐름 분석
데이터 흐름 분석은 프로그램의 각 지점에서 값에 대한 정보와 시간이 지남에 따라 값이 어떻게 변경되는지 수집하도록 설계된 기술이다. 이 기술은 컴파일러가 코드를 최적화하는 데 자주 사용된다.데이터 흐름 분석의 가장 잘 알려진 예 중 하나는 테인트 검사이다. 테인트 검사는 사용자로부터 제공된 데이터를 포함하는 모든 변수를 "테인트"(오염)된, 즉 안전하지 않은 것으로 간주하고, 해당 변수가 위생 처리될 때까지 사용되지 않도록 방지한다.[2] 이 기술은 SQL 삽입 공격을 방지하는 데 자주 사용된다. 테인트 검사는 정적이거나 동적으로 수행될 수 있다.
2. 3. 추상 해석
추상 해석은 프로그램을 실제로 실행하지 않고도 프로그램의 가능한 실행에 대한 정보를 추출할 수 있게 해준다.[2] 이 정보는 컴파일러가 가능한 최적화를 찾거나 특정 종류의 버그에 대해 프로그램을 인증하는 데 사용될 수 있다.2. 4. 타입 시스템
타입 시스템은 프로그램의 각 부분에 타입을 부여하고, 타입 검사를 통해 타입 오류를 찾아내는 방법이다. 타입 시스템의 목적은 특정한 속성에 따라 올바르다고 판단되는 프로그램의 부분 집합을 선택하는 것이다.타입 검사는 프로그래밍 객체가 사용되는 방식과 수행할 수 있는 작업을 제한하며, 컴파일러 또는 인터프리터에 의해 수행된다. 이는 부호 있는 값을 부호 없는 변수에 할당하지 않도록 하여 취약점을 예방하는 데 도움이 된다. 타입 검사는 정적(컴파일 시간), 동적(런타임), 또는 이 둘을 결합하여 수행할 수 있다.
타입 추론이나 소스 코드의 타입 주석으로 명시적으로 제공되는 정적 타입 정보는 박스 배열을 언박스 배열로 바꾸는 등의 최적화를 수행하는 데 사용될 수 있다.
2. 5. 효과 시스템
효과 시스템(Effect system영어)은 함수나 메서드의 실행으로 인해 발생하는 부작용(effect영어)을 분석하는 시스템이다.[2] 효과 종류와 효과 영역을 명시하여 프로그램의 동작을 예측하고, 잠재적인 오류를 방지한다.3. 동적 프로그램 분석
동적 프로그램 분석은 프로그램을 실행하면서 프로그램의 동작을 분석하는 기법이다. 런타임 정보를 활용하여 정적 분석보다 정확한 분석 결과를 얻을 수 있지만, 분석 대상 실행에 한정된다는 단점이 있다. 또한 런타임 검사로 인해 프로그램의 성능 저하가 발생할 수 있다.[1]
3. 1. 테스팅
소프트웨어는 품질을 보장하고, 안정적인 방식으로 예상대로 작동하며, 함께 작동할 수 있는 다른 소프트웨어와 충돌을 일으키지 않도록 테스트해야 한다. 테스트는 입력값을 사용하여 프로그램을 실행하고, 해당 프로그램의 동작과 생성된 출력을 평가하여 수행된다.보안 요구 사항이 명시되지 않은 경우에도, 공격자가 소프트웨어를 조작하여 정보를 훔치거나, 소프트웨어의 정상적인 작동을 방해하거나, 이를 통해 사용자를 공격하는 것을 방지하기 위해 추가적인 보안 테스트를 수행해야 한다.
3. 2. 모니터링
프로그램 모니터링은 프로그램의 자원 사용, 이벤트, 상호 작용 등 다양한 종류의 정보를 기록하고 로깅하여 비정상적인 동작의 원인을 찾거나 정확히 지적할 수 있도록 검토할 수 있게 한다. 또한 보안 감사를 수행하는 데 사용할 수 있다. 프로그램의 자동화된 모니터링은 때때로 런타임 검증이라고 한다.[1]참조
[1]
서적
Principles of program analysis
https://books.google[...]
Springer
2015
[2]
간행물
Pixy: A static analysis tool for detecting web application vulnerabilities
IEEE
2006-05
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com