맨위로가기

정적 프로그램 분석

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

정적 프로그램 분석은 소프트웨어의 신뢰성 및 안전성을 높이기 위해 소스 코드를 실행하지 않고 분석하는 기술이다. 소프트웨어 개발 초기 단계에서 잠재적인 오류나 보안 취약점을 발견하여 수정 비용을 절감하고 품질을 향상시키는 데 기여한다. 정적 분석은 다양한 수준으로 수행되며, 유닛 레벨, 기술 레벨, 시스템 레벨, 미션/비즈니스 수준으로 분류된다. 정형 방법론, 데이터 기반 분석, 자동 해결 등 다양한 기술과 도구가 존재하며, 의료 소프트웨어, 원자력 소프트웨어, 항공 소프트웨어 등 신뢰성이 중요한 분야에서 널리 활용된다.

더 읽어볼만한 페이지

  • 품질 보증 - 소프트웨어 품질보증
    소프트웨어 품질 보증(SQA)은 소프트웨어 개발 과정 전반의 품질 확보를 위한 활동으로, 정책 및 절차 준수, 분석, 설계, 테스트 등의 활동을 포함하며, ISO/IEC/IEEE 90003:2018과 같은 표준 준수 및 변경 제어 위원회 운영을 통해 품질을 관리한다.
  • 정적 프로그램 분석 - 호어 논리
    호어 논리는 프로그램의 실행 전후 조건을 명시하고 코드 조각이 조건을 어떻게 변화시키는지 추론하는 규칙을 제공하여 프로그램의 정확성을 형식적으로 검증하는 논리 시스템이다.
  • 정적 프로그램 분석 - Perl::Critic
    Perl::Critic은 Perl 코드의 품질, 스타일, 오류를 검사하여 더 나은 코드를 작성하도록 돕는 정적 분석 도구이다.
  • 소프트웨어 리뷰 - 코드 검토
    코드 검토는 작성된 코드의 품질 향상과 오류 감소를 위해 수행되는 검토 방식이며, 오류 제거, 디버깅, 유지보수, 기능 개선에 효과적이고 소프트웨어의 진화 가능성과 유지보수성에 영향을 미친다.
  • 소프트웨어 리뷰 - 페어 프로그래밍
    페어 프로그래밍은 두 명의 프로그래머가 한 컴퓨터로 코드를 함께 작성하며, 드라이버와 네비게이터 역할을 번갈아 수행하여 지식 공유, 실시간 코드 검토, 문제 해결 능력 향상 등의 이점을 제공하는 소프트웨어 개발 방법이다.
정적 프로그램 분석
개요
정적 프로그램 분석의 예
정적 프로그램 분석의 예
유형소프트웨어 분석
분야소프트웨어 공학
목적소프트웨어 결함 찾기
상세 정보
설명실행 없이 컴퓨터 프로그램 분석
방법컴퓨터 과학
수학
소프트웨어 공학

2. 정적 분석의 이유

소프트웨어 메트릭과 리버스 엔지니어링은 정적 분석의 한 형태로 묘사될 수 있다. 특히 임베디드 시스템에서 소프트웨어 메트릭을 끌어내는 것과 정적 분석은 소프트웨어 품질 목표를 정의함으로써 점점 서로를 효율적으로 사용하게 된다.[34]

시스템에서 사용되는 소프트웨어의 속성들을 검사하고 잠재적인 취약한 코드의 위치를 찾는 것은 정적 분석의 상업적 사용으로서 점차 증가하고 있다.[35] 예를 들어 아래와 같은 산업들은 정적 코드 분석의 사용을 통해 점점 정교하고 복잡해지는 소프트웨어의 질적 향상이라는 인식을 하고 있다.

산업내용
의료 소프트웨어미국 식품의약국(FDA)은 의료 기기에 대한 정적 분석의 사용을 확인했다.[6]
원자력 관련 소프트웨어영국에서는 원자력 규제청(ONR)이 원자로 보호 시스템에 대한 정적 분석의 사용을 권장한다.[7]
항공 소프트웨어동적 분석과 결합하여 사용된다.[8]
자동차 및 기계기능 안전 기능은 각 자동차 제품 개발 단계의 필수적인 부분이다 (ISO 26262, 섹션 8).



VDC Research는 2012년 28.7%의 임베디드 소프트웨어 엔지니어들이 현재 정적 분석 툴을 사용하고 있으며, 2년 안에 39.7%가 사용할 것이라고 분석했다.[36] 2010년에는 유럽 리서치 프로젝트에서 인터뷰에 응한 60%의 개발자들이 적어도 자신의 기본 IDE에 내장된 정적 분석기를 사용한다고 조사되었다. 그러나 단지 10%의 직원들만이 추가적인 분석 툴을 사용하였다.[37]

