32bit -> 64bit 전환시 에러

alwaysN00b의 이미지

안녕하세요.
질문이 2가지 입니다.

SunFire 6800 입니다.
컴파일러는 최신버젼이라는데.. 확실히는... (sun workshop 라이센스 산겁니다)

첫번째로
함수 호출후 리턴할때 stack을 정리해 버리던데
정리 안하는 방법은 없을까요?(윈도우에서는 __fastcall 인가 하는.. 하여튼 그렇게 만들어 놓은 함수가 한두개가 아닙니다.)

두번째로
이것땜에 머리가 다아픔니다.
함수에 char 2차원배열중에 하나의 값을 넘겨줍니다.
함수 호출전에 주소를 출력하니 9자리입니다.(%p)

char * 로 받으니 8byte 라 사용할려구 하니 세그폴트 나버립니다.

넘겨줄 변수가 전역변수 인데 주소값이 잘려서 넘어가는게 이해가 안됩니다.
(index를 넘겨줄수도 있지만 프로그램이 조금 지저분해서 수정할게 아주 많습니다.)

ex)
함수 호출전 ==> 0x100027ac8

함수 호출, 함수내 ==> 0x27ac8

dbx로 확인했고 코드내에 삽입해서도 확인했습니다.

조언 바랍니다.

ps. pm되시는 분이.. "웬만하면 포인터는 쓰지마.." 하시고 용역은
기초적인 링크드 리스트 이해가 안된다고 저보고 잘난척한다고 합니다. --;;왜 포인터 쓰냐고.. 정말 일할 맛이 안나네요...

익명 사용자의 이미지

코드로 얘기해보지요?

doldori의 이미지

말로 설명하는 것보다는 코드를 직접 올리시는 편이 답을 얻기 쉬울 것 같습니다.

alwaysN00b의 이미지

아.. 죄송합니다.
망이 틀려서.. 급하게 올리느라.. 용서해주시길..
:oops:

char Cp_data[14][61];
//나머지 전역변수들
char *Exch(char , char *); 

main(){

// 생략

      prnitf("호출 전 : 0x%p \n",Cp_data[0]);
      Exch(och, Cp_data[0]);

}

char *Exch(char dd,char *dt){
      printf("호출 함수내 : 0x%p \n", dt);
      printf("dt : %s \n",dt); //여기서 죽습니다.
      //생략
}

결과가

    호출 전 : 0x100277ac8
    호출 함수내 : 0x277ac8
Segmentation fault(memory dump)

main에서 선언한 변수와 전역에서 선언한 변수 주소 확인 해봐야겠습니다. .. 퇴근이라.. 급해서.

급하게 쓰느라 성의가 없군요. 죄송합니다. 내일 출근해서 테스트 하고 추가적인 질문 올리겠습니다.

언제나 시작

rasungboy의 이미지

alwaysN00b wrote:
아.. 죄송합니다.
망이 틀려서.. 급하게 올리느라.. 용서해주시길..
:oops:

char Cp_data[14][61];
//나머지 전역변수들
char *Exch(char , char *); 

main(){

// 생략

      prnitf("호출 전 : 0x%p \n",Cp_data[0]);
      Exch(och, Cp_data[0]);

}

char *Exch(char dd,char *dt){
      printf("호출 함수내 : 0x%p \n", dt);
      printf("dt : %s \n",dt); //여기서 죽습니다.
      //생략
}

결과가

    호출 전 : 0x100277ac8
    호출 함수내 : 0x277ac8
Segmentation fault(memory dump)

main에서 선언한 변수와 전역에서 선언한 변수 주소 확인 해봐야겠습니다. .. 퇴근이라.. 급해서.

급하게 쓰느라 성의가 없군요. 죄송합니다. 내일 출근해서 테스트 하고 추가적인 질문 올리겠습니다.

확실히 이 코드만으로 이러한 문제가 생기나요?

혹시나 해서 컴파일 되게 소스좀 고쳐서 해봤는데

역시나 문제는 없고요...

생략한 부분들도 좀 올려주시면 안되실련지..?

익명 사용자의 이미지

정확히 비교를 할려면,
Exch(och, Cp_data[0]); 를 Exch(och, &Cp_data[0]); 로 바꾸어야 겠죠.
그리고 죽는 이유는 아직 값이 할당안되어서 Null 찾을때까지 일 하느라 바빠서 이겠죠.

익명 사용자의 이미지

char Cp_data[14][61];
//나머지 전역변수들
char *Exch(char , char *); 

main(){
      setbuf(stdout, 0); // 라이브러리수준의 버퍼링을 제거;디버깅시 유용
// 생략

      prnitf("호출 전 : 0x%p \n",Cp_data[0]);
      Exch(och, Cp_data[0]);

}

char *Exch(char dd,char *dt){
      printf("호출 함수내 : 0x%p \n", dt);
//      printf("dt : %s \n",dt); //여기서 죽습니다.
      printf("dt : %c \n",*dt); //첫번째 문자만 찍어보겠음
      //생략
}

올려 주신 코드만으로 테스트 해볼 곳은 2군데 입니다.
단일 파일내에 Exch()와 main()있다는 가정하에서는,
첫번째, 라이브러리 수준의 버퍼크기를 0으로 놓고 출력하는것입니다.(printf()이후 fflush(stdout);을 써주는것과 동일효과)
두번째, printf()에 대한 고민

익명 사용자의 이미지

손님X2 wrote:

...
아직 값이 할당안되어서 Null 찾을때까지 일 하느라 바빠서 이겠죠.

글로벌변수라서 0으로 초기화될텐데요?
doldori의 이미지

손님X2 wrote:
정확히 비교를 할려면,
Exch(och, Cp_data[0]); 를 Exch(och, &Cp_data[0]); 로 바꾸어야 겠죠.

아닙니다. Cp_data[0]의 형은 char[61]이고 인자로 전달되면서 char*로
변환되므로 Exch의 프로토타입과 일치합니다.
그러나 &Cp_data[0]은 char(*)[61]이므로 char*와 호환되는 형이 아닙니다.

%p로 출력할 때는 void*로 변환해야 하며, 그렇지 않을 때의 결과는 정의되지 않습니다.
(이 때문에 세그폴트가 났을 가능성은 아주 적습니다만.)

printf("호출 전 : 0x%p \n", (void*)Cp_data[0]);
printf("호출 함수내 : 0x%p \n", (void*)dt);
alwaysN00b의 이미지

답변 주신 분들 감사드립니다.

doldori wrote:
손님X2 wrote:
정확히 비교를 할려면,
Exch(och, Cp_data[0]); 를 Exch(och, &Cp_data[0]); 로 바꾸어야 겠죠.

아닙니다. Cp_data[0]의 형은 char[61]이고 인자로 전달되면서 char*로
변환되므로 Exch의 프로토타입과 일치합니다.
그러나 &Cp_data[0]은 char(*)[61]이므로 char*와 호환되는 형이 아닙니다.

%p로 출력할 때는 void*로 변환해야 하며, 그렇지 않을 때의 결과는 정의되지 않습니다.
(이 때문에 세그폴트가 났을 가능성은 아주 적습니다만.)

printf("호출 전 : 0x%p \n", (void*)Cp_data[0]);
printf("호출 함수내 : 0x%p \n", (void*)dt);

doldori 님의 말씀이 맞고 %x로 하니 8자리 까지 출력되더군요.
9자리부터는 짤려서 나옵니다.

코드 올린부분 테스트 해보니 char * 로 주소 잘 받아집니다.
혹시나 다른 라이브러리가 32bit로 컴파일 되었나 해서 확인하니 그것도 아니고..

답은 좀 황당했습니다.

라이브러리 헤더를 include 안해놨더군요.( 그부분 확인을 안한 제 잘못도 있지만요)

특정 라이브러를 사용하는데 헤더를 include 안했는데 컴파일은 잘되었습니다(워닝도 없습니다). 그런데, 64bit로 전부 컴파일해도 헤더 파일 include 안하니 9자리의(16진수) 주소가 함수에서 받을때는 8자리만 받아지더군요.

다시한번 답변 감사합니다.
ps. 정말 거의 모든 테스트를 했는데... 헤더파일 하나 빠져서 그러니 맥이 빠지더군요..

printf("호출 함수내 : 0x%p \n", (void*)dt);

아 그렇군요.. 몰랐습니다. :)

언제나 시작

kslee80의 이미지

alwaysN00b wrote:

특정 라이브러를 사용하는데 헤더를 include 안했는데 컴파일은 잘되었습니다(워닝도 없습니다). 그런데, 64bit로 전부 컴파일해도 헤더 파일 include 안하니 9자리의(16진수) 주소가 함수에서 받을때는 8자리만 받아지더군요.

64bit 환경에서 int 가 32bit 인게 영향을 미친 듯 싶네요.
대부분의 컴파일러들은 프로토타입 선언 없이 함수 호출이 일어나는 경우,
리턴값은 int, 아규먼트들도 모두 int 로 생각하고 컴파일 하기 때문에
32bit 환경에서는 sizeof(int) == sizeof(char *) 여서 별 문제 없었지만,
64bit 에서는 sizeof(int) < sizeof(char *) 라서 문제가 된 것인가 보네요;;

gcc 에서는 -Wall 옵션을 주면 프로토타입 선언 없이 함수 호출이
일어나는 경우 경고 메세지를 뿌려줍니다.
SUN 의 cc 에도 비슷한 옵션이 있지 않을까 싶네요.

익명 사용자의 이미지

alwaysN00b wrote:

...
라이브러리 헤더를 include 안해놨더군요.( 그부분 확인을 안한 제 잘못도 있지만요)
...

정확히 11년전에 pc환경에서(dos) 코딩하다가 동일 문제로 고생했던 기억이 있습니다.
질문에서 처럼 32->64는 아니었는데, 다시 생각하게 되는군요.

어쨋거나, 버그를 2년 :twisted: 끌고가지 않아서 다행입니다. 새해에도 건승하세요.

alwaysN00b의 이미지

Anonymous wrote:

어쨋거나, 버그를 2년 :twisted: 끌고가지 않아서 다행입니다. 새해에도 건승하세요.

저도 걱정 했습니다. 2년.. ㅋ

언제나 시작

이준의 이미지

32->64bit 변환할때 는 반드시 다음의 문서를 필독 하시기 바랍니다.

http://developers.sun.com/solaris/articles/solarisupgrade/64bit/Convert.html

여기서 발생한 문제는 위의 Document 에서 Implicit Duplication 문제 입니다.

Hyo-Sung Lee(李曉星/Mark Lee)

KRSF Certified Inline Skate Instructor
Fitness Inline Skate Trainer
Mogul&Freeride Skier
IDOne ski rider
Cafe MogulBuddy/KoreaMogul
E-Leader(C) Programmer

alwaysN00b의 이미지

이준 wrote:
32->64bit 변환할때 는 반드시 다음의 문서를 필독 하시기 바랍니다.

http://developers.sun.com/solaris/articles/solarisupgrade/64bit/Convert.html

여기서 발생한 문제는 위의 Document 에서 Implicit Duplication 문제 입니다.

감사합니다. 많은 도움이 되었습니다. :)

언제나 시작

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.