2015-07-31 2 views
-1

La tâche m'a été assignée pour préfixer p_ tous les noms de variables pointeurs dans un certain nombre de fichiers C. Cela doit être appliqué aux paramètres de fonction, aux données de fonction locale et globales.Comment obtenir toutes les variables de pointeur à partir d'un fichier C

Une fois que j'ai la liste, je peux utiliser sed pour faire ce que je veux.

Mais comment puis-je obtenir la liste?

+3

Mais vous pouvez avoir une variable 'ab abc' dans certaines fonctions et' char * abc' dans d'autres, dans le même fichier ... – rodrigo

+4

Donc une recherche de snipe c'est. Qui t'es emmerdé? – EOF

+0

@rodrigo: c'est vrai. Ce n'est peut-être pas faisable pour l'automatisation après tout ... :( –

Répondre

2

Tout est là dans les informations de débogage.

Voir cet exemple simple (ptr.c).

int *global_pointer; 
float global_scalar; 
int main(int arg_scalar, char **arg_pointer) { 
    void *local_pointer; 
    char local_scalar; 
} 

Compilons et examiner le résultat woth objdump

gcc -g ptr.c && objdump --dwarf=info a.out 

Il est pas trop difficile à comprendre. Il y a quelques occurrences de (DW_TAG_pointer_type). Dans mon exemple, il y en a quatre.

<1><8d>: Abbrev Number: 6 (DW_TAG_pointer_type) 
<1><93>: Abbrev Number: 6 (DW_TAG_pointer_type) 
<1><a0>: Abbrev Number: 8 (DW_TAG_pointer_type) 
<1><b8>: Abbrev Number: 6 (DW_TAG_pointer_type) 

Notez les nombres hexadécimaux devant eux, et chercher des sections les contenant sous forme DW_AT_type : <0xb8>. La section entière avec le type 0xB8 est:

<1><a2>: Abbrev Number: 9 (DW_TAG_variable) 
    <a3> DW_AT_name  : (indirect string, offset: 0x3a): global_pointer 
    <a7> DW_AT_decl_file : 1   
    <a8> DW_AT_decl_line : 1   
    <a9> DW_AT_type  : <0xb8> 
    <ad> DW_AT_external : 1   
    <ae> DW_AT_location : 9 byte block: 3 78 8 60 0 0 0 0 0  (DW_OP_addr: 600878) 

Il est le nom de la variable, et la ligne, il a été déclaré dans un numéro de dossier aussi, mais je n'ai qu'un seul fichier source, il est donc toujours 1.. C'est tout ce dont vous aurez besoin pour le trouver, peut-être avec l'aide de awk, sauf si vous avez fait quelque chose de vraiment moche comme déclarer une variable globale et ensuite une variable locale ayant le même nom, le tout sur une seule ligne. Peu probable s'il y a une certaine norme de codage :)

+0

C'est une approche * extrêmement * intéressante!Déplacer le problème vers le domaine d'analyse de texte est beaucoup plus proche de mon âme que d'utiliser un IDE par exemple (encore je ne juge pas les gens qui les utilisent). Je suis simplement surpris par la quantité d'informations utiles qui se trouvent réellement sous forme de surdébit DWARF dans les objets ELF. Cependant, j'ai un problème particulier avec 'local_pointer' qui est étiqueté avec' (DW_TAG_variable) 'et non avec' (DW_TAG_pointer_type) 'comme attendu. Donc, je dois encore trouver quelques autres aspects et détails. Merci beaucoup! +1 –