C 언어 기초
void save(const char *input) {
char name[8];
strcpy(name, input);
printf("%s\n", name);
}위의 함수 save에 8문자의 문자열 "ABCDEFGH"를 전달했다. 일어나는 일로 올바른 것은?
- A종단의 '\0'을 포함하여 9바이트가 쓰여, name 바깥의 1바이트를 망가뜨린다(미정의 동작)
- B정확히 8문자이므로 name에 들어가며, ABCDEFGH가 올바르게 표시된다
- Cstrcpy가 name의 크기에 맞춰 7문자로 잘라 내고, 마지막 요소에 종단의 '\0'을 넣는다
정답과 해설 보기
정답: A. 종단의 '\0'을 포함하여 9바이트가 쓰여, name 바깥의 1바이트를 망가뜨린다(미정의 동작)
문자열 "ABCDEFGH"는 종단의 '\0'을 포함하면 9바이트입니다. strcpy는 쓰기 대상의 크기를 모른 채 '\0'까지를 모두 복사하므로, 8바이트인 name의 바깥으로 1바이트 넘쳐서 씁니다(버퍼 오버플로). 넘친 부분은 스택 위의 다른 변수나 복귀 주소를 망가뜨리기도 하며, 외부에서 긴 입력을 주어 임의의 코드를 실행시키는 공격에도 사용됩니다. snprintf(name, sizeof name, "%s", input)처럼 쓰는 크기를 지정할 수 있는 함수를 사용하여 막습니다.