콘텐츠로 건너뛰기

이식성 있는 프로그램의 작성 시 함수 파라미터의 사용을 피하기

  • 기준
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
unipro
novice
novice

가입: 2002년 12월 25일
올린 글: 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 번 수정됨

위로
사용자 정보 보기 비밀 메시지 보내기 글 올린이의 웹사이트 방문 MSN 메신저
stoneshim
user
user

가입: 2003년 3월 6일
올린 글: 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
novice

가입: 2002년 12월 25일
올린 글: 17

올리기올려짐: 2003년3월12일 13:59    주제: (질문한 이)바이트 순서와 함수 파라미터와는 무슨 관계인지요? 인용과 함께 답변

메모리에서 바이트를 다른 순서로 정렬하는 것에 대한 이식성하고

위에서 함수 파라미터의 어드레스를 사용하지 않는 것하고는

무슨 관계가 있는지 잘 이해가 가지 않습니다.
위로
사용자 정보 보기 비밀 메시지 보내기 글 올린이의 웹사이트 방문 MSN 메신저
pynoos
expert
expert

가입: 2003년 2월 9일
올린 글: 251
위치: 서울

올리기올려짐: 2003년3월12일 14:07    주제: 인용과 함께 답변

메모리 바이트 순서하고, 함수 파라미터 사용에 대한 것이라…..

크게 신경쓰이지 않는 문제같습니다.

pointer를 pointer 답게만 사용하면 되고,

강제로 long 등으로 바꾼뒤 무슨 연산을 하는 짓만 안하면,

그다지 문제가 되지 않습니다.
_________________
가는 선, 정교한 생명시계.

오늘도 하루를 오차없는 프로그램처럼 살아 있다.

위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문
체스맨
user
user

가입: 2002년 12월 20일
올린 글: 38

올리기올려짐: 2003년3월13일 14:24    주제: Re: 이식성 있는 프로그램의 작성 시 함수 파라미터의 사용을 피 인용과 함께 답변

예제의 출처가 궁금하네요. 글쓴이가 무엇을 말하고 싶은 건지

모르겠습니다. ‘바이트 순서’가 바이트오더(byte order)를 의미한다면,

이기종간 바이트 오더가 중요한 문제이긴 합니다만,

지금 예제에서는 그 중요함에 대해 제대로 다루고 있는 것 같지 않아

보이구요, 특히 char 와 같이 단일 바이트인 경우는 바이트 오더에

구애받지 않습니다. 지금 예제는 char 타입인 경우를 다루고 있네요.
위로
사용자 정보 보기 비밀 메시지 보내기 글 올린이의 웹사이트 방문
wizcat
novice
novice

가입: 2003년 1월 22일
올린 글: 9

올리기올려짐: 2003년3월13일 16:13    주제: 인용과 함께 답변

아무상관없음…

그문제의 포인가 뭔지는 모르겠지만..

(1)번과 (2)번은 똑같습니다..

local변수와 파라미터는 똑같이 stack영역에 생깁니다.

위로
사용자 정보 보기 비밀 메시지 보내기 MSN 메신저
unipro
novice
novice

가입: 2002년 12월 25일
올린 글: 17

올리기올려짐: 2003년4월3일 11:25    주제: 예제의 출처입니다. 인용과 함께 답변

Beginning Linux Programming – 2nd Edition, 정보문화사

부록 A 이식성 에서 바이트 순서 부분입니다.

저자가 잘못 알고 있을 것일까요?

저자가 자신의 생각을 표현하는데 문제가 있었던 것일까요?

번역에서 오류가 난 것일까요?

이것에 대해 아는 사람이 아직 나타나지 않을 것일까요?

위로
사용자 정보 보기 비밀 메시지 보내기 글 올린이의 웹사이트 방문 MSN 메신저
unipro
novice
novice

가입: 2002년 12월 25일
올린 글: 17

올리기올려짐: 2003년4월4일 10:49    주제: 왜 함수 파라이터의 어드레스를 사용하지 않아야 하는지 대충 알 인용과 함께 답변

함수 파라메타는 함수로 넘어갈 때 확장될 수 있다네요. 예를 들어 char는 int로 확장되어서 넘어갈 수 있는 경우지요. 따라서 직접적으로 함수 파라이터의 어드레스를 사용할 경우 바이트 순서에 차이에 의해서 다른 결과를 얻을 수 있다고 하네요.

디스크의 데이터나 네트워크를 통한 데이터 전송의 경우는 예전부터 알고 있었는데, 함수 파라이터의 경우에도 잘못하면 이식성에 문제가 될 수 있더군요.

관심 갖지고 답변해준 동지님(?)들께 감사드립니다.

위로
사용자 정보 보기 비밀 메시지 보내기 글 올린이의 웹사이트 방문 MSN 메신저
체스맨
user
user

가입: 2002년 12월 20일
올린 글: 38

올리기올려짐: 2003년4월5일 0:48    주제: Re: 왜 함수 파라이터의 어드레스를 사용하지 않아야 하는지 대 인용과 함께 답변

아, 그렇습니다. 저도 이해가 되네요.

말씀하신 책을 찾아봤는데, 그 책을 쓸 정도의 분이 이 정도를 간과할 것

같진 않았습니다. 사실 지금 예제 코드처럼 쓰는 경우는 거의 없지만,

문제는 일으킬 수 있겠네요.

대개 32비트 이상의 시스템에서는 기본 정수 크기 이하의 정수는

기본 정수 크기로 확장되어 넘어가죠. printf 에서도 이런 확장 규칙과

연관되게 되어 있죠.

좋은 예제네요. ^^

위로
사용자 정보 보기 비밀 메시지 보내기 글 올린이의 웹사이트 방문
lsj0713
beginner
beginner

가입: 2003년 4월 5일
올린 글: 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 님께서 답변을 달아주셨는데 아직 구글 뉴스그룹쪽으로 글이 전달되지 않은 것 같군요. 조만간 구글 쪽으로도 볼 수 있을 겁니다. icon_smile.gif

간단하게 요약하면, 함수의 선언을 제대로 하지 않은 덕분에 생기는 문제 같군요. 선언을 다음과 같이 제대로 해주면 해결될 문제 같습니다.

코드:

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

위로
사용자 정보 보기 비밀 메시지 보내기

이전 글 표시:   

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다