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 :

Analyse du compilateur sur le nbre d'arguments de "printf"


Sujet :

C

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut Analyse du compilateur sur le nbre d'arguments de "printf"
    Salut !

    J'ai remarqué que le compilateur MinGW arrivait à émettre des warnings (à juste titre), après qu'il ait détecté des incohérences dans le code... même dans des contextes où il n'est pourtant pas supposé y parvenir. Je m'explique.
    Suite à une bidouille, j'ai remarqué que lors de l'utilisation de "printf", le compilateur arrivait à détecter les cas où un nombre non adéquat d'arguments étaient envoyés à la fonction. Or, le prototype de cette fonction indique pourtant qu'un seul argument minimum est obligatoire. En clair, le compilateur n'est pas supposé savoir combien d'arguments la fonction attend réellement.

    Or, dans cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <stdio.h>
    int main (void)
    {
    	printf("%d %d %d",1,2,3,4);
    	return 0;
    }
    le compilateur m'indique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main.c: In function 'main':
    main.c:4: warning: too many arguments for format
    Il y a bien sûr un argument de trop, là n'est pas le problème. Mais ce que je ne comprends pas, c'est que sachant que "printf" est une fonction pouvant prendre un nombre d'arguments variable et que ce nombre d'arguments qu'elle attend est (je suppose ?) géré par elle-même, qu'elle calcule en analysant et comptant le nombre de "code" de formatage (%d, %f, etc...) dans la chaîne de caractère du premier argument, comment le compilateur peut-il arriver à savoir si cette fonction reçoit bien le nombre d'arguments qu'elle attend, vu qu'il n'est pas censé connaître la fonction, ni la manière dont elle fonctionne ni de savoir comment elle gère ses arguments ? Car logiquement, il n'est pas censé le savoir. En effet, si dans la chaîne de caractères (son premier argument) la fonction voit "%d %d %d", après qu'elle l'ait analysée, elle voit qu'il y a 3 "codes" de formatage et elle attend alors un total de 4 arguments (le premier obligatoire + 3 autres). Mais le compilateur, comment fait-il pour le savoir ?

    Par conséquent, pour la fonction "printf" (et peut-être d'autres ?), y a t-il une astuce particulière qui permet au compilateur de compter le nombre d'arguments que la fonction attend réellement ?

    Merci pour vos lumière !

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    gcc connait printf et la signification du premier argument. Si tu le calcules, tu vas lui faire perdre trace de ça... Tu peux même lui indiquer de faire cette vérification pour des fonctions à toi qui ont le même comportement.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <stdio.h>
    int main (void)
    {
    	printf("%d %d %d",1,2,3,4);
    	return 0;
    }
    le compilateur m'indique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main.c: In function 'main':
    main.c:4: warning: too many arguments for format
    Il y a bien sûr un argument de trop, là n'est pas le problème. Mais ce que je ne comprends pas, c'est que sachant que "printf" est une fonction pouvant prendre un nombre d'arguments variable et que ce nombre d'arguments qu'elle attend est (je suppose ?) géré par elle-même, qu'elle calcule en analysant et comptant le nombre de "code" de formatage (%d, %f, etc...) dans la chaîne de caractère du premier argument, comment le compilateur peut-il arriver à savoir si cette fonction reçoit bien le nombre d'arguments qu'elle attend, vu qu'il n'est pas censé connaître la fonction, ni la manière dont elle fonctionne ni de savoir comment elle gère ses arguments ? Car logiquement, il n'est pas censé le savoir. En effet, si dans la chaîne de caractères (son premier argument) la fonction voit "%d %d %d", après qu'elle l'ait analysée, elle voit qu'il y a 3 "codes" de formatage et elle attend alors un total de 4 arguments (le premier obligatoire + 3 autres). Mais le compilateur, comment fait-il pour le savoir ?

    Par conséquent, pour la fonction "printf" (et peut-être d'autres ?), y a t-il une astuce particulière qui permet au compilateur de compter le nombre d'arguments que la fonction attend réellement ?
    C'est un peu évident, non ? Le compilateur analyse le nombre de champs "%*" dans le premier paramètre, non ? Il n'y rien magique là dedans.

    Par contre, évidemment, ça ne fonctionne que si la chaine est statique. Si c'est une variable, le compilateur ne peut évidemment rien vérifier du tout...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. [MySQL] Faire un tri sur un des deux arguments d'un SET
    Par mathieugamin dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/11/2006, 16h52
  2. Besoin d'explication sur le passage d'arguments
    Par ChrOnOs83 dans le forum Flash
    Réponses: 3
    Dernier message: 16/11/2006, 11h23
  3. probleme sur le passage d'argument par adresse
    Par ghostdog dans le forum C
    Réponses: 4
    Dernier message: 23/11/2005, 15h50
  4. analyse "périodes" basées sur des dates.
    Par Yorglaa dans le forum Oracle
    Réponses: 7
    Dernier message: 22/12/2004, 11h39
  5. Existe-t-il des Dé-compilateurs sur Terre?
    Par Julien_riquelme dans le forum Autres éditeurs
    Réponses: 11
    Dernier message: 15/12/2003, 01h46

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