Bonjour,
Ca faisait un moment que je n'avais pas fait de C et je m'aperçoit que c'est fou ce qu'on peut oublier sans pratique .

Bon voila j'ai une triste erreur sur mes malloc lors de leur utilsation

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
sock_err = send(s, (char*)buff, (strlen(buff)+1)*sizeof(char), MSG_NOSIGNAL);
			// s le socket sur laquel on écrit
			// buff le message écrit
			// (strlen(buff)+1)*sizeof(char) la longueur du message
			// MSG_NOSIGNAL permet de choisir la faïçon dont le système réagira si la conexion est brisée
			// lors du send. Dans ce cas, par defaut, le send génére un signal, il faudrait donc prévoir le cas
			// et le traiter avec un sigaction. Or je n'ai pas envie de le faire.
			// Avec l'option MSG_NOSIGNAL, la fonction send s'arréterra sur une erreur ce qui est plus
			// simple à traiter.
			if (sock_err < 0) {
				perror("erreur dans le send");
				break;
			}
 
			size_t nbo,final = 0;
			int taille_fichier=0;
			int i =0;
			char taille_fichier_c[10]={0};
			int recu_taille = 0;
			char* resultat = malloc(1*sizeof(char));// resultat à afficher.
 
			//---------------ecoute en attente de la taille de la chaine de caractéres
 
			do{	
 
 
				nbo = recv(s, buff, TAILLE_BUFF, 0);
				final+=nbo;
 
 
				//on va créer une chaine de caractère contenat le resulat final
 
				if(recu_taille == 0){
 
				    //récupération et convertion de la taille
				    do{
				      taille_fichier_c[i]=buff[i];
				      i++;
				    }while(buff[i]!=':');
				    taille_fichier = atoi(taille_fichier_c);
 
				   //allocation de la chaine				    
				    resultat = realloc(resultat, (taille_fichier+1)*sizeof(char));
				    //resultat=realloc(resultat,taille_fichier+1);
				    printf("taille alloué : %d\n",taille_fichier+1);
				    recu_taille=1;
				    //on copie le buffer dans la chaine en prenant soin d'enlever la chaine qui donne la taille 
				    strcpy(resultat,buff+10);
				  //on enlève les déchets en fin de ligne.
				  resultat[taille_fichier-(strlen(taille_fichier_c)+2)]='\0';
				   printf("taille utilisé : %d\n",taille_fichier-(strlen(taille_fichier_c)+2));
 
 
				}
				else{
 
				   //on copie le buffer dans la chaine
				   resultat=strcat(resultat,buff); 
				}	
 
 
			//Pour vider notre buff pour evité les erreurs de traitement.
			memset (buff, 0, sizeof (buff));
 
			}while(final!=(taille_fichier+10));
			//printf("%s\n",resultat);	
 
			free(resultat);
			resultat = NULL;
 
 
		}//fin if liste

Après un petit coup de valgrind j'ai ce genre d'erreur : au premier passage

==6093== Invalid write of size 1
==6093== at 0x40282EB: strcat (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==6093== by 0x8048CFC: main (client.c:181)
==6093== Address 0x41ac420 is 0 bytes after a block of size 3,112 alloc'd
==6093== at 0x4027EFC: realloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==6093== by 0x8048C69: main (client.c:166)
==6093==
==6093== Invalid write of size 1
==6093== at 0x40282FE: strcat (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==6093== by 0x8048CFC: main (client.c:181)
==6093== Address 0x41ac486 is not stack'd, malloc'd or (recently) free'd
==6093==
==6093== Invalid read of size 1
==6093== at 0x40282D3: strcat (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==6093== by 0x8048CFC: main (client.c:181)
==6093== Address 0x41ac420 is 0 bytes after a block of size 3,112 alloc'd
==6093== at 0x4027EFC: realloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==6093== by 0x8048C69: main (client.c:166)


C'est dans le second que je tape un segfault que je ne comprend pas :


==6093== Invalid write of size 1
==6093== at 0x40282EB: strcat (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==6093== by 0x8048CFC: main (client.c:181)
==6093== Address 0x41ac420 is 0 bytes after a block of size 3,112 alloc'd
==6093== at 0x4027EFC: realloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==6093== by 0x8048C69: main (client.c:166)
==6093==
==6093== Invalid write of size 1
==6093== at 0x40282FE: strcat (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==6093== by 0x8048CFC: main (client.c:181)
==6093== Address 0x41ac486 is not stack'd, malloc'd or (recently) free'd
==6093==
==6093== Invalid read of size 1
==6093== at 0x40282D3: strcat (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==6093== by 0x8048CFC: main (client.c:181)
==6093== Address 0x41ac420 is 0 bytes after a block of size 3,112 alloc'd
==6093== at 0x4027EFC: realloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==6093== by 0x8048C69: main (client.c:166)
prompt : liste

--6093-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting
--6093-- si_code=1; Faulting address: 0x6C24F764; sp: 0x6236BE98

valgrind: the 'impossible' happened:
Killed by fatal signal
==6093== at 0x38023956: (within /usr/lib/valgrind/x86-linux/memcheck)
==6093== by 0x38002BE0: (within /usr/lib/valgrind/x86-linux/memcheck)
==6093== by 0x3800308D: (within /usr/lib/valgrind/x86-linux/memcheck)
==6093== by 0x38039441: (within /usr/lib/valgrind/x86-linux/memcheck)
==6093== by 0x3804D8E8: (within /usr/lib/valgrind/x86-linux/memcheck)

sched status:
running_tid=1

Thread 1: status = VgTs_Runnable
==6093== at 0x4027DDE: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==6093== by 0x8048BE6: main (client.c:143)


Voila voila , vous l'aurez compris je suis paumé

Ca serait vraiment gentil de me donnée un coup de mani ^^

merci d'avance