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 :

Mémoire accessible en écriture


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Par défaut Mémoire accessible en écriture
    Bonjour,

    J'ai écrit une fonction revstr(char str[]) qui inverse une chaine de texte. Exemple : "salut" devient "tulas".

    Si je l’appelle comme ça, tout va bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char chr[] = "salut"
    //char *chr = "salut"
        if( ! revstr(chr) )
            printf("revstr(chr) = %s%c",chr,'\n');
    Par contre avec le pointeur j’obtiens : Segmentation fault.

    Est ce qu'il y a moyen dans le code de savoir si la chaine de caractères est accessible en écriture ?

    Merci.
    ctac_

  2. #2
    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
    Bonjour,

    Il s'agit d'un défaut 'historique' du langage C.
    Quand on écrit : char chr[] = "salut";, on crée une table de 6 octets et on copie la chaine "salut\0" dedans, elle est donc read/write.
    Quand on écrit : char *chr = "salut";, le compilateur tolère (mais devrait générer un Warning en C et une erreur en C++) car en réalité on a un pointeur qui pointe sur une zone constante contenant "salut\0".
    Il faut toujours écrire const char *chr = "salut"; car un littéral texte est désormais constant (en particulier dans un système embarqué!)

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Avec gcc, il faut rajouter l'option -Wwrite-strings pour être prévenu de ce genre de chose. Voir : https://gradot.wordpress.com/2013/05...trings-de-gcc/

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Par défaut
    Bonjour,

    Merci pour ces explications qui m'ont permis de chercher et trouver comment ajouter un flag de compilation sur codeblock.
    Par contre une fonction genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int iswriteableptr(void *ptr)
    qui retournerait vrai ou faux n'existe pas ?
    Cordialement,

    ctac_

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Non.
    0 n'est jamais inscriptible, mais pour les autres adresses, ca dépend du compilateur, de l'OS, et surtout de la longueur du programme lui-même.

    Par contre, au niveau du type, il est impossible d'écrire dans un const*.

    Mon conseil? Si tu définis un pointeur comme argument, choisis toujours un const*, sauf quand c'est nécessaire.

  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
    Citation Envoyé par ctac_ Voir le message
    Par contre une fonction genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int iswriteableptr(void *ptr)
    qui retournerait vrai ou faux n'existe pas ?
    Réponse courte: Oui et non. Plutôt non que oui, en fait.

    Réponse longue: Il y a une fonction pour ça sous Windows, mais elle ne doit pas être utilisée car elle est en fait source de bugs subtils et quasi-impossibles à déboguer.

    La seule bonne réponse, c'est de respecter la const-correctness et (si tu utilises un compilateur qui le supporte, comme gcc) utiliser -Wwrite-strings.
    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. Réponses: 0
    Dernier message: 20/05/2010, 12h29
  2. [Spip] installation : répertoires pas accessibles en écriture
    Par nossibe dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 18/09/2008, 17h59
  3. Utilisation mémoire Access 2007
    Par PhRey dans le forum Access
    Réponses: 2
    Dernier message: 13/03/2008, 22h09
  4. Problème mémoire ACCESS 2003
    Par mventre dans le forum Access
    Réponses: 5
    Dernier message: 21/08/2006, 14h59
  5. Prob Mémoire Access 2000 sous XP
    Par almo dans le forum Access
    Réponses: 1
    Dernier message: 07/03/2006, 09h39

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