이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
unipro 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 번 수정됨 |
|
위로 |
|
|
stoneshim 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
가입: 2002년 12월 25일 올린 글: 17
|
올려짐: 2003년3월12일 13:59 주제: (질문한 이)바이트 순서와 함수 파라미터와는 무슨 관계인지요? |
|
|
메모리에서 바이트를 다른 순서로 정렬하는 것에 대한 이식성하고
위에서 함수 파라미터의 어드레스를 사용하지 않는 것하고는
무슨 관계가 있는지 잘 이해가 가지 않습니다. |
|
위로 |
|
|
pynoos expert
가입: 2003년 2월 9일 올린 글: 251 위치: 서울 |
올려짐: 2003년3월12일 14:07 주제: |
|
|
메모리 바이트 순서하고, 함수 파라미터 사용에 대한 것이라…..
크게 신경쓰이지 않는 문제같습니다.
pointer를 pointer 답게만 사용하면 되고,
강제로 long 등으로 바꾼뒤 무슨 연산을 하는 짓만 안하면,
그다지 문제가 되지 않습니다. _________________ 가는 선, 정교한 생명시계.
오늘도 하루를 오차없는 프로그램처럼 살아 있다. |
|
위로 |
|
|
체스맨 user
가입: 2002년 12월 20일 올린 글: 38
|
올려짐: 2003년3월13일 14:24 주제: Re: 이식성 있는 프로그램의 작성 시 함수 파라미터의 사용을 피 |
|
|
예제의 출처가 궁금하네요. 글쓴이가 무엇을 말하고 싶은 건지
모르겠습니다. ‘바이트 순서’가 바이트오더(byte order)를 의미한다면,
이기종간 바이트 오더가 중요한 문제이긴 합니다만,
지금 예제에서는 그 중요함에 대해 제대로 다루고 있는 것 같지 않아
보이구요, 특히 char 와 같이 단일 바이트인 경우는 바이트 오더에
구애받지 않습니다. 지금 예제는 char 타입인 경우를 다루고 있네요. |
|
위로 |
|
|
wizcat novice
가입: 2003년 1월 22일 올린 글: 9
|
올려짐: 2003년3월13일 16:13 주제: |
|
|
아무상관없음…
그문제의 포인가 뭔지는 모르겠지만..
(1)번과 (2)번은 똑같습니다..
local변수와 파라미터는 똑같이 stack영역에 생깁니다. |
|
위로 |
|
|
unipro novice
가입: 2002년 12월 25일 올린 글: 17
|
올려짐: 2003년4월3일 11:25 주제: 예제의 출처입니다. |
|
|
Beginning Linux Programming – 2nd Edition, 정보문화사
부록 A 이식성 에서 바이트 순서 부분입니다.
저자가 잘못 알고 있을 것일까요?
저자가 자신의 생각을 표현하는데 문제가 있었던 것일까요?
번역에서 오류가 난 것일까요?
이것에 대해 아는 사람이 아직 나타나지 않을 것일까요? |
|
위로 |
|
|
unipro novice
가입: 2002년 12월 25일 올린 글: 17
|
올려짐: 2003년4월4일 10:49 주제: 왜 함수 파라이터의 어드레스를 사용하지 않아야 하는지 대충 알 |
|
|
함수 파라메타는 함수로 넘어갈 때 확장될 수 있다네요. 예를 들어 char는 int로 확장되어서 넘어갈 수 있는 경우지요. 따라서 직접적으로 함수 파라이터의 어드레스를 사용할 경우 바이트 순서에 차이에 의해서 다른 결과를 얻을 수 있다고 하네요.
디스크의 데이터나 네트워크를 통한 데이터 전송의 경우는 예전부터 알고 있었는데, 함수 파라이터의 경우에도 잘못하면 이식성에 문제가 될 수 있더군요.
관심 갖지고 답변해준 동지님(?)들께 감사드립니다. |
|
위로 |
|
|
체스맨 user
가입: 2002년 12월 20일 올린 글: 38
|
올려짐: 2003년4월5일 0:48 주제: Re: 왜 함수 파라이터의 어드레스를 사용하지 않아야 하는지 대 |
|
|
아, 그렇습니다. 저도 이해가 되네요.
말씀하신 책을 찾아봤는데, 그 책을 쓸 정도의 분이 이 정도를 간과할 것
같진 않았습니다. 사실 지금 예제 코드처럼 쓰는 경우는 거의 없지만,
문제는 일으킬 수 있겠네요.
대개 32비트 이상의 시스템에서는 기본 정수 크기 이하의 정수는
기본 정수 크기로 확장되어 넘어가죠. printf 에서도 이런 확장 규칙과
연관되게 되어 있죠.
좋은 예제네요. ^^ |
|
위로 |
|
|
lsj0713 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 님께서 답변을 달아주셨는데 아직 구글 뉴스그룹쪽으로 글이 전달되지 않은 것 같군요. 조만간 구글 쪽으로도 볼 수 있을 겁니다.
간단하게 요약하면, 함수의 선언을 제대로 하지 않은 덕분에 생기는 문제 같군요. 선언을 다음과 같이 제대로 해주면 해결될 문제 같습니다.
코드: |
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
|
|
위로 |
|
|
|