Bug inet_ntoa () en linux 64
Résolu/Fermé
A voir également:
- Bug inet_ntoa () en linux 64
- Winrar 64 - Télécharger - Compression & Décompression
- Cle windows 10 professional 64 bit gratuit - Guide
- Télécharger linux mint 64 bits français iso - Télécharger - Systèmes d'exploitation
- Linux reader - Télécharger - Stockage
- 32 ou 64 bits - Guide
9 réponses
Bonjour,
printf("taille de l'adresse retour : %d octets \n",sizeof(inet_ntoa (...));
il m'écrit
taille de l'adresse retour : 4 octets
Ca ressemble plutôt à l'oubli d'inclusion de l'un ou l'autre des headers déclarant inet_ntoa(), cette fonction se retrouvant interprétée comme renvoyant un entier (4 octets).
Selon le man, il faut :
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
Manu
printf("taille de l'adresse retour : %d octets \n",sizeof(inet_ntoa (...));
il m'écrit
taille de l'adresse retour : 4 octets
Ca ressemble plutôt à l'oubli d'inclusion de l'un ou l'autre des headers déclarant inet_ntoa(), cette fonction se retrouvant interprétée comme renvoyant un entier (4 octets).
Selon le man, il faut :
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
Manu
Bonjour,
comment ce fait il que ce même source fonctionnait en version 32 bits sans l'inclusion arpa/inet?
Je rappelle (3ème fois) qu'une fonction non déclarée est considérée comme renvoyant un int (un entier à quatre octets dans votre cas). Comme en 32 bits, les pointeurs ont la même taille qu'un entier, ça ne se voit pas.
Mettez l'option -Wall (si gcc) pour avoir des avertissements à la compilation.
Manu
comment ce fait il que ce même source fonctionnait en version 32 bits sans l'inclusion arpa/inet?
Je rappelle (3ème fois) qu'une fonction non déclarée est considérée comme renvoyant un int (un entier à quatre octets dans votre cas). Comme en 32 bits, les pointeurs ont la même taille qu'un entier, ça ne se voit pas.
Mettez l'option -Wall (si gcc) pour avoir des avertissements à la compilation.
Manu
Bonjour,
Désolé d'insister, mais dans votre exemple,
printf("taille de l'adresse retour : %d octets \n",sizeof(inet_ntoa (...));
faites un include de <arpa/inet.h> c'est là qu'est déclaré le inet_ntoa(), et à mon avis ça ira mieux.
Manu
Désolé d'insister, mais dans votre exemple,
printf("taille de l'adresse retour : %d octets \n",sizeof(inet_ntoa (...));
faites un include de <arpa/inet.h> c'est là qu'est déclaré le inet_ntoa(), et à mon avis ça ira mieux.
Manu
Rebonjour,
si c'etait un oublie d'unclusion le probleme serait à la compilation.
Non, désolé, les déclarations externes ne sont pas obligatoires en C (pour cause de compatibilité avec l'ancêtre K&R). Par défaut les fonctions renvoient un int.
Pour que les compilateurs signalent le danger, il faut mettre une option de warning appropriée.
Manu.
si c'etait un oublie d'unclusion le probleme serait à la compilation.
Non, désolé, les déclarations externes ne sont pas obligatoires en C (pour cause de compatibilité avec l'ancêtre K&R). Par défaut les fonctions renvoient un int.
Pour que les compilateurs signalent le danger, il faut mettre une option de warning appropriée.
Manu.
reboujour,
En effet en incluant arpa/inet je n'ai plus le bug, mais alors comment ce fait il que je n'ai pas eu d'ereur lors de la compilation? y a t'il plusieurs definitions de cette fonction? (sinon j'aurais dû avoir des probleme d'entête à la compilation ou carement à l"édition des liens)
et comment ce fait il que ce même source fonctionnait en version 32 bits sans l'inclusion arpa/inet?
je suis un peu perplexe, des choses m'échappent.
En effet en incluant arpa/inet je n'ai plus le bug, mais alors comment ce fait il que je n'ai pas eu d'ereur lors de la compilation? y a t'il plusieurs definitions de cette fonction? (sinon j'aurais dû avoir des probleme d'entête à la compilation ou carement à l"édition des liens)
et comment ce fait il que ce même source fonctionnait en version 32 bits sans l'inclusion arpa/inet?
je suis un peu perplexe, des choses m'échappent.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
merci pour la réponse
cedont je suis sûr c'est que si je fais
printf("taille de l'adresse retour : %d octets \n",sizeof(inet_ntoa (...));
il m'écrit
taille de l'adresse retour : 4 octets
donc forcement le code suivant
char * prfBuf;
ptrBuf= inet_ntoa (...);
ne peut focntionner car sur un 64bits sizeof(ptrBuf) retourne forcement 8 donc s'il y a affectation le pointeur va taper n'importe ou d'ou l'erreur de segmentation
cedont je suis sûr c'est que si je fais
printf("taille de l'adresse retour : %d octets \n",sizeof(inet_ntoa (...));
il m'écrit
taille de l'adresse retour : 4 octets
donc forcement le code suivant
char * prfBuf;
ptrBuf= inet_ntoa (...);
ne peut focntionner car sur un 64bits sizeof(ptrBuf) retourne forcement 8 donc s'il y a affectation le pointeur va taper n'importe ou d'ou l'erreur de segmentation
mamiemando
Messages postés
33664
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 mai 2025
7 850
23 oct. 2008 à 20:20
23 oct. 2008 à 20:20
Ce sera plutôt la version de libc et ou de noyau qui aura un impact (là où est implémentée inet_ntoa()) . Si tu es sûr de ton coup je t'invite à faire une remontée de bug auprès des développeurs concernés.
Bonne chance
Bonne chance
mamiemando
Messages postés
33664
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 mai 2025
7 850
24 oct. 2008 à 13:10
24 oct. 2008 à 13:10
C'est bizarre effectivement si on regarde ici http://www.linux-france.org/article/man-fr/man3/inet_addr-3.html cette fonction retourne effectivement un char * (soit la taille d'un pointeur) et je ne vois pas pourquoi tu rencontres un problème...
mamiemando
Messages postés
33664
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 mai 2025
7 850
24 oct. 2008 à 16:57
24 oct. 2008 à 16:57
Oui mais si le binaire dans lequel est implémenté la fonction (libc/noyau) est compilé en 64 bits également, ça devrait retourner une adresse 64 bits.
oui, ça devrait.. mais ça ne retourne qu'une adresse 32 bits (ou plutot une partie de l'adresse 64 bits) . Il est possible que dans le source de la fonction l'adresse se retrouve a être sotckée dans un buffer de 4 octets (normal pour un 32bits) et n'ai pas ete mis à jour en version 64bits, puis que ce soit le contenu de ce buffer qui soit retournée sous le type char* ; je sais c'est un peut tiré par les cheveux mais les bug (si s'en est un) sont souvent issues de choses surprenantes.
je ne sais pas comment faire pour faire remonter ça .
je ne sais pas comment faire pour faire remonter ça .
mamiemando
Messages postés
33664
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 mai 2025
7 850
25 oct. 2008 à 00:14
25 oct. 2008 à 00:14
Ceci dit tu peux tester ce qu'il te dit, ça ne mange pas de pain. Car un #include fait parfois d'autres choses que définir des variables et fonctions. Étant donné que dans le man signale qu'il faut inclure ces headers et de faire une éventuelle remontée de bug il me paraît souhaitable de se mettre dans les conditions d'utilisation spécifiées par le man.
Bonne chance
Bonne chance
24 oct. 2008 à 16:02
mais le probleme est a l'execussion
ca devrait retourner 8 car je suis sous Linux 64 bits et non 4 comme ça le fait