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 :

Détecter les sorties de mémoire


Sujet :

C

  1. #1
    Membre du Club
    Developpeur C
    Inscrit en
    Octobre 2009
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Developpeur C

    Informations forums :
    Inscription : Octobre 2009
    Messages : 48
    Points : 45
    Points
    45
    Par défaut Détecter les sorties de mémoire
    Bonjour à tous !

    Je voudrais savoir si il était possible de détecter une sortie de mémoire afin d'afficher une erreur avant d'en arriver à l'erreur de segmentation ? (par exemple avant d'ajouter un caractère dans un tableau de char, je vérifi si cette case mémoire est accessible).

    Bonne soirée !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Ce que tu appelles « sortie de mémoire » est en fait un débordement.

    Il n'y a pas de façon directe de le faire parce que cela impliquerait la mise en place d'infrastructures sous-jacentes : tes accès aux tableaux seraient en fait des appels déguisés à des fonctions, coûteux en temps et en espace mémoire, et cela impliquerait également que les tableaux eux-mêmes soient en fait des objets « managés » avec des méta-données invisibles à l'utilisateur.

    Ça se fait beaucoup en C++ parce que le langage est orienté à la base de cette façon : on utilise une couche objet qui permet notamment l'utilisation implicite de constructeurs et destructeurs mais le langage permet également la redéfinition de presque tous les opérateurs de façon à définir un objet entièrement managé, mais utilisant la syntaxe habituelle et étant donc transparent pour son utilisateur. Ça peut être un bien comme un mal. Le C, lui, travaille en dessous de cette couche, mais surtout, l'un de ses principaux intérêts est justement de travailler « tout en bas », en manipulant directement les données sans intermédiaire.

    Il y a néanmoins deux choses que tu peux faire :
    • Demander à ton compilateur d'observer un respect strict de la norme et activer tous ses flags d'avertissement. Par exemple, avec gcc, « gcc --stc=C99 --pedantic -Wall -Wextra » ;
    • Toujours avec gcc, ajouter « -Warray-bounds » (la man page précise que -Wall ne l'active qu'avec -O2 au minimum) ;
    • Utiliser valgrind à l'exécution, une fois ton programme compilé. La perspicacité de cet outil est toujours aussi bluffante même aujourd'hui.

  3. #3
    Membre du Club
    Developpeur C
    Inscrit en
    Octobre 2009
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Developpeur C

    Informations forums :
    Inscription : Octobre 2009
    Messages : 48
    Points : 45
    Points
    45
    Par défaut
    Merci pour ta réponse je vais aller voir tout ça de plus près

  4. #4
    Membre expérimenté Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Points : 1 372
    Points
    1 372
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    [*]Utiliser valgrind à l'exécution, une fois ton programme compilé. La perspicacité de cet outil est toujours aussi bluffante même aujourd'hui.[/LIST]
    Valgrind est effectivement un outil formidable ... sous linux !
    Parce que sous Windows, il n'existe hélas pas.
    En outil gratuit sous Windows - si tu en as besoin - il existe notamment mpatrol, un très bon outil pour détecter les sorties de piste, avec un rapport complet en fin d'exécution.
    L'outil est hautement paramétrable et facile à mettre en oeuvre, en liant la bibliothèque mpatrol et en définissant une variable globale qui permet d'affiner le comportement de l'outil et le niveau de détail du rapport.
    Mais bien sûr, si tu es sous linux : Valgrind sans hésitation !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détecter les fuites de mémoire sous Windows
    Par Nadawoo dans le forum Débuter
    Réponses: 1
    Dernier message: 25/11/2010, 00h26
  2. comment détecter les fuites mémoires
    Par cyrille37 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 26/04/2008, 15h12
  3. coment détecter les positions des cotés d'un rectangle?
    Par einegel dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 18/01/2005, 10h26
  4. comment détecter les faces d'un mur
    Par einegel dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/01/2005, 23h12
  5. Réponses: 8
    Dernier message: 17/10/2002, 12h52

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