여의봉이 늘어나는 이유.
글쓴이: minzkn / 작성시간: 화, 2003/08/12 - 3:38오전
잘 생각해보면 당연한 에러지만 무아상태에서 작성하다 보면 이런거 간혹 나올수 있겠죠?
void Test(void) { char s_MyBuffer[ 32 << 10 ]; memset(&s_MyBuffer[0], 0, sizeof(s_MyBuffer)); /* 정말로 이 큰 버퍼 0으로 초기화 했음 */ strcpy(&s_MyBuffer[0], "a"); /* 큰 버퍼에 이거 하나 딸랑 복사하다니~ 너무 낭비인가? */ strcpy(&s_MyBuffer[1], &s_MyBuffer[0]); /* 오른쪽으로 이거 복사해서 좀 늘리자~ */ /* 어랏? 여기서 죽네 ? 난 이거 한바이트 복사했는데.... */ fprintf(stdout, "[%s]\n", s_MyBuffer); }
결과를 보면 참 어처구니 없더라도 참으십시요. 여의봉이 괜히 늘어나는줄 아셨습니까?
아~! 또 잊고 안적었네요.
이건 바로 밑의 글과 약간은 연관된 쓰레드입니다.
해킹관련 내용이라는 말을 하면 사람들 귀가 번쩍일거 같아서 예기안하겠습니다.
예기했나?
Forums:
이렇게 되면, 모두 0값으로 초기화 되었기 때문에 (일단 0은 NULL
이렇게 되면, 모두 0값으로 초기화 되었기 때문에 (일단 0은 NULL 이랑 동일하다고 가정해 둘께요.) 1개의 a가 복사된 다음에 끝나야 할 테지만...
복사를 하고 0인지 확인하려 드니 어랏? a네? 그래서 또 하고...
모.. 그런것의 반복으로 무한히 늘어난다...
이런 말씀 이신가요?
미처 생각지 못한 무한 루프네요.
제가 생각한것이 맞는다면, 정말 잼있는 소스네요. :lol:
Re: 여의봉이 늘어나는 이유.
잼있네요.
귀찮더라도.. strncpy 를 써야 할까요?
아름다움이란... 열정
????
음.. 무슨 소리신지...
에러없이 잘 돌아가는데요..
컴이 이상한가?.....
[aa] 가 출력되는군요...
리눅스만 해당되나요?
AIX는 해당 안되나?..
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
Re: ????
컴파일러 특성을 타거나 옵티마이즈 옵션이나 기타옵션에 따라 다르겠지요...
if( a < b || 치명적인조건)// 큐나 소트 알고리듬 예제 등에 잘 등장하는 조건절
이런 문법도 허용이 되는 컴파일러가 있고, 오류가 나는 컴파일러가 이더군요.
There is no spoon. Neo from the Matrix 1999.
...
음..
어떻게 말씀 드려야 할지 난감한데..
도발적으로 들리실지 모르겠지만..
minzkn님이 모르시면서 올리셨다고 하기엔 너무 난감한 문제라..
여기서 strcpy를 한건 한바이트가 아니죠..당연히 에러가 나야하는건데..
(보통 에러가 안나죠..결국 그래서 오버 플로우가 생기는거지만...)
오버플로우에서 기본적인 부분 아닌지?
사이즈가 다른 문자열을 복사해넣는 부분인데..
이걸 단순히
라 표현했다고..문자 하나만을 복사해넣는다고 표현하신게..참..
어떻게 받아 들여야할지..
이 부분에서 실제로 복사 되는 부분은..s_MyBuffer[0](32768)을
s_MyBuffer[1](32767)로 복사해 넣겠다는 말인데..
굳이 저리 쓸데 없는 부분을 넣으셔서 설명을 해야했는지..
받아들이기 힘든 부분이네요..
아무튼 잘 봤습니다..감사합니다..
Re: ????
저도 AIX 에서 해보니 Linux와 다른 것을 보았습니다. PPC assembler 좀 보면서 disassemble 을 분석하면 알 수 있을것 같은데.. PPC는 안해봐서리..
그냥 PPC assembler로 검색해보니 아래가 잡히는 군요...(AIX는 아니고 Mac OS X이긴한데.. 같은 PPC 라면.. 뭐..) 암튼.. 나중에 시간날때...
http://developer.apple.com/documentation/DeveloperTools/Reference/Assembler/AssemblerTOC.html
분석은 안해봤지만, 아마 원본이 전송될 위치에 덮이는지를 확인하는 부분이 들어가는 것이 겠죠.
일단 올려봅니다.
---
http://coolengineer.com
여의봉 효과가 있다면 strcpy1 과 같은 소스이겠고....., 아니라
여의봉 효과가 있다면 strcpy1 과 같은 소스이겠고....., 아니라면 strcpy2 와 같은 소스로 구성되지 않을까요? 여하튼 10년을 넘게 코딩을 하면서 짚고 넘어가지 않았던 부분에 대한 경각심은 참신하네요...
[quote="kuma"]여의봉 효과가 있다면 strcpy1 과 같은 소
kuma님께서 가장 정확한 지적과 예를 들어주셨군요.
앞으로도 제가 올린글에 대한 답변은 바로 kuma님과 같이
정확한 원인에 대해서 생각해보는 댓글이 올라왔으면 좋겠습니다.
아니~! 저도 생각해보지 못한 그러한 부분이 올라왔으면 하는 욕심이 있네요.
그래야 생각을 깊이 해볼수 있고 좋은 프로그램을 만들수 있지 않겠습니까?
그리고 재미도 있고~
물론 제가 여기 글을 올리는 이유는 또 몇가지가 있기는 하지만
그때되면 말씀드릴께요~
도구의 결함은 장인의 손으로 극복한다.
굳이 strcpy2 를 그렇게 하지 않아도 strcpy1에 단 하나만 넣
굳이 strcpy2 를 그렇게 하지 않아도 strcpy1에 단 하나만 넣어도 같은 효과입니다.
---
http://coolengineer.com
strcpy2가 약간은 일반적이지 않네요...
아래 예제에서만 제대로 작동하는 strcpy2가 되겠네요...
그냥 실수하신거 같아서 말씀드렸습니다.
pynoos님 글 잘 읽고 있습니다.
좋은글 많이 부탁드립니다^^
kuma 님이나 pynoos 님이 제시한 소스는 어떤 경우엔 동작하지 않
kuma 님이나 pynoos 님이 제시한 소스는 어떤 경우엔 동작하지 않을 수 있습니다. (혹은 원하지 않는 결과를 얻을 수 있습니다.)
kuma 님의 소스나 pynoos님의 소스는 dest 주소가 src 주소보다 큰 경우에만 원하는대로 동작하는군요.
간단히
로 해결될 듯 싶습니다. memmove는 overlap이 있는 경우에도 제대로 동작하도록 보장하니깐요. (macro로 구현해도 되겠군요.)
음....
요새 minzkn 님이 약간의 소동(?)을 일으켜서
자세히 읽긴 했는데
이 스레드에 이만큼 많은 답글이 있을 필요도 없을것 같은데요
그냥 이런류의 코드는 잘못될수 있으니 주의하자 라는 간단한 팁일듯..
이런류에 실수는 흔한것 아닌가요?
어쨓든 minzkn님의 글은 한번더 자세히 보게 되네요 ㅋㅋ
농담입니다
오해 없으시길.....
-- 아쉬운 하루 되세요 --
온라인 상에서의 오해 마시길 이라는 단어 하나로분위기가 험악해 질
온라인 상에서의
오해 마시길 이라는 단어 하나로
분위기가 험악해 질 수 있습니다
워낙에 오해가 판치는 온라인 아니겠습니까...
오해의 여지가 있다기 보다는
공격성 발언이라고 사료됩니다
자중해주시길
난 세상의 떨거집니다
더 알 필요가 있겠습니까? 나에 대해서??
minzkn 님만 보세요.[color=white]한번 더 말씀
minzkn 님만 보세요.
한번 더 말씀드리지만,
바보이기도 한 저는 참을성도 없습니다.
minzkn 님!
퀴즈를 내시려거든 목적을 그렇게 밝히시든지,
누구를 시험하시려거든 목적을 그렇게 밝히시든지,
자신의 지식을 알리고자 하시려거든 목적을 그렇게 밝히시든지,
누구를 깔아뭉게실려거든 목적을 그렇게 밝히시든지
해주십시오.
의도적인 어떤 목적이 아니라 순수한 목표라면 그렇게 표현을 하시든가요. 아니면, 괜한 꼬투리 잡히지 않게 말씀을 하시든가요.
괜히 시비거는 것은 아닐까해서 몇번이나 답글을 썼다가 제출하지 못하고 백버튼 누르는 저같은 사람 생각 좀 해주세요. 네? (<- 이건 분명히 짜증 섞인 음절입니다.)
[quote="bugiii"]minzkn 님만 보세요.[color
To bugiii
꼬투리 잡힌다라고 생각하세요?
음... 잡혀도 아직은 때가 아닌듯.
꼬투리 잡으실분은 따로 쓰레드 만드셔서 계속 꼬투리 잡아주시길. 저는 無言
도구의 결함은 장인의 손으로 극복한다.
Re: 여의봉이 늘어나는 이유.
han.comp.lang.c 식으로 재미없게 답하자면, "위 코드는 정의되지 않은 동작을 갖습니다."
C99 표준문서의 7.21.2.3 The strcpy function 중 한 부분을 인용하겠습니다.
"...If copying takes place between objects that overlap, the behavior is undefined."
위와 같은 코드에서 뭔가 의미있는 행동을 바란다는 것 자체가 무리입니다. 다만 왜 저런 코드를 써서는 안되는가(또는 표준문서의 위 구절이 왜 나왔는가)에 대한 하나의 예제는 될 수가 있겠죠.
ps. 앞으로도 minzkn님의 글에 답글을 달 기회가 생기면, 늘 본문 전체를 인용하겠습니다. 저는 토론 과정에서 누군가의 일방적인 삭제로 다른 사람들이 작성한 유용한 글들이 모두 무의미하게 되어버리는 것을 바라지 않습니다.
[quote="kuma"]여의봉 효과가 있다면 strcpy1 과 같은 소
strcpy2를 조금 수정해보겠습니다. ^^
내 블로그: http://unipro.tistory.com
사족이지만..두번째 인자는[code:1]const char
사족이지만..
두번째 인자는
const char* src
로 해야 정상이지요..
---
http://coolengineer.com
[quote="unipro"]strcpy2를 조금 수정해보겠습니다. ^^
음냐... 제가 올리려고 한 코드와 유사하군요. :oops:
overlapping이 가능한 copy를 수행하는 memmove()가 바로 이런 식으로 구현되어 있습니다. overlap되는 위치에 따라 복사 방향을 바꾸어주면 overlapping을 피할 수 있는 원리지요.
그래서 STL 알고리듬 중에도 copy와 copy_backward가 함께 존재하는 것이 이런 이유입니다.
댓글 달기