파라미터 패싱이 이상.. 귀신이 곡할 노릇..ㅜㅜ

emanwon의 이미지

caller(...)
{
Info* a;
.
.
free_relation(a); // a = 0x8109e38
}

free_relation(Info* a) a = 0xffffffff ??
{
.
.
.

}
위와 같이 함수를 호출하면 파라미터 값이 바뀝니다.
GDB로 찍어보면 caller()에서 a는 분명히 8109e38
이라는 주소를 넘기는 것으로 나옵니다.
근데 callee측(free_relation)에서 파라미터값을 찍어보면
a가 ffffffff로 바뀌어 segmentation fault 가 납니다..ㅜㅜ
이런 현상 겪어 보신분 계신가요??

참고로 소스코드는 약 2메가 정도 됩니다.
확실한것은 side effect같은건 전혀 없습니다.

마감일자 얼마 안남았는데 클났네요.ㅜㅜ
도와주세요~~

addnull의 이미지

이상하군요.
제가 테스트해보니 메모리할당여부와 상관없이
caller, free_relation에서 같은 주소가 찍히는게 맞는 것 같은데요.
side effect가 없다고 하셨는데
아직 발견 못하신게 아닌가 싶네요 ^^;;

간단한 테스트코드를 만들어서 해보세요.
아니면 새프로젝트를 생성해서 기존의 것으로부터
부분적으로 옮겨서 테스트해보세요.

2005년 10월 24일.

cinsk의 이미지

경험상 그런 증상이 있을 때 의심해 볼 수 있는 것은:

첫째. thread 또는 shared memory를 썼을 때, critical section인 곳에 lock/unlock을 하지 않았을 경우,
둘째, 완전하지 않은 rule을 가진 Makefile로 작업시 clean하지 않고, build했을 경우,

정도네요.

익명 사용자의 이미지

뭔가 Side Effect(?)가 없을리가 없다고 봅니다.
함수를 호출하고 돌아온 후에도 a값이 0xffffff..인지요? (중간에 fault를 넘기던지 해서 테스트를...)
그렇다면, Info* a의 주소에(포인터의 값 말고 포인터의 주소) GDB로 Watchpoint를 걸어서 어느 코드에서 a의 값이 바뀌는지 확인해보시는게 어떨까요?

IsExist의 이미지

디버깅용 바이너리는 옵티마이즈 옵션을 끄고 하세요

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

lovewar의 이미지

시스템 환경이 궁금합니다.

CPU 또는

컴파일러의 사양좀 알려주시면 도움이 될것 같습니다.

컴파일러 마다 파라미터 패싱하는 방법이 다를 수 있는것 같습니다.

알고 있는 것으로는

범용 레지스터를 사용하여 패싱하는 방법
스택을 사용하여 패싱하는 방법
그리고, 아규먼트리스트를 사용하여 패싱하는 방법

익명 사용자의 이미지

시스템 환경이 어떠하든간에 저런 상황이 된다는것 자체가
말이 안되는걸로 보입니다.

파라미터 패싱방법, 컴파일러 종류, 시스템 환경과
무관하게 저 경우는 올바른 값이 전달되어야 합니다.
분명히 찾지 못한 side effect가 있을것으로 생각됩니다.

익명 사용자의 이미지

윗분들 말씀대로 말이 안되죠.

하지마 소스레벨 디버거가 실수는 종종 하죠.

어셈블리어로 확인해보심이~

익명 사용자의 이미지

int free_relation(Info* a); // prototype definition ??

prototype definition은 참조한(caller) 프로그램 헤더에서 해주고 있겠지요?

emanwon의 이미지

아무래도 어디선가 side effect가 있나 보네요..

lovewar의 이미지

Quote:

파라미터 패싱방법, 컴파일러 종류, 시스템 환경과
무관하게 저 경우는 올바른 값이 전달되어야 합니다.
분명히 찾지 못한 side effect가 있을것으로 생각됩니다.

올바른 환경이 구축(구현)되어 있다는 가정하여,

side effect(원치 않는 행위)을 찾을 수 있을것으로 봅니다.

익명 사용자의 이미지

stack overflow도 고려대상이 될 듯 싶습니다.

익명 사용자의 이미지

위는 거대 로컬변수의 선언 등이 예측되는 것이고,
플랫폼, 사용라이브러리등에 대해서도 간략하나마, 언급이 있으셔야 겠군요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.