2012-11-13 4 views
0

을 먼저 사용합니다. 코드를 제공하지 않아서 변명의 여지가 있지만 오류가 임의로 발생하기 때문에 발췌 한 C + P는 어렵습니다.EXC_BAD_ACCESS GCC로 컴파일 할 때 Clang은

GCC로 C 소스를 컴파일 할 때 매우 이상한 오류가 발생합니다. Erlang 용 링크드 인 드라이버를 개발 중입니다. 오류의 원인을 이해하지 못합니다. 오류는 다음과 같이 나타납니다 :

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_INVALID_ADDRESS at address: 0xffffffffb012aae8 
[Switching to process 7316 thread 0x1503] 
ktqk_exec (query=0x13e0af00, table=0x13e00ea0) at ktqk.c:215 
215 clock_t start = clock(); 

나는 Erlang 가상 머신을 GDB로 랩핑하여 메모리 섹션에 액세스 할 수 있습니다. 나에게, 높은 주소 0xffffffffb012aae8는 매우 의심스럽게 보입니다. 그러나 Clang의 모든 기능은 예상대로 작동하지만 오류는 발생하지 않으며 segfault가 없습니다. 나는 조사를 시도했다 :

(gdb) p clock 
$1 = {<text variable, no debug info>} 0x7fff85c29fd0 <clock> 
(gdb) p start 
$2 = 2954013712 

그래서 분명히 가치는 초기화되지 않았고, 추락했다. 같은 파일에 중단 점을 설정하면 간단히 건너 뜁니다. 왜 모든 것이 Clang과 작동하지만 GCC에서는 작동하지 않습니까?

기본적으로 Clang은 C99와 GCC C89를 사용하기 때문에 GCC에서 컴파일을 위해 -std=c99 플래그를 포함해야했습니다. 잠재적 인 출처가 될 수 있습니까? 그러나 위 코드를 주석 처리하면 다음 함수 호출에서 실패합니다. 그래서 어떻게 든 함수 호출과 관련이있는 것 같습니다. 그럼에도 불구하고이 줄 앞에있는 모든 함수 호출은 문제가 없습니다.

매우 이상한 오류입니다. 아무도 아이디어가 있니? 이 오히려 퍼지 설명 미안 해요, 단순히 오류를 이해하지 오전.

모든 최선을, 마틴

+0

너무 현지화되어있어 닫으려고합니다. 오류는 질문 자체의 텍스트와 완전히 관련이없는 것으로 밝혀졌으며 음의 배열 색인이었습니다. – unwind

+0

그래,이 일은 끝내도 돼, 미안해. –

답변

0

나는 내 자신의 질문에 대답 할 수 : 오류의 원인이 된 코드는 아래에서 확인할 수 있습니다

그래서 select
... 
int select = -1; 

for (int p = 0; p < SIZE_KEYS; p++) 
    if (parts[p] == query->count && (select == -1 || sizes[p] < sizes[select])) 
    select = p; 

int *index[lists[select]]; 
if (select != -1) { 
    ... 
} 
... 

이 경우, -1로 초기화 된 무엇인가 발견되었을 것입니다, 그것은 > 0이었을 것입니다. 자, 나의 예에서는 아무것도 발견되지 않았다. 그래서 select = -1. lists에 -1을 넣으면 결과도 lists[select] = -1이므로 분명히 같은 메모리 영역 select이됩니다. 그러나 이제는 크기 -1의 정수 포인터 목록을 초기화합니다. 그리고 그것은 분명히 잘못되었습니다.

왜이 심각한 오류에 대해 Clang은 불평하지 않습니다!?

+0

필자가 말할 수있는 한, 음의 크기로 배열을 초기화하지 않고, 음의 인덱스 요소에 액세스하고있다. *는 (p-1)이 완벽하게 정의되어있다. 여기서 p는 배열 요소는 잘 정의되어 있습니다. 예를 들어보십시오 http://stackoverflow.com/questions/3473675/negative-array-indexes-in-c – rubenvb

+0

'int * index [-1]'이 스택 변수의 유효한 초기화라고 생각하지 않습니다. 아니면 내가 틀렸어? –

+0

처음 읽는 것이 잘못되었거나 이전 버전을 보았습니다. 나는 두려워한다. 죄송합니다. – rubenvb

관련 문제