{{위키데이터 속성 추적}}
'''방어적 프로그래밍'''(Defensive programming)은 예상치 못한 입력에도 한 [[소프트웨어]]가 계속적 기능 수행을 보장할 수 있도록 고안된 [[방어적 설계]]의 한 형태이다. 이 생각은 [[머피의 법칙]]이 발현할 가능성을 줄이거나 제거하는 것으로 보일 수 있다. 방어적 프로그래밍은 기법들은 한 소프트웨어가 해롭거나 부주의하게 잘못 사용되어 재앙적 결과를 가져올수도 있을 때 사용된다.

방어적 프로그래밍은 소프트웨어와 소스코드를 아래의 관점에서 향상시키는 한 접근법이다:
* 일반적 품질 - [[소프트웨어 버그]]와 문제의 수를 줄인다.
* 그 소스 코드를 이해하기 쉽게 만든다 - 그 소스 코드는 읽기 쉽고 이해하기 쉬워서 [[코드 리뷰]]([[:en:code audit|code audit]])에서 승인된다.
* 그 소프트웨어가 예상치 못한 입력들이나 사용자의 동작들에도 예상 가능한 방식으로 동작하도록 한다.

== 안전한 프로그래밍 ==
방어적 프로그래밍은 때때로 이 버그를 줄이는 접근을 언급하는 컴퓨터 학자들에 의해 '''안전한 프로그래밍'''(secure programming)으로 불린다. [[소프트웨어 버그]]는 잠재적으로 [[:en:code injection|코드 주입]], [[서비스 거부 공격]] 또는 다른 공격을 위한 [[:en:Hacker (computer security)|크래커]]에 의해 이용당할 수 있다.

방어적 프로그래밍과 보통 습관들 사이의 차이는 모든 가능한 에러 상태들을 다루고자 시도하는 프로그래머가 실제로는 그것을 거의 가정하지 않는다는 것이다. 줄여 말하면, 그 프로그래머는 한 특별한 함수 호출 또는 라이브러리가 적대적이게 동작할 수 있다고 가정하지 않고 그것을 그 코드안에서 다룬다. 한 예는 다음과 같다:

<syntaxhighlight lang="c">int risky_programming(char *input){
  char str[1000+1];     // 널 문자를 위해 하나 추가
  // ...
  strcpy(str, input);   // copy input
  // ...
}</syntaxhighlight>
이 함수는 입력이 1000 문자를 넘을 때 충돌을 일으킬 것이다. 몇몇 미숙한 프로그래머들은 사용자들이 그런 긴 입력을 넣지 않을 것이라고 가정하면서 이것이 별 문제가 아니라고 느낄지도 모른다. 한 방어적 프로그래밍을 실천하는 프로그래머는 그 버그를 허용하지 않았을 것이다, 왜냐하면 만약 그 응용 프로그램이 한 알려진 버그를 포함한다면 [[머피의 법칙]]은 그 버그가 실제 사용 시에 발생할 것이라고 말하기 때문이다. 이 특정 버그는 [[버퍼 오버플로우]]를 [[취약점 공격|이용]]하여 일으킬 수 있는 한 취약성을 재연한다. 여기 이 예제에 대한 한 해결 방법이 있다.

<syntaxhighlight lang="c">int secure_programming(char *input){
  char str[1000];
  // ...
  strncpy(str, input, sizeof(str)); // str의 길이를 초과하지 않도록 입력(input) 복사
  str[sizeof(str) - 1] = '\0';              // 만약 strlen(input) == sizeof(str) 여도 strncpy가 NULL 종료 하지 않을 것
  // ...
}</syntaxhighlight>

== 같이 보기 ==
* [[컴퓨터 보안]]
* [[테스트 주도 개발]]

== 추가 문헌 ==
* [[William Cheswick|William R. Cheswick]] and [[Steven M. Bellovin]], ''Firewalls and Internet Security: Repelling the Wily Hacker'' {{ISBN|0-201-63357-4}}http://www.wilyhacker.com/
* [[스티브 맥코넬]]저, 서우석 역, ''Code Complete (2nd edition)'', 8장 방어적인 프로그래밍 {{ISBN|978-89-5674-256-4}}

== 외부 링크 ==
* [https://web.archive.org/web/20120303160610/http://www.eetindia.co.in/ARTICLES/1999DEC/PDF/EEIOL_1999DEC01_EMS_TA_1.pdf?SOURCES=DOWNLOAD "Rules for Defensive C Programming(Mirror1)"] by Dinu P. Madau 1999
* [ftp://ftp.akaedu.org/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%9B%B8%E5%85%B3%E4%B9%A6%E7%B1%8D%E8%B5%84%E6%BA%90_Books/%E5%A4%A7%E9%87%8F%E5%B5%8C%E5%85%A5%E5%BC%8F%E4%B9%A6%E7%B1%8D_upload_by_BlackorWhite/EmbeddedSystemProgromming%20CD%20Libray/files/99/9912/f-madau.pdf "Rules for Defensive C Programming(Mirror2)"]{{깨진 링크|url=ftp://ftp.akaedu.org/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%9B%B8%E5%85%B3%E4%B9%A6%E7%B1%8D%E8%B5%84%E6%BA%90_Books/%E5%A4%A7%E9%87%8F%E5%B5%8C%E5%85%A5%E5%BC%8F%E4%B9%A6%E7%B1%8D_upload_by_BlackorWhite/EmbeddedSystemProgromming%20CD%20Libray/files/99/9912/f-madau.pdf }} by Dinu P. Madau 1999
* [http://www.dwheeler.com/secure-programs "Secure Programming for Linux and Unix HOWTO"] {{웨이백|url=http://www.dwheeler.com/secure-programs |date=20070428175037 }} by [[David A. Wheeler]]
* [https://archive.today/20120714122020/http://embedded.com/showArticle.jhtml?articleID=9900044 "Proactive Debugging"] article by Jack Ganssle 2001-02-26 <!-- would this be more appropriate in the [[debugging]] article? -->
* [http://www.codeproject.com/KB/architecture/defensiveprogramming.aspx "Defensive programming"] article by Rob Manderson 2004-08-06
* [http://word.mvps.org/FAQs/MacrosVBA/MaintainableCode.htm "The art of defensive programming: Or how to write code that will be easy to maintain"] article by Jonathan West
* [https://web.archive.org/web/20110116100726/http://taossa.com/ "The Art of Software Security Assessment"] by Mark Dowd, John McDonald, and Justin Schuh
* [https://web.archive.org/web/20130127011702/https://www.securecoding.cert.org/confluence/display/seccode/CERT+Secure+Coding+Standards CERT Secure Coding Standards]
* [https://web.archive.org/web/20111005114554/http://anirudhvyas.com/root/2008/10/20/art-of-defensive-programming/ Art of defensive programming in Java]
* [https://web.archive.org/web/20080828060019/http://www.rkbexplorer.com/explorer/#display=mechanism%2D%7Bhttp://resex.rkbexplorer.com/id/resilience-mechanism-391f85c3} Defensive Programming in the RKBExplorer]
* [http://www.pearsonhighered.com/educator/product/Solid-Software/9780130912985.page ''Solid Software''] by Shari Lawrence Pfleeger, Les Hatton and Charles C. Howell, has a section on Defensive Programming.
* [http://devmethodologies.blogspot.com/2012/05/defensive-programming.html "Defensive Programming"] by Andrew Phillips

[[분류:프로그래밍 패러다임]]
[[분류:프로그래밍 원칙]]