2014-04-17 2 views
4

이 함수는 복잡한 둥지에 묻혀 있으므로 실제로 찾을 수있는 것 이상의 원인 일 가능성이 높습니다. 그러나 누군가 내가 갈 수도있는 방법에 대한 팁을 줄 수 있는지 궁금합니다. 이 디버깅에 대해. 여기64 비트 함수는 32 비트 포인터를 반환합니다.

//func1.c 
somestruct* func1(somestruct* mystruct) 
{ 
    printf("func1: %p, %i\n", mystruct, mystruct->foo); 
    return mystruct; 
} 
//func2.c 
somestruct* func1(somestruct* mystruct); 
void func2() 
{ 
    somestruct *mystruct = malloc(sizeof(somestruct)); 
    mystruct->foo = 10; 
    printf("func2: %p, %i\n", mystruct, mystruct->foo); 
    mystruct = func1(mystruct); 
    printf("back in func2: %p\n", mystruct); 
    free(mystruct); 
} 

와 나는 문제에 봉착 코드의 요지이다 그리고 FUNC2 호출합니다. 출력은 너무

func2: 0x7f38a00008c0, 10 
func1: 0x7f38a00008c0, 10 
back in func2: 0xffffffffa00008c0 
(SEGFAULT trying to free 0xffffffffa00008c0) 

실제 코드는 기능이 다른 파일에 있다는 사실은의 일부가 될 수있는 것처럼뿐만 아니라 문제가없는 다른 많은 장소에서 주위에 전달되는 더 복잡한, "MYSTRUCT"을 보인다 같다 문제, 예 포인터를 반환해야합니다 (반환 된 포인터가 입력 포인터와 동일하게 보장되지 않습니다). 32 비트로 잘린 (실제로는 아니지만) 종류가 있고 맨 위에 ffffffff로 채워져 있다는 것이 정말 이상합니다.

32 비트 시스템에서 컴파일 할 때 정확하게 작동합니다.

나는 어딘가에서 메모리 손상을 고려 했으므로 valgrind를 통해 실행했습니다. Valgrind는 오류를보고하지 않으며 사실 성공적으로 완료합니다. 교과서가있다. 최소한 나는 GDB를 사용할 수있다.

누군가가이 문제를 일으킬 수있는 아이디어가 있거나 최소한 문제를 추적하기 시작할 수 있습니까?

+2

이것은 포인터가 부호있는 int (32 비트)처럼 캐스트 된 것처럼 보이고 포인터로 다시 캐스트됩니다. 비트 31 (32 비트 int의 부호 비트)이 상위 32 비트로 확장됩니다. – DoxyLover

+0

같은 프로젝트의 파일들이 같은 설정으로 같은 메이크 파일로 컴파일되어 있습니까? func1은 실제로 무엇을합니까? – Pod

+0

func1은 "tts_struct * get_utterance (tts_struct * utterance, char * text)"를 제외하고 현재 위에서 설명한 것과 같습니다. 테스트 목적으로, 이전에 사용 된 모든 것을 무시하고 주어진 발음을 즉시 반환합니다. 출력은 동일합니다. 그렇습니다. 두 파일 모두 동일한 견해, 동일한 메이크 파일, 개별 객체 파일로 빌드 된 다음 끝에 함께 연결됩니다. – DavidG

답변

7

func2.c에서 함수 프로토 타입 (somestruct * func1 (somestruct * mystruct);)을 빠뜨린 경우 코드를 확인하십시오.

기본적으로 모든 반환 값은 int입니다. 따라서 함수에 프로토 타입이없는 경우 컴파일러는 반환 값을 32 비트로 처리하고 32 비트 반환 값의 코드를 생성합니다. 상위 4 바이트가 잘리는 경우입니다.

관련 문제