2010-11-27 38 views
1

Supposons que j'appelle une fonction qui prend un nombre variable d'arguments dans mon code source. Je veux faire une sorte d'analyse statique sur ce code source pour trouver le type d'arguments réellement passés à la fonction. Par exemple, si mon appel de fonction est -Obtention des types d'arguments de fonction

foo (a, b, c)

Je veux trouver le type de données a, b et c et stocker ces informations.

+0

quelle langue? – dutt

+0

Le code est en C – i0exception

+0

FWIW si votre fonction est une variante de type 'printf'- ou' scanf', et si vous utilisez gcc, vous pouvez utiliser l'attribut de fonction ['format'] (http: // gcc. gnu.org/onlinedocs/gcc/Function-Attributes.html#index-g_t_0040code_007bformat_007d-function-attribute-2417) avec votre fonction, et le compilateur vérifiera automatiquement vos arguments à tous les appels de cette fonction. –

Répondre

0

Si cela est en C++, vous pouvez pirater ensemble une RTTI utilisant typeid etc.

http://en.wikipedia.org/wiki/Run-time_type_information

+1

Résisté à mes réflexes "downvote tout le monde qui mentionne C++ dans une question C" assez longtemps pour vérifier que la langue a été ajoutée après coup plutôt que d'une partie de la question. –

1

Vous assez bien avez à faire la partie parse-and-build-un symbole table de compilation le programme.

Ce qui signifie également l'exécution du préprocesseur et le lexage.

Voilà les mauvaises nouvelles.

Les bonnes nouvelles sont que n'avez pas à faire beaucoup de choses difficiles. Pas besoin de construire un AST, toutes les parties du code sauf typedefs; les définitions de struct, union et enum; les déclarations-et-définitions à variable-ou-fonction; et l'analyse des arguments d'appel de fonction peut être un no-op.

Suite à la réflexion des commentaires de Chris: Vous devez également pouvoir analyser les types d'expressions et gérer les promotions va-arg.

Il s'agit toujours d'un projet plus petit que l'écriture d'un compilateur entier, mais il devrait être abordé avec une certaine réflexion.

+0

Vous n'avez même pas besoin de définitions - les déclarations 'struct' sont tout ce dont vous avez besoin. Vous pouvez supprimer les définitions. –

+0

@Chris, à moins que l'appel ressemble à 'foo (bar.i)', non? – dmckee

+0

Aussi, vous devriez être très prudent sur les types de littéraux, surtout après les promotions de fonctions variadiques. Et je suppose que vous auriez besoin d'analyser la plupart des expressions. –