Segmentation fault ;

di il
11 risposte

Segmentation fault ;

Salve a tutti,
ho un problema con una funzione che mi da s.fault e con valgrind il fastidiosissimo " Invalid read of size 1" ,vi posto il codice :

char *ar[]={"--autore=ciccio","--titolo=c'era una volta in america","--edizione=c"
			};


int parse(char *);
char **a1,**a2;
int i=0,j=0;

int main(){

int m=3;
while(m>=0)
{
	if((parse(ar[m]))==-1)
	{
		printf("w");
		exit(1);
	}
	printf("\n%s-%s\n",a1[i],a2[j]);
m--;
}

return 0;
}

int parse(char *s)
{

	char *token=NULL;
	char *a=NULL;
	a=strdup(s);
	if(a==NULL)
	{
		errno=ENOMEM;
		return -1;
	}

		token=strtok(a,"=");
		printf("1");
		if(strcmp(token,"--autore")==0)
		{
			printf("2");
			sprintf(a1[i],"%s","autore");
			printf("3");
			token=strtok(NULL,"\0");
			if(token==NULL)
			{
				printf("4");
				free(a);
				errno=EINVAL;
				return-1;
			}
			printf("5");
			sprintf(a2[j],"%s",token);
			i++;
			j++;
			free(a);
			printf("6");
		}
		else if(strcmp(token,"--titolo")==0)
		{
			sprintf(a1[i],"%s","titolo");
			token=strtok(NULL,"\0");
			if(token==NULL)
			{
				free(a);
				errno=EINVAL;
				return-1;
			}
			sprintf(a2[j],"%s",token);
			i++;
			j++;
			free(a);
		}
		else if(strcmp(token,"--editore")==0)
		{
			sprintf(a1[i],"%s","editore");
			token=strtok(NULL,"\0");
			if(token==NULL)
			{
				free(a);
				errno=EINVAL;
				return-1;
			}
			sprintf(a2[j],"%s",token);
			i++;
			j++;
			free(a);
		}
		else if(strcmp(token,"--luogo_pubblicazione")==0)
		{
			sprintf(a1[i],"%s","luogo_pubblicazione");
			token=strtok(NULL,"\0");
			if(token==NULL)
			{
				free(a);
				errno=EINVAL;
				return-1;
			}
			sprintf(a2[j],"%s",token);
			i++;
			j++;
			free(a);
		}
		else if(strcmp(token,"--anno")==0)
		{
			sprintf(a1[i],"%s","anno");
			token=strtok(NULL,"\0");
			if(token==NULL)
			{
				free(a);
				errno=EINVAL;
				return-1;
			}
			sprintf(a2[j],"%s",token);
			i++;
			j++;
			free(a);
		}
		else if(strcmp(token,"--prestito")==0)
		{
			sprintf(a1[i],"%s","prestito");
			token=strtok(NULL,"\0");
			if(token==NULL)
			{
				free(a);
				errno=EINVAL;
				return-1;
			}
			sprintf(a2[j],"%s",token);
			i++;
			j++;
			free(a);
		}
		else if(strcmp(token,"--collocazione")==0)
		{
			sprintf(a1[i],"%s","collocazione");
			token=strtok(NULL,"\0");
			if(token==NULL)
			{
				free(a);
				errno=EINVAL;
				return-1;
			}
			sprintf(a2[j],"%s",token);
			i++;
			j++;
			free(a);
		}
		else if(strcmp(token,"--descrizione_fisica")==0)
		{
			sprintf(a1[i],"%s","descrizione_fisica");
			token=strtok(NULL,"\0");
			if(token==NULL)
			{
				free(a);
				errno=EINVAL;
				return-1;
			}
			sprintf(a2[j],"%s",token);
			i++;
			j++;
			free(a);
		}
		else if(strcmp(token,"--nota")==0)
		{
			sprintf(a1[i],"%s","nota");
			token=strtok(NULL,"\0");
			if(token==NULL)
			{
				free(a);
				errno=EINVAL;
				return-1;
			}
			sprintf(a2[j],"%s",token);
			i++;
			j++;
			free(a);

		}
		else
		{
			free(a);
			return -1;
		}

		return 0;
}

11 Risposte

  • Re: Segmentation fault ;

    Tag code PLS
    
    char *ar[] =
        { "--autore=ciccio", "--titolo=c'era una volta in america", "--edizione=c"
    };
    
    int parse(char *);
    char **a1, **a2;
    int i = 0, j = 0;
    
    int main()
    {
    
    	int m = 3;
    	while (m >= 0) {
    		if ((parse(ar[m])) == -1) {
    			printf("w");
    			exit(1);
    		}
    		printf("\n%s-%s\n", a1[i], a2[j]);
    		m--;
    	}
    
    	return 0;
    }
    
    int parse(char *s)
    {
    
    	char *token = NULL;
    	char *a = NULL;
    	a = strdup(s);
    	if (a == NULL) {
    		errno = ENOMEM;
    		return -1;
    	}
    
    	token = strtok(a, "=");
    	printf("1");
    	if (strcmp(token, "--autore") == 0) {
    		printf("2");
    		sprintf(a1[i], "%s", "autore");
    		printf("3");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			printf("4");
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		printf("5");
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    		printf("6");
    	} else if (strcmp(token, "--titolo") == 0) {
    		sprintf(a1[i], "%s", "titolo");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    	} else if (strcmp(token, "--editore") == 0) {
    		sprintf(a1[i], "%s", "editore");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    	} else if (strcmp(token, "--luogo_pubblicazione") == 0) {
    		sprintf(a1[i], "%s", "luogo_pubblicazione");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    	} else if (strcmp(token, "--anno") == 0) {
    		sprintf(a1[i], "%s", "anno");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    	} else if (strcmp(token, "--prestito") == 0) {
    		sprintf(a1[i], "%s", "prestito");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    	} else if (strcmp(token, "--collocazione") == 0) {
    		sprintf(a1[i], "%s", "collocazione");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    	} else if (strcmp(token, "--descrizione_fisica") == 0) {
    		sprintf(a1[i], "%s", "descrizione_fisica");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    	} else if (strcmp(token, "--nota") == 0) {
    		sprintf(a1[i], "%s", "nota");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    
    	} else {
    		free(a);
    		return -1;
    	}
    
    	return 0;
    }
    
    
  • Re: Segmentation fault ;

    Ops ..... pensavo fosse una risposta al problema.....tnks cmq.
  • Re: Segmentation fault ;

    
    int m = sizeof(ar)/sizeof(*ar)-1;
    
  • Re: Segmentation fault ;

  • Re: Segmentation fault ;

    Invalid read of size 1...............
  • Re: Segmentation fault ;

    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    char *ar[] =
        { "--autore=ciccio", "--titolo=c'era una volta in america", "--edizione=c"
    };
    
    int parse(char *);
    char **a1, **a2;
    int i = 0, j = 0;
    
    int main()
    {
    
    	int m = sizeof(ar)/sizeof(*ar)-1;
    	while (m >= 0) {
    		if ((parse(ar[m])) == -1) {
    			printf("w");
    			exit(1);
    		}
    		printf("\n%s-%s\n", a1[i], a2[j]);
    		m--;
    	}
    
    	return 0;
    }
    
    int parse(char *s)
    {
    
    	char *token = NULL;
    	char *a = NULL;
    	a = strdup(s);
    	if (a == NULL) {
    		errno = ENOMEM;
    		return -1;
    	}
    
    	token = strtok(a, "=");
    	printf("1");
    	if (strcmp(token, "--autore") == 0) {
    		printf("2");
    		sprintf(a1[i], "%s", "autore");
    		printf("3");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			printf("4");
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		printf("5");
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    		printf("6");
    	} else if (strcmp(token, "--titolo") == 0) {
    		sprintf(a1[i], "%s", "titolo");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    	} else if (strcmp(token, "--editore") == 0) {
    		sprintf(a1[i], "%s", "editore");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    	} else if (strcmp(token, "--luogo_pubblicazione") == 0) {
    		sprintf(a1[i], "%s", "luogo_pubblicazione");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    	} else if (strcmp(token, "--anno") == 0) {
    		sprintf(a1[i], "%s", "anno");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    	} else if (strcmp(token, "--prestito") == 0) {
    		sprintf(a1[i], "%s", "prestito");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    	} else if (strcmp(token, "--collocazione") == 0) {
    		sprintf(a1[i], "%s", "collocazione");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    	} else if (strcmp(token, "--descrizione_fisica") == 0) {
    		sprintf(a1[i], "%s", "descrizione_fisica");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    	} else if (strcmp(token, "--nota") == 0) {
    		sprintf(a1[i], "%s", "nota");
    		token = strtok(NULL, "\0");
    		if (token == NULL) {
    			free(a);
    			errno = EINVAL;
    			return -1;
    		}
    		sprintf(a2[j], "%s", token);
    		i++;
    		j++;
    		free(a);
    
    	} else {
    		free(a);
    		return -1;
    	}
    
    	return 0;
    }
    
    
    max@studio:~/forum> gcc -Wall -g prova.c
    max@studio:~/forum> valgrind ./a.out 
    ==30592== Memcheck, a memory error detector
    ==30592== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
    ==30592== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
    ==30592== Command: ./a.out
    ==30592== 
    1w==30592== 
    ==30592== HEAP SUMMARY:
    ==30592==     in use at exit: 0 bytes in 0 blocks
    ==30592==   total heap usage: 1 allocs, 1 frees, 13 bytes allocated
    ==30592== 
    ==30592== All heap blocks were freed -- no leaks are possible
    ==30592== 
    ==30592== For counts of detected and suppressed errors, rerun with: -v
    ==30592== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)
    
  • Re: Segmentation fault ;

    Perche l'ultima posizione contiene un elemento che non corrisponde, parse ritorna subito -1 e non viene rilevato l'errore, se modifico l'ultimo elemento in "editore" c'è una corrispondenza, parse controlla e entra nell'if , per fare poi sprintf(a,"editore"); credo sia qui il problema , mi da invalid read of size, sto lavorando su una variabile globale, non so se posso fare sprintf, e se no come faccio a riempire l'array globale?
  • Re: Segmentation fault ;

    
    max@studio:~/forum> head -10 prova.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    char *ar[] =
        { "--autore=ciccio", "--titolo=c'era una volta in america", "--editore=c"
    };
    
    int parse(char *);
    char **a1, **a2;
    max@studio:~/forum> gcc -g -Wall prova.c
    max@studio:~/forum> gdb ./a.out -q
    Reading symbols from /home/max/forum/a.out...done.
    (gdb) b parse
    Breakpoint 1 at 0x40089d: file prova.c, line 32.
    (gdb) r
    Starting program: /home/max/forum/a.out 
    
    Breakpoint 1, parse (s=0x40122c "--editore=c") at prova.c:32
    32              char *token = NULL;
    (gdb) n
    33              char *a = NULL;
    (gdb) n
    34              a = strdup(s);
    (gdb) n
    35              if (a == NULL) {
    (gdb) n
    40              token = strtok(a, "=");
    (gdb) n
    41              printf("1");
    (gdb) n
    42              if (strcmp(token, "--autore") == 0) {
    (gdb) n
    59              } else if (strcmp(token, "--titolo") == 0) {
    (gdb) n
    71              } else if (strcmp(token, "--editore") == 0) {
    (gdb) n
    72                      sprintf(a1[i], "%s", "editore");
    (gdb) n
    
    Program received signal SIGSEGV, Segmentation fault.
    0x0000000000400b13 in parse (s=0x40122c "--editore=c") at prova.c:72
    72                      sprintf(a1[i], "%s", "editore");
    (gdb) whatis a1
    type = char **
    (gdb) print a1[i]
    Cannot access memory at address 0x0
    (gdb) quit
    A debugging session is active.
    
            Inferior 1 [process 30997] will be killed.
    
    Quit anyway? (y or n) y
    max@studio:~/forum> 
    max@studio:~/forum> man sprintf
    
  • Re: Segmentation fault ;

    Alla sprintf passi un puntatore che senza allocazione, non c'è proprio ...
    
    max@studio:~/forum> grep a1 prova.c
    char **a1, **a2;
                    printf("\n%s-%s\n", a1[i], a2[j]);
                    sprintf(a1[i], "%s", "autore");
                    sprintf(a1[i], "%s", "titolo");
                    sprintf(a1[i], "%s", "editore");
                    sprintf(a1[i], "%s", "luogo_pubblicazione");
                    sprintf(a1[i], "%s", "anno");
                    sprintf(a1[i], "%s", "prestito");
                    sprintf(a1[i], "%s", "collocazione");
                    sprintf(a1[i], "%s", "descrizione_fisica");
                    sprintf(a1[i], "%s", "nota");
    max@studio:~/forum> 
    
    
    (anche alla printf)
  • Re: Segmentation fault ;

    Grazie ancora.....credo che l'array come var globale non è una buona idea.....
  • Re: Segmentation fault ;

    Sarebbe meglio non usare variabili globali, ma il problema non è li.
    Ti ho risposto sopra
Devi accedere o registrarti per scrivere nel forum
11 risposte