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 :

Bad ptr avec une fonction d'affichage


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut Bad ptr avec une fonction d'affichage
    Hello World


    J'ai codé une fonction qui affiche certaine info à l'ecran dont le proto est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void DisplayText(char * szStr, long xpos=100, long ypos=100 );

    j'ai envoyé un paramètre qui me provoque un bad ptr:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char* mtrrdump = (char* )malloc(4096);
    *mtrrdump = '\0';
    sprintf(&mtrrdump[strlen(mtrrdump)],"MTRR %i: 0x%08X - 0x%08X (%x = %s)\n",i,base,~mask|base,type,types[type]);
    char bufI[1000];
    sprintf(bufI,mtrrdump);
    DisplayText(bufI, xpos, ypos+=height);
    Dans DisplayText le moment ou le bad ptr est genere:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WCHAR szbuff[200] = {0};
    swprintf(szbuff, L"%S", szStr);
    En faisant du pas à pas avant sprintf tout est normal, lorsque je verifie szStr à la bonne valeur, mais après l'execution de cette ligne szbuff a bien la valeur de szStr mais szStr maintenant est un bad ptr, alors que normalement il doit conserver sa valeur.

    Auriez vous une idées SVP?

    Merci

  2. #2
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut
    Merci. Pour info je suis sur VSC 2003.


    J'ai change la taille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WCHAR szbuff[200] = {0};
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WCHAR szbuff[1000] = {0};
    Maintenant sa marche.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bizarre que swprintf(szbuff, L"%S", szStr); marche car il manque le second paramètre!

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Nono Sto Voir le message
    swprintf(szbuff, L"%S", szStr).
    En faisant du pas à pas avant sprintf tout est normal, lorsque je verifie szStr à la bonne valeur, mais après l'execution de cette ligne szbuff a bien la valeur de szStr mais szStr maintenant est un bad ptr, alors que normalement il doit conserver sa valeur.
    Bonjour

    Tu ne nous as pas montré les lignes où tu créais/remplissais szStr. D'après son nom (size string) ça me fait penser à un nombre (int/long/size_t) mais tu t'en sers comme d'une string (%S)...

    Citation Envoyé par Nono Sto Voir le message
    J'ai change la taille

    Maintenant ça marche.
    Exemple typique d'un comportement indéterminé...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    @Sve@r: Dans le monde Microsoft, sz est le préfixe pour "string, zero-terminated".
    Ce qui m'inquiète plus, ce sont les incohérences entre char et wchar_t.
    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 395
    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 395
    Par défaut
    Réflexion faite, ça a l'air d'être surtout un problème de taille.
    Ton Visual Studio étant obsolète, le mieux est de reprendre des fonctions plus sécurisées que sprintf(), notamment snprintf() dont voici une implémentation pour les compilateurs ne respectant pas le standard C99:
    https://www.developpez.net/forums/d1...oa/#post972738

    Ces fonctions limitent la taille maximale écrite pour être sûr de ne jamais écrire au-delà du buffer donné.$

    Edit: J'en ai même retrouvé une qui fait l'allocation dynamique en même temps:
    https://www.developpez.net/forums/d7...n/#post4563384
    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.

Discussions similaires

  1. Affichage d'une div avec une fonction Javascript
    Par maxime-mb dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/01/2012, 11h09
  2. Affichage avec une fonction javascript
    Par Invité dans le forum Général JavaScript
    Réponses: 26
    Dernier message: 15/10/2011, 12h07
  3. [AC-2003] Affichage d'un etat avec une fonction ayant date comme parametre
    Par yupyupxav dans le forum IHM
    Réponses: 0
    Dernier message: 06/06/2009, 00h43
  4. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 16h37
  5. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22

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