또한 응용 프로그램 보안 산업에서 정적 애플리케이션 보안 테스트(SAST)가 사용되고 있다. SAST는 Microsoft에서 정의한 SDL과 같은 보안 개발 수명 주기(SDL)의 중요한 부분이며,[38] 소프트웨어 회사에서 흔히 사용되는 관행이다.[39]

3. 정적 분석 툴의 종류

객체 관리 그룹(OMG)은 소프트웨어 품질 측정 및 평가에 필요한 소프트웨어 분석 유형에 관한 연구를 발표했다. "CISQ 권고에 따라 복원력 있고 안전하며 효율적이며 쉽게 변경 가능한 IT 시스템을 제공하는 방법"이라는 문서에서는 소프트웨어 분석을 세 가지 수준으로 설명한다.[40][13]


  • '''유닛 레벨:''' 프로그램 문맥과의 연결 없이 특정한 프로그램 안이나 서브루틴에서 발생하는 분석.
  • '''기술 레벨:''' 문제를 찾고 명백한 긍정오류를 피하기 위해서, 전체 프로그램의 전체적이고 의미적인 관점을 얻기 위하여 유닛 프로그램들 간의 상호작용들을 고려하는 분석.
  • '''시스템 레벨:''' 유닛 프로그램들 간의 상호작용들은 고려하지만 한 기술이나 한 언어에 제한되지 않는 분석.


추가적인 수준의 소프트웨어 분석을 정의할 수 있다.

  • '''미션/비즈니스 수준:''' 엔터프라이즈 또는 프로그램/미션 수준 활동의 일부로 소프트웨어 시스템 내에서 운영을 위해 구현된 비즈니스/미션 계층 용어, 규칙 및 프로세스를 고려하는 분석. 이러한 요소는 특정 기술 또는 프로그래밍 언어로 제한되지 않고 구현되며, 많은 경우 여러 언어로 분산되지만 미션 보장을 위한 시스템 이해를 위해 정적으로 추출 및 분석된다.


사전 컴파일러(AOT 컴파일러)는 언어 사양에는 부합하지만 로직의 정당성이 의심스러운 코드나, 미정의 동작을 일으킬 수 있는 코드를 감지하여 경고를 내보내는 경우가 대부분이다. 다만, 컴파일러로는 다루기 어려운 사항도 있기 때문에, 독립된 정적 코드 분석 전용 툴을 보조적으로 병용하는 경우도 많다. 통합 개발 환경에 표준 탑재되어 있는 것도 있고, 플러그인이나 애드온으로 개발자가 추가할 수 있도록 되어 있는 것도 있다. 코드 편집기에서 문제가 있는 부분을 강조 표시하는 등, 소스 코드를 컴파일하지 않고 실시간으로 지적해 주는 것도 있다.

4. 정적 분석의 활용 분야

정적 분석은 다양한 산업 분야에서 활용되며, 특히 안전이 매우 중요한 시스템에서 그 중요성이 강조된다.


  • 의료 소프트웨어: 미국 식품의약국(FDA)은 의료 기기에 대한 정적 분석 사용을 확인했다.[6]
  • 원자력 소프트웨어: 영국의 원자력 규제청(ONR)은 원자로 보호 시스템에 대한 정적 분석 사용을 권장한다.[7]
  • 항공 소프트웨어: 동적 분석과 함께 사용되어 안전성을 높인다.[8]
  • 자동차 및 기계: 기능 안전 기능은 각 자동차 제품 개발 단계의 필수적인 부분이다. (ISO 26262, 섹션 8)
  • 애플리케이션 보안: 정적 애플리케이션 보안 테스트(SAST)는 보안 개발 수명 주기(SDL)의 중요한 부분이다.[11]

5. 정형 방법론

정형 방법론은 엄격한 수학적 방법을 사용하여 소프트웨어의 정확성을 검증하는 방법이다. 정지 문제에 대한 간단한 축약으로, 임의의 프로그램에서 모든 가능한 런타임 에러를 찾는 것은 결정 불가능하다고 증명될 수 있다. (임의의 프로그램이 런타임 에러를 보이든지 아니든지 항상 정확한 답을 하는 수학적 방법론은 존재하지 않는다.) 이 결과는 쿠르트 괴델이나 앨런 튜링의 연구에서부터 시작된다.[41] 많은 결정 불가능한 질문 중에서 유용한 근사해를 얻는 시도는 가능하다.

정형 정적 분석의 구현 기술에는 다음이 포함된다.[41]


  • 모델 확인은 시스템이 유한 상태를 갖거나, 추상화에 의해 유한 상태로 될 수 있다고 여긴다.
  • 데이터 흐름 분석은 가능한 값들의 집합에 대한 정보를 모으는 격자 기반 기법이다.
  • 요약 해석
  • 흰서리 논리
  • 기호 실행은 코드의 특정 시점에서 변이된 변수들의 값을 표현하는 수학적 표현을 끌어낼 때 사용된다.

6. 데이터 기반 정적 분석

데이터 기반 정적 분석은 광범위한 코드베이스를 활용하여 코딩 규칙을 추론하고 분석의 정확성을 향상시킨다.[16][17] 예를 들어, 깃허브에서 사용 가능한 모든 Java 오픈 소스 패키지를 사용하여 훌륭한 분석 전략을 학습할 수 있다. 규칙 추론에는 기계 학습 기법을 사용할 수 있다.[18] 또한, 과거의 많은 수정 사항과 경고로부터 학습하는 것도 가능하다.[16]

7. 자동 해결

정적 분석기는 경고를 생성한다. 특정 유형의 경고에 대해서는 자동화된 해결 기술을 설계하고 구현하는 것이 가능하다. 예를 들어, Logozzo와 Ball은 C# ''cccheck''에 대한 자동화된 해결 방안을 제안했다.[19]

8. 정적 코드 분석 도구

다양한 프로그래밍 언어에 대한 정적 코드 분석 도구들이 존재한다.

언어도구라이선스비고
C, C++[http://www.hitachi-solutions.co.jp/anywarp_codedirectorforc/ anyWarp CodeDirector for C/C++]상용히타치 솔루션즈
C, C++[http://mtc.epfl.ch/software-tools/blast/ BLAST]Apache License→ CPA 체커
C++Parasoft [https://www.parasoft.com/product/cpptest/ C++test]상용Parasoft
C[http://www.mario-konrad.ch/index.php?page=14003 C99parser]GPL
C[http://manju.cs.berkeley.edu/ccured/ CCured]BSD 라이선스일부 동적 분석
C, C++[https://www.ubiquitous-ai.com/products/codesonar/ CodeSonar]상용
C, C++[https://www.synopsys.com/ja-jp/software-integrity/security-testing/static-analysis-sast.html Coverity]상용
C, C++[http://sourceforge.net/projects/cppcheck/ cppcheck]GPL
C[http://www.cs.umd.edu/~jfoster/cqual/ Cqual]GPL
C[http://www.spinellis.gr/cscout CScout]소스 코드 분석 및 리팩토링 브라우저. 프리프로세서의 구문도 처리.
C, C++[http://iwi-cxsuite.com/ Checkmarx CxSuite]상용컴파일 불필요. 소스 코드만으로 분석 가능.
C[http://www.dwheeler.com/flawfinder/ Flawfinder]GPL
C, C++[http://www.redlizards.com Goanna]상용
C, C++Fortify SCA [28]상용
C[http://introspector.sourceforge.net/ introspector]GPLC언어용이지만, 다른 언어에도 대응 중.
C, C++Klocwork [http://www.klocwork.com/jp/ Insight]상용
C, C++[http://www.ldra.com/en/software-quality-test-tools/group/by-product-module/ldra-tool-suite LDRA]상용MISRA 주요 멤버
C[http://www.cs.berkeley.edu/~daw/mops/ MOPS]BSD풍 라이선스
C++[http://opencxx.sourceforge.net/ OpenC++]
C, C++[http://www.programmingresearch.com/QAC_MAIN.html QAC], [http://www.programmingresearch.com/QACPP_MAIN.html QAC++]상용
C, C++후지쯔 소프트웨어 [http://jp.fujitsu.com/group/fst/services/pgr/ PGRelief C/C++]상용
C, C++[http://pmd.sourceforge.net/cpd.html PMD's Copy/Paste Detector]BSD풍 라이선스
C, C++[http://jp.mathworks.com/discovery/static-code-analysis.html PolySpace]상용
C, C++[http://www.microsoft.com/whdc/devtools/tools/PREfast.mspx PREfast]Windows용 장치 드라이버를 개발하는 데 사용하는 WDK의 일부
C, C++[http://www.tokyo-densan.co.jp/product/ads/Review-C.html Review-C]상용
C[http://smatch.sourceforge.net/ Smatch]C언어 소스 체커. 주로 리눅스 커널용.
C[https://sparse.wiki.kernel.org/index.php/Main_Page Sparse]GPL
C[http://www.cs.utah.edu/~regehr/stacktool/ Stacktool]
C[http://splint.org/ Splint]GPL
C, C++Visual Studio[29]
C, C++[http://clang-analyzer.llvm.org/ Clang Static Analyzer]BSD풍 라이선스
C, C++Clang-Tidy[30]
C[http://adlint.sourceforge.net/ AdLint]GPL
자바Klocwork Insight, Visual Studio, [https://www.synopsys.com/ja-jp/software-integrity/security-testing/static-analysis-sast.html Coverity], Checkmarx CxSuite, [http://sourceforge.net/projects/devadvantage DevMetrics and DevAdvantage], [https://juliasoft.com/julia-analyzer/ Julia], Parasoft [http://www.parasoft.co.jp/jsp/ja/products/dottest.jsp dotTEST], Fortify SCA [28], 사이터, [http://www.dsm.fordham.edu/~ftnchek/ FTNCHEK], W3C [http://validator.w3.org/ 마크업 유효성 검사 서비스], [https://www.sonarqube.org/ SonarQube], [http://www.garret.ru/~knizhnik/jlint/ReadMe.htm AntiC], anyWarp CodeDirector, [http://checkstyle.sourceforge.net/ Checkstyle], [http://cobertura.sourceforge.net/ Cobertura], [http://secure.ucd.ie/products/opensource/ESCJava2/ ESC/Java2], [http://findbugs.sourceforge.net/ FindBugs], [http://www.hammurapi.com/dokuwiki/doku.php Hammurapi], 오라클 [http://www.oracle.com/technology/products/jdev JDeveloper], [http://pmd.sourceforge.net/ PMD], RIPS, [http://spoon.gforge.inria.fr Spoon], [http://wala.sourceforge.net/ WALA], 후지쯔 소프트웨어 [http://jp.fujitsu.com/group/fst/services/pgr-java/ PGRelief J], Parasoft [http://www.parasoft.co.jp/jsp/ja/products/jtest.jsp Jtest], IntelliJ IDEACobertura는 단위 테스트 코드 커버리지를 자동 계산
C#[https://www.synopsys.com/ja-jp/software-integrity/security-testing/static-analysis-sast.html Coverity], Checkmarx CxSuite, Fortify SCA[28], [https://juliasoft.com/julia-analyzer/ Julia]
안드로이드안드로이드 스튜디오
Checkmarx CxSuite, [http://search.cpan.org/dist/fluff/ fluff], [http://search.cpan.org/dist/Perl-Critic/ Perl::Critic]
PHPPHP, 사이터(Sider), Checkmarx CxSuite, [http://pmd.sourceforge.net/cpd.html PMD의 복사/붙여넣기 감지기], RIPS, Fortify SCA[28], PhpMetrics[31], [https://www.sonarqube.org/ SonarQube]-l 옵션을 붙여 실행하면 Lint와 유사한 기본적인 검사를 수행한다.
파이썬사이터, 포티파이 SCA[28], [http://pychecker.sourceforge.net/ PyChecker], [http://divmod.org/trac/ Pyflakes], [http://www.logilab.org/projects/pylint PyLint], [https://www.sonarqube.org/ SonarQube]
.NETCheckmarx CxSuite, Fortify SCA[28], RIPS
VB.NETCheckmarx CxSuite, Fortify SCA[28], Parasoft dotTEST, Visual Studio, [https://www.sonarqube.org/ SonarQube]
ASP.NETCheckmarx CxSuite, Fortify SCA[28]
ABAPFortify SCA[28]
ActionScriptFortify SCA[28]
ApexFortify SCA[28]
COBOLFortify SCA[28]
루비사이터(Sider), Checkmarx CxSuite, Fortify SCA[28]
자바스크립트Parasoft [http://www.parasoft.co.jp/jsp/ja/products/webtest.jsp WebTest], [https://www.sonarqube.org/ SonarQube], ESLint[32], Checkmarx CxSuite, Fortify SCA[28]
XML[Fortify SCA](https://ja.wikipedia.org/wiki/Fortify_SCA), [http://wiki.eclipse.org/index.php/Introduction_to_the_WSDL_Editor WSDL 유효성 검사기], Parasoft [http://www.parasoft.co.jp/jsp/ja/products/soatest.jsp SOAtest], 사이다, Checkmarx CxSuite, SonarQube(https://www.sonarqube.org/)이클립스
여러 언어 지원Checkmarx CxSuite, SonarQube


참조

[1] 학술지 Industrial Perspective on Static Analysis. http://www.ida.liu.s[...] 1995-03
[2] 학술지 A survey on automated dynamic malware-analysis techniques and tools https://doi.org/10.1[...] 2008-03-05
[3] 학술지 Just enough semantics: An information theoretic approach for IR-based software bug localization https://linkinghub.e[...] 2018-01-01
[4] 간행물 Software Quality Objectives for Source Code http://web1.see.asso[...] 2010
[5] 간행물 Improving Software Security with Precise Static and Runtime Analysis http://research.micr[...] Benjamin Livshits 2006
[6] 웹사이트 Infusion Pump Software Safety Research at FDA https://www.fda.gov/[...] Food and Drug Administration 2010-09-08
[7] 웹사이트 Computer based safety systems http://www.hse.gov.u[...] 2013-05-15
[8] 간행물 Position Paper CAST-9. Considerations for Evaluating Safety Engineering Approaches to Software Assurance http://www.faa.gov/a[...] FAA, Certification Authorities Software Team (CAST) 2002-01
[9] 웹사이트 Automated Defect Prevention for Embedded Software Quality http://alm.parasoft.[...] VDC Research 2012-04-10
[10] 논문 Empirical study of tool support in highly distributed research projects https://ieeexplore.i[...] IEEE 2010
[11] 서적 The Security Development Lifecycle: SDL: A Process for Developing Demonstrably More Secure Software Microsoft Press 2006
[12] 간행물 Deploying Static Application Security Testing on a Large Scale https://www.brucker.[...] 2014
[13] 웹사이트 OMG Whitepaper | CISQ - Consortium for Information & Software Quality http://www.omg.org/C[...] 2013-10-18
[14] 웹사이트 A Survey of Automated Techniques for Formal Software Verification http://www.kroening.[...] Transactions On CAD 2015-05-11
[15] 웹사이트 A Formal Methods-based verification approach to medical device software analysis http://embeddeddsp.e[...] Embedded Systems Design 2010-09-09
[16] 웹사이트 Learning from other's mistakes: Data-driven code analysis. https://www.slidesha[...] 2015-04-13
[17] 서적 Evaluation and Assessment in Software Engineering Association for Computing Machinery 2021-06-21
[18] 서적 Proceedings of the 2015 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages, and Applications - OOPSLA 2015 https://ora.ox.ac.uk[...]
[19] 학술지 Modular and verified automatic program repair http://dx.doi.org/10[...] 2012-11-15
[20] 문서 Industrial Perspective on Static Analysis 1995-03
[21] 문서 静的コード分析ツールと IBM Rational Team Concert との統合 - IBM Documentation https://www.ibm.com/[...]
[22] 문서 Software Quality Objectives for Source Code http://web1.see.asso[...]
[23] 문서 Improving Software Security with Precise Static and Runtime Analysis http://research.micr[...] 2006
[24] 웹사이트 Infusion Pump Software Safety Research at FDA http://www.fda.gov/M[...] Food and Drug Administration 2010-09-09
[25] 문서 Computer based safety systems http://www.hse.gov.u[...]
[26] 웹사이트 Automated Defect Prevention for Embedded Software Quality http://blog.parasoft[...] VDC Research 2012-04-10
[27] 웹사이트 A Formal Methods-based verification approach to medical device software analysis http://embeddeddsp.e[...] Embedded Systems Design 2010-09-09
[28] 문서 多言語(17)混在のシステムでの横断的解析が可能
[29] 문서 C/C++ code analyzers | Microsoft Learn https://learn.micros[...]
[30] 문서 Clang-Tidy — Extra Clang Tools git documentation https://clang.llvm.o[...]
[31] 문서 PhpMetrics, static analysis for PHP - by Jean-François Lépine https://www.phpmetri[...]
[32] 문서 Find and fix problems in your JavaScript code - ESLint - Pluggable JavaScript Linter https://eslint.org/
[33] 저널인용 Industrial Perspective on Static Analysis. http://www.ida.liu.s[...] 1995-03
[34] 문서 "Software Quality Objectives for Source Code" http://web1.see.asso[...]
[35] 문서 Improving Software Security with Precise Static and Runtime Analysis http://research.micr[...]
[36] 웹인용 Automated Defect Prevention for Embedded Software Quality http://alm.parasoft.[...] VDC Research 2012-04-10
[37] 논문 Prause, Christian R., René Reiners, and Silviya Dencheva
[38] 논문 M. Howard and S. Lipner
[39] 논문 Achim D. Brucker and Uwe Sodan
[40] 웹사이트 http://www.omg.org/C[...]
[41] 웹인용 A Survey of Automated Techniques for Formal Software Verification http://www.kroening.[...] Transactions On CAD 2015-05-11



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com