2009-07-28 2 views
1

나는 분명히 뭔가를 놓치고 있습니다. 누군가 이것이 왜 일어날 지 설명해 주시겠습니까?왜 fclose에서 segfault가 발생합니까?

#define RANDOM_DEVICE "/dev/random" 
int create_shared_secret(char * secret,int size) 
{ 
    FILE * file=NULL; 
    int RetVal; 

    file=fopen(RANDOM_DEVICE,"r"); 
    if(!file) 
    { 
    printf("Unable to open random device %s\n",RANDOM_DEVICE); 
    exit(-1); 
    } 
    RetVal=fread(&secret,1,size,file); 
    if(RetVal!=size) 
    { 
    printf("Problem getting seed value\n"); 
    exit(-1); 
    } 

    if(file) fclose(file); //segfault right here 
    return 0; 
} 

답변

9

'secret'변수를 읽을 때 파일 변수를 borked로 덮어 씁니다. 'secret'는 이미 포인터이므로 '&'연산자가 필요하지 않습니다.

FREAD 라인 읽어야

RetVal=fread(secret,1,size,file); 

당신이 기본적으로 넘쳐, 너무 많은 방법 읽기 (대신 비밀가 가리키는 메모리의) 비밀에 새 포인터 값을 읽고하고있는 당신의 다른 변수들. 이 함수 내에서 비밀을 사용했다면 segfault가 발생했을 것입니다 (바라건대, 불행한 경우 프로그램의 다른 부분에서 임의의 손상을 입었습니다).

HTH.

+0

나는 그 바보 같은 짓을했다고 믿을 수가 없습니다. 감사. – Belrog

+0

+1 정답과 좋은 설명의 우승 한 조합. –

+0

@caf :'fread'는'void *'를 사용합니다. 경고 할 전환이 없습니다. –

4

내 생각 엔 문제는 바로 여기입니다 :

RetVal=fread(secret,1,size,file); 

아니면, 버퍼가 secret가 가리키는 정말 size 바이트되지 않습니다 :

RetVal=fread(&secret,1,size,file); 

는 다음과 같은 의미입니까?. 올바르게 할당 했습니까?

3

fread(&secret,... 비밀 유형이 char* 인 경우는 secret이 가리키는 값에 쓰는 대신 scecret의 값을 덮어 쓰고 그 다음에 probaly 파일을 덮어 씁니다.

관련 문제