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 :

Que se passe t-il sans fonction exit?


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Que se passe t-il sans fonction exit?
    Bonjour a tous
    Je ne suis pas tout a fait nouveau sur ce forum juste que je ne retrouve plus mon user...
    Bon venons en au point :
    J'ai un devoir a rendre Lundi portant sur la compilation de programmes sous Linux avec gcc 3.2 ( la version de GCC n'a que peu d'importance pour cette question ).
    Etant arrive a la derniere question j'aimerais avoir votre aide :
    J'ai un tout petit programme ( seulement une fonction main ) se terminant par un appel a la fonction exit( int ) definie dans stdlib.h ( vous le saviez deja hein?:p ).
    La question est que se passerait-il si on enlevait l'instruction exit a la fin du code source?

    J'ai essaye et le programme a certes ete execute mais a la fin j'ai recu un "segmentation fault".
    Mon intuition me dit que c'est parce que le processus n'a pas ete termine et que dans ce processus le "program counter" est incremente indefiniment : ainsi il peut tenter d'executer des instructions qui ne sont pas dans les limites des adresses memoires dont le processus est autorise a acceder, ou tout simplement le PC tente d'acceder a des emplacements memoires ( instructions stockees la ou pas ) qui ne lui sont pas autorisees.
    C'est la raison pour laquelle l'OS termine brutalement le processus je suppose?

    Qu'en dites-vous?
    Merci pour votre aide

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    La question est bizarre, et le fait que ton programme plante est encore plus bizarre.
    Tu veux comparer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <stdlib.h>
     
    int main(void)
    {
        return EXIT_SUCCESS;
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <stdlib.h>
     
    int main(void)
    {
       exit(EXIT_SUCCESS);
    }
    ?

    Puisque nous sommes dans la fonction main(), et si l'on suppose qu'il n'y a pas d'appel recursifs a main() et qu'aucune fonction n'a ete enregistree par atexit(), il n'y a aucune difference.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ce que j'essaie de dire c'est qu'il n'y a pas de fonction exit ou return a la fin.
    Juste l'accolade de fin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    extern void write(int, char [], int );
    extern void exit(int);
    extern int strlen(const char *);
     
    char message [] = "Hello World!\n";
    #define MESSAGELENGTH 13
    int main(void){
      write(1,message,MESSAGELENGTH);
     
    }
    ~
    write et exit sont definies dans un fichier assembleur, avec une extension .s.
    Mais ne vous preoccupez pas de ca...

  4. #4
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Ben si on se preoccupe, vu que visiblement tu n'utilises pas les fonctions standard (i.e. exit est redefinie d'une facon qui m'est inconnue).

    En general, le systeme attend que main() renvoie un int. Si elle ne le fait pas (absence de return ou exit(), quoique je pense que C99 a pris l'habitude du C++ de supposer un return 0 en absence de retour explicite), alors le retour de main() peut provoquer une erreur de segmentation. J'ai vu cela sur des systemes assez anciens, mais jamais sur des systemes modernes, qui sont un peu plus souples sur les valeurs de retour...

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    erreur de segmentation, c'est a dire ce que j'ai explique plus haut dans mon premier post c'est ca?

    Au fait voici le code source du fichier assembleur :
    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
     
      .text
    # an implementation of write and exit
            .globl write
    write:
            pushl  %ebx               # save register ebx
            movl   0x10(%esp,1),%edx  # load the arguments
            movl   0xc(%esp,1),%ecx   # from the stack
            movl   0x8(%esp,1),%ebx
            movl   $0x4,%eax          # write system call
            int    $0x80
            popl   %ebx               # restore ebx
            ret
                  .globl exit
     exit:
            movl   0x4(%esp,1),%ebx  # the argument
            movl   $0x1,%eax         # exit system call
            int    $0x80
            .globl _start
    # the program is started by a call to _start
    _start:
    # call the C code
            call    main

  6. #6
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Hélas, l'assembleur est pour moi de l'hébreu (je me demande même s'il n'est pas plus facile d'apprendre l'hébreu). Peut être que quelqu'un d'autre sera plus à même de te répondre.
    Ceci dit, mon avis est que ta segmentation fault est bien due à un retour incorrect de main() en absence de return ou exit().

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Re: Que se passe t-il sans fonction exit?
    Bonjour,
    je répond à ce que j'ai compri, c'est à dire ça :
    Citation Envoyé par Poseidon13
    La question est que se passerait-il si on enlevait l'instruction exit a la fin du code source?
    Il y a plusieurs façon de terminer un programme :
    • en utilisant return, méthode propre (avec ou sans valeur, tout dépend du type de retour de la fonction)
    • exit, permet de sortir d'un programme de façon brutale (à éviter), bien sûr la valeur de retour est obligatoire
    • Sans rien, dans ce cas, il s'agit d'un return implicite sans valeur de retour, s'il s'agit de la sortie de la fonction main, le comportement est indéfinie puisque main doit retourner un int

  8. #8
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par DaZumba
    quoique je pense que C99 a pris l'habitude du C++ de supposer un return 0 en absence de retour explicite
    Pas si sûr :
    Citation Envoyé par [url=http://gcc.gnu.org/c99status.html
    Status of C99 features in GCC[/url]]return without expression not permitted in function that returns a value (and vice versa)

Discussions similaires

  1. Que retourne un GROUP BY sans fonction d'agrégation?
    Par Maniz dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/06/2012, 11h05
  2. que se passe t il quand ...
    Par -<R1>- dans le forum Débuter
    Réponses: 2
    Dernier message: 28/06/2004, 14h00
  3. Que se passe-t-il en interne si un ROLLBACK plante ?
    Par jack554 dans le forum Administration
    Réponses: 4
    Dernier message: 07/04/2004, 12h55
  4. [VB6] [Install] Que se passe-t-il lors du setup?
    Par petit scarabée dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 28/10/2002, 08h26

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