2012-04-27 95 views
-1

我想運行一個C程序。這似乎很好地工作,但最終它表明:檢測到堆棧碎片。 C編程

堆棧溢出DETECTED

這是代碼:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 

extern int errno; 

int main(int argc, char *argv[]){ /*Para pasar argumentos a la funcion main*/ 

char id[7]="\0";  
char orden[10]="\0"; 
char arg[3]="\0"; 
char idhijo[7]="\0";  
char ordenhijo[10]="\0"; 
char arghijo[3]="\0"; 

int i=0, j=0, k=0; 

int a=1, pipe1[2], pipe2[2], control, argument=0, status, posx=50, posy=50, s, t, arg_val=0, orden_val=0; 

FILE *fichero; 

char mensaje1[4], mensaje2[4], mensaje3[6]; 
char posxpadre[4]="50", posypadre[4]="50", hijoPID[4]; 

system("clear"); 

control = pipe(pipe1); 
if(control !=0){ 

perror("pipe1"); 
exit(errno); 
} 

control = pipe(pipe2); 
if(control !=0){ 

perror("pipe2"); 
exit(errno); 
} 

control = fork();        

fichero=fopen(argv[1], "r"); 
if (fichero){ 

while((i != EOF) && (j != EOF) && (k != EOF)){ 


if((i != EOF) && (j != EOF) && (k != EOF)){ 

    if (control ==-1){ 

    perror("fork"); 
    exit(errno); 

    } 


    if (control !=0){ 


     k=fscanf(fichero, "%s", id); 
     i=fscanf(fichero, "%s", orden); 
     j=fscanf(fichero, "%s", arg); 


     if(Robot_valido(id)){ 

      write(pipe1[1], id, 7); 
       write(pipe1[1], arg, 3); 
       write(pipe1[1], posxpadre, 4);    
       write(pipe1[1], posypadre, 4); 
       write(pipe1[1], orden, 10); 

      read(pipe2[0], posxpadre, 4); 
      read(pipe2[0], hijoPID, 6); 
      read(pipe2[0], posypadre, 4);    

      printf("Hijo con PID %s desplazo el robot a la posicion: (%s, %s)\n\n", hijoPID, posxpadre, posypadre); 

      } 
} 

else{ 

    read(pipe1[0], idhijo, 7); 
    read(pipe1[0], arghijo, 3); 
    read(pipe1[0], posxpadre, 4); 
    read(pipe1[0], posypadre, 4); 
    read(pipe1[0], ordenhijo, 10); 

    if (Robot_valido(idhijo)!=0){ 

     Orden_valida(ordenhijo, arghijo, &orden_val, &arg_val); 

     if (orden_val !=0 && arg_val !=0){ 

      argument=atoi(arghijo); 
      posy=atoi(posypadre); 
      posx=atoi(posxpadre); 

     if (strcmp(ordenhijo, "arriba")==0){ 

      if (posy>1){ 

       while (argument > 0){ 

        if (posy>0){ 

        posy--; 
        argument--; 
         } 

        else{ 

        argument=0; 
        } 
       } 
        } 
      } 

     if (strcmp(ordenhijo, "abajo")==0){ 

        if (posy<100){ 

       while (argument > 0){ 

        if (posy<100){ 
        posy++; 
        argument--; 

        } 

        else{ 

        argument=0; 
        } 
       } 
        } 
      } 

     if (strcmp(ordenhijo, "derecha")==0){ 

        if (posx<100){ 

        while (argument > 0){ 

        if (posx<100){ 
         posx++; 
         argument--; 

         } 

        else{ 
         argument=0; 
        } 
       } 
       } 
      } 

     if (strcmp(ordenhijo, "izquierda")==0){ 

       if (posx>0){ 

        while (argument > 0){ 

        if (posx>0){ 
         posx--; 
         argument--; 
         } 

        else{ 

         argument=0; 
        } 
         } 
       } 
      } 



     printf("Robot desplazado hasta la posicion: (%d, %d)\n", posx, posy); 



     sprintf(mensaje1, "%d", posx); 
     sprintf(mensaje2, "%d", posy); 
     sprintf(mensaje3, "%d", getpid());  

     write(pipe2[1], mensaje1, 4); 
      write(pipe2[1], mensaje3, 6); 
     write(pipe2[1], mensaje2, 4); 

     } 

    } 

    } 
    } 
} 

close(pipe1[0]); 
close(pipe1[1]); 
close(pipe2[0]); 
close(pipe2[1]); 

} 

} 

有誰知道爲什麼發生這種情況?我在谷歌做了很多研究,但我嘗試過的每一個可能的答案都沒有奏效。任何幫助都會非常有幫助。

謝謝大家!

+0

你有一個堆棧溢出的地方。您可以在編譯器中禁用堆棧cookie,這可能會導致分段錯誤,您可以在調試器中進一步分析。 – 2012-04-27 12:54:57

+0

你看這裏:http://stackoverflow.com/questions/1345670/stack-smashing-detected? – Nick 2012-04-27 12:55:00

+2

如果您打算請人幫助您,請確保您的代碼格式良好,特別是如果您打算髮布這麼多內容。 (由於混合了標籤和空格,縮進非常破裂) – huon 2012-04-27 13:00:14

回答

2

你正在做很多I/O進入非常小的緩衝區。如果有任何溢出,他們很可能粉碎堆棧。

如果可能,您應該在Valgrind中運行您的程序。您也可以嘗試增加緩衝區的大小,並從fscanf()切換到更安全的位置(例如用fgets()讀取一整行,然後解析它在內存中)。