이전 주제 보기 :: 다음 주제 보기 | |
글쓴이 | 메시지 |
---|---|
unipro novice ![]() 올린 글: 17 | 올려짐: 2003년3월12일 13:18 주제: 이식성 있는 프로그램의 작성 시 함수 파라미터의 사용을 피하는 바이트 순서가 다른 프로세서들 간의 프로그램을 이식할 때에는 특히 함수에 파라이터를 전달할 때 문제가 발생할 수 있다. 함수 파라미터의 어드레스를 사용하지 않아야 한다. 예를 들어, 다음과 같다. 코드: char z; func(z); func(char zz) { char *p, tmp; /* 밑에 분이 지적하신 오타를 수정했습니다. */ p = &zz /* (1) 좋은 방법이 아니다 */ tmp = zz; p = &tmp /* (2) 훨씬 더 안전하다 */ /* … */ } (1)과 (2)는 어떤 차이가 있는 거지요?[url][/url] unipro님이 2003년3월12일 13:52에 수정함, 총 1 번 수정됨 |
위로 | |
stoneshim user ![]() ![]() 올린 글: 34 위치: 서울 학동역 부근 | 올려짐: 2003년3월12일 13:42 주제: 코드: char z; func(z); func(char zz) { char *p, tmp; p = & /*(1) 좋은 방법이 아니다 */ tmp = zz; p = & /* (2) 훨씬 더 안전하다 */ /* … */ } 혹시 원래 코드가 위와 같지 않고 아래와 같지 않나요? 코드: char z; func(z); func(char zz) { char *p, tmp; p = &zz /*(1) 좋은 방법이 아니다 */ tmp = zz; p = &tmp /* (2) 훨씬 더 안전하다 */ /* … */ } 인용하시려던 코드가 두번째 코드라면 이 의미는 파라미터 자체의 어드레스를 사용하는 것이 위험하다는 뜻입니다. (1)의 경우가 파라미터 자체의 어드레스를 사용하는 것이구요. (2)의 경우는 파라미터의 값을 stack 변수에 할당한 후 stack 변수의 어드레스를 사용하는 모습입니다. _________________ 새로운 세상 |
위로 | |
unipro novice ![]() 올린 글: 17 | 올려짐: 2003년3월12일 13:59 주제: (질문한 이)바이트 순서와 함수 파라미터와는 무슨 관계인지요? 메모리에서 바이트를 다른 순서로 정렬하는 것에 대한 이식성하고 위에서 함수 파라미터의 어드레스를 사용하지 않는 것하고는 무슨 관계가 있는지 잘 이해가 가지 않습니다. |
위로 | |
pynoos expert ![]() ![]() 올린 글: 251 위치: 서울 | 올려짐: 2003년3월12일 14:07 주제: 메모리 바이트 순서하고, 함수 파라미터 사용에 대한 것이라….. 크게 신경쓰이지 않는 문제같습니다. pointer를 pointer 답게만 사용하면 되고, 강제로 long 등으로 바꾼뒤 무슨 연산을 하는 짓만 안하면, 그다지 문제가 되지 않습니다. _________________ 가는 선, 정교한 생명시계. 오늘도 하루를 오차없는 프로그램처럼 살아 있다. |
위로 | |
체스맨 user ![]() 올린 글: 38 | 올려짐: 2003년3월13일 14:24 주제: Re: 이식성 있는 프로그램의 작성 시 함수 파라미터의 사용을 피 예제의 출처가 궁금하네요. 글쓴이가 무엇을 말하고 싶은 건지 모르겠습니다. ‘바이트 순서’가 바이트오더(byte order)를 의미한다면, 이기종간 바이트 오더가 중요한 문제이긴 합니다만, 지금 예제에서는 그 중요함에 대해 제대로 다루고 있는 것 같지 않아 보이구요, 특히 char 와 같이 단일 바이트인 경우는 바이트 오더에 구애받지 않습니다. 지금 예제는 char 타입인 경우를 다루고 있네요. |
위로 | |
wizcat novice ![]() 올린 글: 9 | 올려짐: 2003년3월13일 16:13 주제: 아무상관없음… 그문제의 포인가 뭔지는 모르겠지만.. (1)번과 (2)번은 똑같습니다.. local변수와 파라미터는 똑같이 stack영역에 생깁니다. |
위로 | |
unipro novice ![]() 올린 글: 17 | 올려짐: 2003년4월3일 11:25 주제: 예제의 출처입니다. Beginning Linux Programming – 2nd Edition, 정보문화사 부록 A 이식성 에서 바이트 순서 부분입니다. 저자가 잘못 알고 있을 것일까요? 저자가 자신의 생각을 표현하는데 문제가 있었던 것일까요? 번역에서 오류가 난 것일까요? 이것에 대해 아는 사람이 아직 나타나지 않을 것일까요? |
위로 | |
unipro novice ![]() 올린 글: 17 | 올려짐: 2003년4월4일 10:49 주제: 왜 함수 파라이터의 어드레스를 사용하지 않아야 하는지 대충 알 함수 파라메타는 함수로 넘어갈 때 확장될 수 있다네요. 예를 들어 char는 int로 확장되어서 넘어갈 수 있는 경우지요. 따라서 직접적으로 함수 파라이터의 어드레스를 사용할 경우 바이트 순서에 차이에 의해서 다른 결과를 얻을 수 있다고 하네요. 디스크의 데이터나 네트워크를 통한 데이터 전송의 경우는 예전부터 알고 있었는데, 함수 파라이터의 경우에도 잘못하면 이식성에 문제가 될 수 있더군요. 관심 갖지고 답변해준 동지님(?)들께 감사드립니다. |
위로 | |
체스맨 user ![]() 올린 글: 38 | 올려짐: 2003년4월5일 0:48 주제: Re: 왜 함수 파라이터의 어드레스를 사용하지 않아야 하는지 대 아, 그렇습니다. 저도 이해가 되네요. 말씀하신 책을 찾아봤는데, 그 책을 쓸 정도의 분이 이 정도를 간과할 것 같진 않았습니다. 사실 지금 예제 코드처럼 쓰는 경우는 거의 없지만, 문제는 일으킬 수 있겠네요. 대개 32비트 이상의 시스템에서는 기본 정수 크기 이하의 정수는 기본 정수 크기로 확장되어 넘어가죠. printf 에서도 이런 확장 규칙과 연관되게 되어 있죠. 좋은 예제네요. ^^ |
위로 | |
lsj0713 beginner ![]() 올린 글: 1 | 올려짐: 2003년4월5일 16:20 주제: Function Prototype을 제대로 지정해주지 않아서 그렇습니다. 흥미로운 주제라서 제가 han.comp.lang.c 뉴스그룹에 질문을 옮겼습니다. http://groups.google.co.kr/groups?threadm=b6kcji%24dqg%241%40news1.kornet.net Lee Huan Chul 님께서 답변을 달아주셨는데 아직 구글 뉴스그룹쪽으로 글이 전달되지 않은 것 같군요. 조만간 구글 쪽으로도 볼 수 있을 겁니다. ![]() void func(char zz); /* 함수의 선언 */ void func(char zz) /* 함수의 정의 */ { /* … */ } http://groups.google.co.kr/groups?selm=385e7ca.0304042126.104c13ce@posting.google.com 코드: ——————————————————————————– Subject: Re: 함수의 파라미터의 포인터를 취하는 것에 대한 질문 From: Lee Huan Chul <lhc_forever at yahoo dot co dot kr> “Lee, Sin-jae.” <spammer@go.to.hell> wrote in message news:<b6kcji$dqg$1@news1.kornet.net>… >> KLDP 프로그래밍 QnA 게시판에 다음과 같은 글이 올라왔더군요. >> >> http://bbs.kldp.org/viewtopic.php?t=1364 >> ——————————————————————————– >> >> unipro – novice >> >> 가입: 2002년 12월 25일 올린 글: 16 >> 올려짐: 2003년3월12일 13:18 >> 주제: 이식성 있는 프로그램의 작성 시 함수 파라미터의 사용을 피하는 >> >> 바이트 순서가 다른 프로세서들 간의 프로그램을 이식할 때에는 >> 특히 함수에 파라이터를 전달할 때 문제가 발생할 수 있다. >> 함수 파라미터의 어드레스를 사용하지 않아야 한다. >> 예를 들어, 다음과 같다. >> >> 코드: >> >> char z; >> func(z); >> >> func(char zz) { >> char *p, tmp; >> >> /* 밑에 분이 지적하신 오타를 수정했습니다. */ >> p = &zz /* (1) 좋은 방법이 아니다 */ >> tmp = zz; >> p = &tmp /* (2) 훨씬 더 안전하다 */ >> >> /* … */ >> } >> >> (1)과 (2)는 어떤 차이가 있는 거지요?[url][/url] >> >> unipro님이 2003년3월12일 13:52에 수정함, 총 1 번 수정됨 >> >> unipro >> novice >> >> 가입: 2002년 12월 25일 >> 올린 글: 16 >> >> 올려짐: 2003년4월4일 10:49 주제: 왜 함수 파라이터의 어드레스를 사용하 >> 지 않아야 하는지 대충 알 >> 함수 파라메타는 함수로 넘어갈 때 확장될 수 있다네요. 예를 들어 char는 >> int로 확장되어서 넘어갈 수 있는 경우지요. 따라서 직접적으로 함수 파라이 >> 터의 어드레스를 사용할 경우 바이트 순서에 차이에 의해서 다른 결과를 얻을 >> 수 있다고 하네요. >> >> 디스크의 데이터나 네트워크를 통한 데이터 전송의 경우는 예전부터 알고 있 >> 었는데, 함수 파라이터의 경우에도 잘못하면 이식성에 문제가 될 수 있더군요. >> >> 관심 갖지고 답변해준 동지님(?)들께 감사드립니다. >> >> ——————————————————————————– >> >> 이 말이 정말입니까? 함수 파라미터의 주소값을 취할 때에는 특별히 주의해야 >> 하는 것인가요? 얼핏 보기에는 잘 이해가 안가는 부분입니다만… 일단 이런 근심을 하게되는 이유는 scope 내에 function prototype을 두지 않았기 때문인데 그런 기초적인 사항을 실수하고 이런 복잡한 내용을 이야기 하는게 조금 이상합니다만 x86 리눅스에서와 M$ 윈도에서 테스트를 해봤는데 문제는 발생하지 않았습니다. >> func(char zz) { >> char *p, tmp; >> >> /* 밑에 분이 지적하신 오타를 수정했습니다. */ >> p = &zz /* (1) 좋은 방법이 아니다 */ >> tmp = zz; >> p = &tmp /* (2) 훨씬 더 안전하다 */ 이 부분을 보면 zz의 주소를 구하는 것은 좋은 방법이 아니라 하고 있는데 주소 값을 구하는 것 자체가 좋은 방법이고 아닌 방법이고 논할 바는 아니겠지요. 문제는 어떻게 쓰느냐인데 단순히 char 변수 가지고 주소를 1 증가 시킨다든지 하는 연산은 하지 않을 터이고 한다하면 다시 그 값을 참조 하는 일일진데 다시 참조한다 하여도 zz이 원래 가지고 있던 값이 나오겠지요. 즉 byte allignment가 문제시 된다면 zz의 포인터를 받아서 뭐하는게 문제가 아니라 zz값 자체에 문제가 있어야 합니다. argument type promotion rule에 따라 char는 int로 확장되어 어떤 endian 이냐에 따라 값이 딸라질 수 있다는 이야기를 하고픈 것인듯 싶은데 어쨌든 little endian 에서는 문제가 없군요. ——————————————————————————– _________________ Lee, Sin-jae E-Mail : lsj0713 at yahoo dot co dot kr |
위로 | |
이전 글 표시: 모든 글 1일 7일 2주 1달 3달 6달 1년 오래된 글 먼저 새로운 글 먼저 |