2012-05-26 3 views
1

C로 프로그래밍 할 때 이상한 문제가 발생했습니다. 때때로 함수가 실행되고 다른 시간에 실행되지 않으며 이러한 오류 (스택 스매싱 감지 및 getenv에 대한 소스 없음) 나는 때때로 실패하는 이유에 대한 해답을 찾지 못하는 것 같습니다. 나는 그것을 디버깅하려고 시도하고 마지막 문자 (""})에만 문제가 있기 때문에 다른 모든 기능을 실행한다. (그러나 그것들은 많이 테스트되었지만) 가끔은 떨어져서 실행되지 않는다. 마지막 함수 (이 함수 내에서 실행되기도하기 때문에 작동 할 수 있습니다.) 또한 마지막 몇 번은 가끔씩 끝까지 실행되는 경우에도 세그멘테이션 오류가 발생한 기능을 실행했습니다. 이 문제를 디버깅 할 수있는 방법이 있습니까? 여기 내 코드는 다음과 같습니다.스택 스매싱이 감지되었고 getenv 소스가 없습니다.

void main(int argc, char * argv[]) { 
FILE * fin=fopen(argv[1],"r"); 
char v[1024]; 
int col; 
matrix m=emptyS(); 
while(fscanf(fin, "%s",v)!=EOF) { 
    int i=0; 
    int * w = (int*) malloc(sizeof (int)); 
    int str=strlen(v); 
    int size=0; 
    while(i<str) { 
     char a[4]; 
     int y; 
     for(y=0;y<4;y++) 
      a[y]='\0'; 
     int x=0; 
     while(v[i]!=',') { 
      a[x]=v[i]; 
      i++; 
      x++; 
     } 
     i++; 
     size++; 
     w=realloc(w,size*sizeof(int)); 
     w[size-1]=atoi(a); 
    } 
    m=add(m,w,size); 
    col=size; 
} 
fclose(fin); 
graphW wg=discWD(col-1); 
int k=0; 
while(k<(col-2)) { 
    int j=k+1; 
    while(j<(col-1)) { 
     wg=add_Wedge(wg,k,j,mi(m,k,j,col)); 
     j++; 
    } 
    k++; 
} 
     int* ms=MST(wg); 
graph gbayes=tree(wg,ms); 
bayes b=newBN(gbayes,m); 
FILE * fout=fopen(argv[2],"w"); 
serialize(b,fout); 
fclose(fout); 
} 

감사합니다.

+1

당신은 당신의 코드를 컴파일나요? 디버거 (예 :'gdb')를 사용 했습니까? –

+0

"내 함수가 때때로 실행되고 그렇지 않은 경우"- 어떤 함수 (예 : 이름)를 나타내는 것이 더 도움이 될 것이며 함수가 있어야 할 때 함수가 호출되지 않았거나 오류가 발생했다는 것을 의미합니까? 호출 될 때 발생합니까? – gcbenison

+1

"이 문제를 디버그 할 수있는 방법이 있습니까?" 디버거 사용? –

답변

3

경계를 벗어나는 데 대해 x을 선택하지 마십시오. Valgrind가 너에게 말했을거야. 모든 경고를 활성화하고 디버깅 정보 (예를 들어,`gcc가 -Wall -g` 리눅스)와

while(i<str) { 
     char a[4] = { 0 }; 
     int x=0; 
     while(v[i]!=',') { 
      a[x]=v[i]; /* here you access a[x] without check for x */ 
      i++; 
      x++; /* Here it may go >= 4*/ 
     } 
     i++; 
     size++; 
     w=realloc(w,size*sizeof(int)); 
     w[size-1]=atoi(a); 
    } 
+0

대단히 감사합니다! 내 문제를 해결했다고 생각해! 추가 질문이 하나 있는데,이 while 루프를 반복 할 때마다 x를 다시 선언한다는 것을 알면 잘 작동하지 않아야합니까? –