본문 바로가기

C, C++

주어진 길이의 문자열 값을 얻어오는 함수 정의 방식

예를 들어 다음과 같이 제품의 이름을 얻어오는 함수를 정의한다고 해 보자.

int GetProductCode(unsigned char prod_code[20]);

함수 내부 구현 코드에서는 인자의 메모리 공간이 20바이트만큼은 확보되었다고 가정하고, 이 공간에 데이터를 복사한다.
함수를 호출하는 곳에서는 문자열 배열 20바이트를 확보한 뒤에 이 함수를 호출해야 한다. 개발자가 헤더 파일에서 함수의 원형을 잘 파악하고 사용을 한다고 하면 크게 문제가 될 사항은 없다. 그런데 크기 확인을 하지 않고 문자 배열의 크기가 20보다 작은 메모리 공간을 인자로 넘겨준다고 하면(의도하지 않게) 이는 오류를 일으키게 된다.

의도적으로 크기가 작은 배열을 인자로 넘겨주는 것을 막을 수 없지만, 개발자의 실수를 미연에 방지한다는 측면에서 보면 다음과 같이 함수의 원형을 바꿔 보면 어떨까?

int GetProductCode(unsigned char prod_code[20], size_t destsz);

함수 내부 구현 코드에서는 destsz의 크기가 20보다 작을 경우 오류를 출력하고 함수를 종료하도록 한다. 함수를 호출하는 곳에서는
GetProductCode(prod_code, sizeof(prod_code)); 와 같이 호출하여 prod_code의 크기 또한 인자로 넘겨준다. 이렇게 하게 되면 개발자의 의도하지 않은 오류에 대해 코드 상으로 예외 처리가 가능하지게 된다. 즉 memory corruption을 일으키지 않게 된다. 


또 다른 접근 방식은 고정 길이 배열을 정의하는 방법이다.

위에서 예로 든 함수는 다음과 같이 원형을 변경하여 사용할 수 있다.

위 함수를 호출하는 쪽에서 다음과 같이 사용할 수 있을 것이다.

GetProductCode()를 호출할 때 t_prod_code 타입이 아닌 변수를 넣게 되면 컴파일 오류를 일으키기 때문에 개발자의 코드 오류를 줄이는데 기여할 수 있을 것이다.

위 함수의 원형을 다음과 같이 써도 동일하게 동작한다.

 

 

'C, C++' 카테고리의 다른 글

배열의 주소  (0) 2022.02.08
C++ 표준의 버전  (0) 2022.02.07
C 표준 (ANSI C, ISO C, Standard C)의 버전  (0) 2022.02.07
strcpy, strncpy 대신에  (0) 2022.02.07