Erreurs d'allocation (plus segfault).
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:
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
Citation:
==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 :
Citation:
==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 :mouarf: , vous l'aurez compris je suis paumé :cry:
Ca serait vraiment gentil de me donnée un coup de mani ^^
merci d'avance :mouarf: