Secure-Coding-C-DCL-1 C 언어 시큐어코딩 - Declare and Initialization 1 적절한 저장 기간을 가진 객체 선언 모든 객체는 수명을 결정하는 저장 기간이 있다. : static, thread, automatic, or allocated. 객체 수명은 실행 중 저장 장치에 예약된 기간 동안 보장된다. 객체가 존재하고, 상수 주소를 가지며, 수명 기간 동안 저장된 값을 유지한다. 하지만 수명 기간이 지나고 발생하는 참조의 동작에 대한 정의는 없으며 포인터가 가리키는 객체의 수명이 끝나면 포인터의 값은 불확실해진다. 객체의 수명 기간 지난 후 접근을 시도해서는 안된다. 그러한 시도는 정의되지 않은 동작으로 악용될 수 있는 취약점으로 이어질 수 있다. 잘못된 코드 예제 (다른 저장 기간) 이 코드 예제는 자동 저장 기간을 갖는 변수 c_str 의 주소를 정적 저장 기간을 갖는 변수 p 에 할당한다. 할당 자체는 유효하지만 dont_do_this() 의 끝에서와 같이 p 가 주소를 보유하고 있는 동안에 c_str 이 범위를 벗어나는 것은 유효하지 않다. # include <stdio.h> const char * p ; void dont_do_this ( void ) { const char c_str [ ] = "This will change" ; p = c_str ; /* Dangerous */ } void innocuous ( void ) { printf ( "%s\n" , p ) ; } int main ( void ) { dont_do_this ( ) ; innocuous ( ) ; return 0 ; } 올바른 코드 예제 (동일한 저장 기간) 이 예제에서 p 는 c_str 과 동일한 저장 기간으로 선언되므로 p 는 this_is_OK()