:: 게시판
:: 이전 게시판
|
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
06/06/26 23:12
tmp_name()이 반환해야 하는 문자열이
삭제되기 직전에 p 에 저장됩니다. 그러나 어쨌거나 결국은 삭제되어야 하는 문자열이므로 p 에 담긴 내용은 제어가 그 scope에 있는 동안만 유효합니다. printf() 나 다른 함수로 넘어간다거나 하면 완전히 삭제되는 거죠. 이렇게 임시적으로 데이터 삭제를 지연시키는 이유는 프로그램에 약간의 유연성을 주기 위함으로 보입니다만, 그 작동과정을 알아보려면 컴파일러 수준으로 내려가야 답이 나옵니다. 다시 말해 이 작업은 컴파일러에 따라 다를 수 있으므로, 결과가 보장되지 않은 위험한 방법이라는 뜻입니다. 아마 결과는 나왔어도 컴파일러에서 분명 경고가 떴을 겁니다. 만약 경고가 안떴다면 워닝레벨을 좀 높여두시는게 좋습니다.
06/06/26 23:14
안전성을 보장받기 위해서는 다음처럼
저장장소를 매개변수로 제공해 주는 것이 옳습니다. 실제로 표준 라이브러리의 문자열 함수들은 모두 다음 방식을 사용합니다. void get_name(char *ret) static int seq=0; ++seq;; strcpy(ret, "tmp"); ret[3] = '0'+seq; ret[4] = '\0';
06/06/26 23:16
Dark-probe님// 감사합니다~. 그러니까 제가 지금 쓰는 컴파일러에서는 다른 함수로 넘어가기 전까지 저장되어 있을수 있다는 거지만 원래는 지워지는게 맞다는 거죠? 그리고 밑에 적절한 사용법 감사합니다~
06/06/27 15:56
지역 변수는 스택에 할당되고, 함수가 리턴 값을 반환하고 마친 후에
모든 메모리는 삭제됩니다. 결국 저런 문제는 변수의 life time과 scope 문제이죠 그래서 저런 데이터를 유지하기 위해서는 힙(heap)영역에 변수를 할당해야 합니다. 두번째 문제에서 아무런 오류가 없어 보이는 것은 결론적으로는 위험성을 안고 있는 것입니다. 글쓰신 분이 사용하는 컴파일러는 유연함을 제공하는 컴파일러가 아니라 오히려 위험성을 안고 있는 컴파일러이죠 위와 같은 문법이 가지고 있는 잠재적 오류를 정확하게 잡아 주지 못해서 당장은 잘 돌아가는 프로그램처럼 보이지만, 결국엔 더 큰 문제를 일으킬 가능성을 언제나 갖고 있다는 겁니다. 해제된 메모리에 원래 데이터가 남아있다는 것은 보안상으로도 매우 안 좋습니다.
|