IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

'snprintf' non défini(e) ;


Sujet :

C

  1. #1
    Membre éprouvé Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Par défaut 'snprintf' non défini(e) ;
    Alors voila j'ai un code qui fonctionne parfaitement avec code::blocks+MingW mais j'ai voulu le compiler avec visual studio 2005 et j'ai une erreur qui m'embête un peu.
    En effet visual studio ne reconnait pas snprintf() [j'ai bien inclu stdio.h ]. Je me dis bon ba tant pis je vais testé sprintf(), eh mais dans ce cas j'ai un warning qui apparait:
    warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
    Je pense que je dois donc utilisé la fonction sprintf_s dont je n'avais jamais entendue parler avant, est ce que quelqu'un sait si cette fonction est portable et sera reconnu par gcc (MingW) ?

    PS: extrait de man snprintf
    Les fonctions
    snprintf, et vsnprintf sont conformes à ISO/IEC 9899:1999.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    En effet, M$ a refusé C99, préférant leur "secure CRT" 100% non-portable.

    Tu trouvera ici des wrappers des fonctions M$ qui reproduisent la spec de snprintf() :
    http://www.developpez.net/forums/sho...8&postcount=14

    Selon la version de Visual que tu utilises (ici, 2005) tu peux commenter les lignes avec _snprintf() et décommenter celle avec _snprintf_s().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Médinoc
    En effet, M$ a refusé C99, préférant leur "secure CRT" 100% non-portable.
    C'est un poil plus complique que ca, ce n'est pas une invention Microsoft : http://www.open-std.org/jtc1/sc22/wg...docs/n1199.pdf

  4. #4
    Membre éprouvé Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Par défaut
    Pourquoi tu rajoutes des underscores '_' devant les fonctions ?

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Parce que le _snprintf() microsoft en possède un...
    Heureusement d'ailleurs, car il ne correspond pas à la spec: Il n'en a ni les garanties ni la valeur de retour.
    Quant à _scprintf(), c'est une fonction Microsoft qui possède un underscrore, c'est dans la doc.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    gl : Ils ne collent quand même pas à ce standard pour autant, ils n'utilisent même pas les noms standard pour les macros (__STDC_WANT_SECURE_LIB__ au lieu de __STDC_WANT_LIB_EXT1__) et les fonctions (_set_invalid_parameter_handler() au lieu de _set_constraint_handler_s())...

    Edit: D'ailleurs, leur vsnprintf_s() et consorts ne correspond pas non plus (carrément pas le même nombre d'argument). Sans compter strtok_s(), qui est une implémentation très tardive de strtok_r() chez MS, et qui a un paramètre ne plus dans le standard...
    Donc, ils restent non-portables...

    Edit2: Tiens, c'est sans doute un changement compris dans le SP1, à présent ils conseillent _CRT_SECURE_NO_WARNINGS au lieu de _CRT_SECURE_NO_DEPRECATE, et le __declspec(deprecated(_Text)) n'indique plus "deprecated" dans le warning...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Médinoc
    gl : Ils ne collent quand même pas à ce standard pour autant, ils n'utilisent même pas les noms standard pour les macros (__STDC_WANT_SECURE_LIB__ au lieu de __STDC_WANT_LIB_EXT1__) et les fonctions (_set_invalid_parameter_handler() au lieu de _set_constraint_handler_s())...
    Vu les dates de publication du document et de Visual Studio, je suis bien en peine de dire si Microsoft a pris des libertes (voire reinventer) ce "standard" ou si le document a evolue entre temps.
    Il n'en reste pas moins que ces fonctions n'est pas une pure invention de Microsoft.

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonjour,
    Je pense que je dois donc utilisé la fonction sprintf_s dont je n'avais jamais entendue parler avant, est ce que quelqu'un sait si cette fonction est portable et sera reconnu par gcc (MingW) ?
    Non elle ne sera pas portable ( avec MingW de Windows ) .

    Par contre il existe de nouvelles possibilités avec la dernière norme du C.

    Salut.

  9. #9
    Membre éprouvé Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Par défaut
    Qu'est ce je dois faire alors entre snprintf qui fonctionne pas avec visual studio et sprintf_s qui ne fonctionne pas avec MingW ?!
    Je ne connais pas d'autres fonctions qui réalise la même chose ou alors j'ai pas assez cherché?

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    utilises sprintf....

    Il suffit de connaître la taille de ta chaîne, c'est la seule différence...

    http://www.gnu.org/software/libc/man...Functions.html

    ....

  11. #11
    Membre éprouvé Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Par défaut
    Warning: The sprintf function can be dangerous because it can potentially output more characters than can fit in the allocation size of the string s. Remember that the field width given in a conversion specification is only a minimum value.
    J'aurais toujours un warning lors de la compilation et il y a un risque de buffer overflow.

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par psyphi
    J'aurais toujours un warning lors de la compilation et il y a un risque de buffer overflow.
    Ce warning peut être désactivé

    Il y a risque de débordement si on ne sait pas se qu'on fait. Si on code correctement, il n'y a aucun risque. C'est pas comme avec gets() où il n'y a pas moyen d'écrire du code sûr et portable.

  13. #13
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par psyphi
    Qu'est ce je dois faire alors entre snprintf qui fonctionne pas avec visual studio et sprintf_s qui ne fonctionne pas avec MingW ?!
    Tu peux utiliser la compilation conditionnelle (#ifdef/#endif) pour appeler snprintf ou sprintf_s selon le compilateur utilise.
    De memoire Visual defini _MSC_VER et MingW defini __MINGW32_VERSION.
    Pour savoir si le compilateur utilise supporte C99 et donc snprintf, tu peux utiliser la valeur de __STDC_VERSION__

    L'ideal etant bien entendu d'encapsuler les appels conditionnels a snprintf/sprintf_s dans une fonction a toi afin de ne pas parsemer le code d'option de compilation.

  14. #14
    Membre éprouvé Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Par défaut
    Si la chaine à copier est rentrée par l'utilisateur et qu'on ne sait pas à l'avance sa taille, il va bien falloir faire une vérification quelque part, non?

  15. #15
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    encore une fois lis les manuels

    et la fonction strlen() alors ??

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par psyphi
    Si la chaine à copier est rentrée par l'utilisateur et qu'on ne sait pas à l'avance sa taille, il va bien falloir faire une vérification quelque part, non?
    Déjà, il faut commencer par écrire une fonction de saisie correcte qui ne déborde pas ou qui s'adapte (malloc() / realloc()...)

  17. #17
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par psyphi
    Si la chaine à copier est rentrée par l'utilisateur et qu'on ne sait pas à l'avance sa taille, il va bien falloir faire une vérification quelque part, non?
    Si tu fais attention a ce que tu codes, il est possible de connaitre les differentes tailles rentrant en jeu.
    Il est alors possible soit de dimensionner correctement la chaine resultante (via l'allocation dynamique), soit de ne pas faire l'appel a sprintf si la taille de la chaine resultante est trop importante.

  18. #18
    Membre éprouvé Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Par défaut
    Citation Envoyé par souviron34
    encore une fois lis les manuels

    et la fonction strlen() alors ??
    Non mais bon quand même hein .

    Si tu fais attention a ce que tu codes, il est possible de connaitre les differentes tailles rentrant en jeu.
    Il est alors possible soit de dimensionner correctement la chaine resultante (via l'allocation dynamique), soit de ne pas faire l'appel a sprintf si la taille de la chaine resultante est trop importante.
    du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(strlen(chaine) > taille_max)
       fprintf(stderr, "Erreur ");
    else
        sprintf(...);
    Enfin bon là n'est pas le problème c'est dommage de ne pouvoir utilisé snprintf. Il faut de toute manière utilisé des directives pour supprimer les warnings ou pour s'adapter en fonction du compilateurs.

    Merci de vos commentaires et propositions.

  19. #19
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par psyphi
    Si la chaine à copier est rentrée par l'utilisateur et qu'on ne sait pas à l'avance sa taille, il va bien falloir faire une vérification quelque part, non?
    ya 1 truc que je comprend pas :

    1) soit tu lis caractère par caractère, et tu réalloues au fur et à mesure, à partir d'une taille initiale

    2) soit tu prévois TRES grand au départ, quiite à réallouer à la bonne taille à la fin..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          malloc ( 50000 )
     
          realloc (  , (strlen() + 1) )
    m'étonnerais que quelqu'un rentre 50000 caractères en ligne.....

  20. #20
    Membre éprouvé Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Par défaut
    m'étonnerais que quelqu'un rentre 50000 caractères en ligne.....
    Un utilisateur non mais un programme oui
    Se fait très vite avec perl d'installer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ gcc -o demo demo.c
    $ ./demo `perl -e 'print "A"x50000'`
    Le crackeur à plus qu'a attendre que ça plante et y injecter son shellcode.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/01/2006, 18h07
  2. Erreur d'analyse XML : entité non définie
    Par ToxiZz dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 16/01/2006, 13h22
  3. id non défini alors qu'il est utilisé
    Par flambo88 dans le forum Langage
    Réponses: 11
    Dernier message: 15/01/2006, 01h36
  4. fonction non définie
    Par ston dans le forum Access
    Réponses: 11
    Dernier message: 12/12/2005, 16h02
  5. [RAR] Fonction rar_open non définie
    Par laulau75 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 11/11/2005, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo