배열과 문자열: 버퍼 넘침의 원리
배열은 메모리에 연속으로 놓인 같은 자료형의 묶음이고, 문자열은 널 문자로 끝나는 char 배열입니다.
배열
uint8_t buf[8];은 8바이트가 연속으로 놓인 공간입니다. buf[i]는 "시작 주소에서 i칸 뒤"라는 뜻일 뿐이라 C는 범위를 검사하지 않습니다. buf[8]에 쓰면 배열 바로 뒤에 있던 다른 변수가 망가집니다. 이것이 버퍼 넘침입니다.
문자열
C의 문자열은 끝에 '\0'이 붙은 char 배열입니다. "OK"는 세 바이트를 차지합니다.
char msg[16];
snprintf(msg, sizeof msg, "T=%d", temp); // 크기를 넘기지 않음
strcpy, sprintf처럼 길이를 확인하지 않는 함수 대신 strncpy, snprintf를 씁니다.
임베디드에서 배열이 쓰이는 곳
- UART 수신 버퍼, 통신 패킷
- ADC 샘플을 모아 평균 내는 버퍼
- 룩업 테이블과 설정값 표
배열 크기는 매크로 하나로 정하고 루프 조건도 그 매크로를 쓰면, 크기를 바꿀 때 실수가 줄어듭니다.