설명
함수가 반환될 때 수명이 끝나는 지역 변수의 주소나 참조를 반환하면, 호출자가 이미 무효화된 스택 메모리를 사용하게 됩니다.
잠재적 영향
- 반환된 포인터를 역참조할 때 크래시 또는 정의되지 않은 동작이 발생할 수 있습니다.
- 스택 재사용으로 인해 민감하거나 잘못된 데이터가 노출될 수 있습니다.
해결 방법
- 지역 변수의 주소나 참조를 반환하지 않습니다.
- 값 자체를 반환하거나, 호출자가 제공한 출력 버퍼를 사용합니다.
- 동적 할당이 필요한 경우 소유권 이전 규칙을 명확히 하고 해제 책임을 문서화합니다.
예시
변경 전
c
int *make_value(void) {
int value = 42;
return &value;
}
변경 후
c
int make_value(void) {
int value = 42;
return value;
}
설명:
- 변경 전:
value는 함수가 반환되면 수명이 끝나므로 반환된 주소는 무효입니다. - 변경 후: 값 복사를 반환하여 스택 주소가 외부로 노출되지 않습니다.