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 :

masquer le Segfault


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 16
    Par défaut masquer le Segfault
    Bonjour,

    J'ai apris recemment qu'il etait possible de masquer un Segfault, alors je fais des test pour pouvoir y arriver en codant un main bidon. bref je croyais que la meilleure facon de le masquer etait de le kill, aparament ce n'est pas le cas car avec le code ci-dessous j'ai tjr mon segfault bien en place. quelqu'un pourrait m'aider svp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <signal.h>
     
    void            send(pid_t pid)
    {
      if (kill(pid, SIGSEGV) != -1)
        kill(pid, SIGKILL);
    }
     
    int             main()
    {
      char          *s;
      int           i;
      int           a = i - 1;
      pid_t         pid = getpid();
     
      i = 2000000000;
      send(pid);
      s = malloc(sizeof(i));
       s[a] = '\0';
      signal(SIGSEGV, send);
      return (0);
    }
    merci d'avance

  2. #2
    Membre émérite

    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Septembre 2010
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Septembre 2010
    Messages : 450
    Par défaut
    Masquer un segfault est une connerie, pour rester poli.

    Il faut trouver l'origine du segfault et corriger le bug.

    Un bug que l'on masque reste un bug, tu t'en mordras les doigts si tu développe avec ce genre de méthode...

    D'autant plus qu'un segfault, ce n'est pas anodin.
    Si vous moinsez, merci de répondre pour argumenter!
    Ma présentation

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Bonjour,

    Citation Envoyé par xna-alain Voir le message
    J'ai apris recemment qu'il etait possible de masquer un Segfault,
    Es-tu sûr de savoir réellement ce qu'est une erreur de segmentation ? Parce qu'il y a pas mal d'erreurs de conception dans ton programme C.

    alors je fais des test pour pouvoir y arriver en codant un main bidon. bref je croyais que la meilleure facon de le masquer etait de le kill,
    Je ne comprends pas cette phrase. Tu peux développer un peu ta pensée ?

    aparament ce n'est pas le cas car avec le code ci-dessous j'ai tjr mon segfault bien en place. quelqu'un pourrait m'aider svp ?
    Essayons. Une segfault se produit lorsque ton processus essaie d'écrire en dehors de la zone mémoire qui lui a été allouée. C'est un procédé électronique. Le système informe le processeur de la plage qu'il peut explorer sans risque avant de passer la main à ton programme. Si celui-ci est mal écrit, c'est le micro-processeur lui-même qui va refuser d'interpréter l'instruction fautive et va, à la place, déclencher une exception qui sera prise en charge par le système. Et c'est celui-ci qui va provoquer la fin de ton programme.

    Si le micro-processeur n'était pas doté de ce « mode protégé », rien n'empêcherait ton programme d'aller écrire n'importe où en mémoire et tout effacer. C'est d'ailleurs comme ça qu'ont fonctionné tous les ordinateurs ou presque depuis leur invention jusqu'au milieu des années 1990, où l'adoption massive du mode protégé sur PC a de fait concerné la majeure partie de la planète.

    Quoiqu'il en soit, c'est un défaut d'exécution et pas une simple notification. A priori, le programme ne peut pas continuer à fonctionner. La force d'UNIX, c'est d'avoir mappé cela sur un signal, ce qui permet de gérer ce signal et le prendre en charge comme les autres et, donc, de mettre en place un système permettant de rattraper l'erreur et limiter les dégâts. C'est utile dans le cas d'applications très larges utilisant beaucoup de bibliothèques tierces par forcément sûres, mais ça demande de savoir ce que l'on fait.

    Masquer un bug, c'est déjà sale en soi, mais masquer une segfault exprès, c'est vraiment courir au devant de gros ennuis si ce n'est pas pour l'exercice.

    kill(), maintenant, sert à envoyer un signal à un processus. En l'occurrence, ton application segfaulte toujours car l'erreur se produit avant que tu installes ton gestionnaire de signal.

    D'autre part :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i;
    int a = i - 1;

    Ceci ne peut pas fonctionner. Il ne s'agit pas de définitions formelles. Dans la seconde ligne, tu déclares une variable « a » et tu lui affectes la valeur « i - 1 ». Ça signifie qu'elle va recevoir la valeur de « i » diminuée de 1 telle qu'elle est au moment où la ligne est interprétée et elle ne changera pas ensuite. Cela ne fonctionne pas comme les cellules d'un tableur…

  4. #4
    Membre actif Avatar de Causa Sui
    Inscrit en
    Mai 2003
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 133
    Par défaut
    Si ton but est de simplement d'ignorer le tout (ce qui est une très mauvais idée pour toutes les raisons citées plus haut):
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <signals.h>
    signal(SIGSEGV,SIG_IGN);
    Si tu veux juste que ton programme meure, sans laisser de trace (ce qui est aussi une mauvaise idée, cela dit):
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <stdlib.h>
    #include <signals.h>
    signal(SIGSEGV,exit);
    …mais comme tout le monde, je ne vois pas vraiment l'intérêt de la chose…

Discussions similaires

  1. Comment masquer le MessageBox de la barre des tâches ?
    Par Coussati dans le forum Langage
    Réponses: 7
    Dernier message: 25/08/2003, 14h33
  2. [VB6] masquer la barre de titre d'une form
    Par tiboleo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 09/12/2002, 17h54
  3. Afficher/Masquer un bouton comme IE 6
    Par benj63 dans le forum C++Builder
    Réponses: 3
    Dernier message: 29/07/2002, 13h12
  4. Masquer le curseur en mode MS-DOS
    Par Alex120 dans le forum C
    Réponses: 2
    Dernier message: 10/07/2002, 09h30
  5. Comment masquer le curseur de la souris ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/06/2002, 18h54

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