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![]()
Partager