[Script]Parser un fichier C et imprimer les fonctions externes

Parser un fichier C et imprimer les fonctions externes [Script] - C - Programmation

Marsh Posté le 06-09-2007 à 17:58:32    

Salut a tous,
 
Mon but est de parser le fichier blah.c automatiquement et de sortir toutes les fonctions externes qui sont utilisees par blah.c
Evidemment l'utilitaire utilise doit etre scriptable donc que personne ne me suggere de cliquer sur un bouton "generer la documentation" de tel IDE ;)
 
genre voila blah.c
 
int main(){
    youhou(blah());
 
}
 
et le resultat doit etre quelque chose comme:
youhou
blah
 
Merci,

Reply

Marsh Posté le 06-09-2007 à 17:58:32   

Reply

Marsh Posté le 07-09-2007 à 11:43:47    

à coup de awk ?

Reply

Marsh Posté le 07-09-2007 à 11:45:51    

Heu, ca me semble serieusement chaud avec awk!

Reply

Marsh Posté le 07-09-2007 à 16:30:59    

peut-être que tu peux compiler ton fichier source, et regarder les symboles dans le fichier objet généré. Ca t'évite de parser la syntaxe toi-même
 
exemple sous linux:

> cat toto.c
#include <stdio.h>
 
int foo (void);
 
int main ()
{
  fprintf (stdout, "Hello World\n" );
 
  return foo ();
}
> gcc -c toto.c
> nm toto.o
         U foo
         U fwrite
00000000 T main
         U stdout


 
Dans ce cas, on voit que le source utilise trois symboles externes (foo, fwrite, stdout). Reste à faire la différence entre les fonctions et les variables, et à remonter à fprintf à partir de fwrite (d'ailleurs, je vois pas trop comment le fwrite se retrouve ici :??:)


---------------
TriScale innov
Reply

Marsh Posté le 07-09-2007 à 16:37:46    

Ca semble effectivement une option sympathique. Je suppose que fwrite est une implementation de fprintf vu que printf est une fonction non standard par pas mal de cotes.
 
Merci au CEA de Saclay. Moi j'etais a l'inria de l'autre cote du plateau ;)

Reply

Marsh Posté le 07-09-2007 à 16:48:36    

fprintf est standard... A mon avis c'est juste le compilo qui optimise tout ça en appelant directement fwrite, vu que tu n'as pas de % dans ta chaine.

Reply

Marsh Posté le 07-09-2007 à 17:46:32    

bien sur fprintf est dans le "standard". Je voulais juste dire que c'est une fonction "bizarre" vu qu'elle a un nombre d'arguments variables.

Reply

Marsh Posté le 08-09-2007 à 11:55:26    

matafan a écrit :

fprintf est standard... A mon avis c'est juste le compilo qui optimise tout ça en appelant directement fwrite, vu que tu n'as pas de % dans ta chaine.

Ouais, ça ressemble effectivement bien à une optimisation de compilo, mais comment gcc peut-il faire des optimisations de ce genre alors qu'il n'a pas encore eu le définition de la fonction fprintf ? Lorsque tu fais ton 'gcc -c', a priori gcc ne connait que le header 'stdio.h', dans lequel on lui donne la signature de fprintf. Pour se rendre compte qu'en fait seul un fwrite est nécessaire, il faudrait en plus connaitre le code de la fonction fprintf. Je pense qu'il y a un truc qui m'échappe, mais je sais pas quoi :??:


---------------
TriScale innov
Reply

Marsh Posté le 10-09-2007 à 10:06:36    

Le truc c'est que quelque part dans gcc, il y a du code spécial qui se charge de transformer les printf/fprintf en write/fwrite quand c'est possible. gcc ne devine pas tout seul qu'il peut optimiser ces fonction ; on (les développeurs de gcc) lui a appris à le faire.

Reply

Marsh Posté le 10-09-2007 à 12:20:22    

matafan a écrit :

Le truc c'est que quelque part dans gcc, il y a du code spécial qui se charge de transformer les printf/fprintf en write/fwrite quand c'est possible. gcc ne devine pas tout seul qu'il peut optimiser ces fonction ; on (les développeurs de gcc) lui a appris à le faire.

OK, donc c'est une optimisation très spécifique à printf, et "codée en dur"... Tout s'explique !
 
Quelque part, ça me rassure : je pensais que gcc était capable tout seul d'analyser le code de printf, de détecter que dans certains cas on ne faisait qu'appeler fwrite, et d'en générer les optiisations qui vont bien.
 
merci pour l'explication :jap:


---------------
TriScale innov
Reply

Marsh Posté le 10-09-2007 à 12:20:22   

Reply

Marsh Posté le 10-09-2007 à 20:18:24    

dans tous les cas tu ne fait que appeler fwrite.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed