2012-07-11 2 views
1

S'il vous plaît voir le code suivant:question Core.vararg, déchets produits sur les appels répétés de va_arg

import core.vararg, std.stdio; 

void main() { 
    foo(1); 
} 

void foo(...) { 
    va_list arguments; 
    for(int i; i<10; ++i) { 
     va_copy(arguments, _argptr); 
     writeln(arguments," ", va_arg!(int)(arguments)); 
    } 
} 

Sortie:

7FFF61F21AE0 1 
7FFF61F21AE0 0 
7FFF61F21AE0 4387892 
7FFF61F21AE0 0 
7FFF61F21AE0 38 
7FFF61F21AE0 1643256688 
7FFF61F21AE0 4387915 
7FFF61F21AE0 1 
7FFF61F21AE0 27734032 
7FFF61F21AE0 1005847240 

Comme vous pouvez le voir, var_arg est produit ordures. Le premier appel renvoie toujours la valeur correcte cependant.

Quel est le problème ici? Le code source pour core.vararg est très simple et je ne pouvais pas repérer quoi que ce soit qui change les données sous-jacentes à 7FFF61F21AE0

Répondre

2

7FFF61F21AE0 ressemble à une adresse 64 bits. Notez que core.vararg transmet son implémentation à core.stdc.stdarg pour les plates-formes autres que X86.

La mise en œuvre 64 bits est ici: https://github.com/D-Programming-Language/druntime/blob/master/src/core/stdc/stdarg.d#L84

L'explication évidente pour le code dans l'exemple serait que le module est utilisé de façon incorrecte (pas d'appel va_start), je pense.

+0

Ah, je vois. Je ne crois pas qu'un appel à va_start soit nécessaire pour utiliser core.vararg (il n'y en a pas dans les exemples ici: http://dlang.org/function.html). Cependant, il y a pour core.stdc.stdarg donc ça doit être ce qui m'arrive –

+0

Non, quoi que je fasse, compilé en utilisant x86 ou x86_64 et en utilisant l'une ou l'autre syntaxe, le pointeur reste sur la même adresse mais va_arg lit les arguments séquentiellement et puis passe à la poubelle, malgré l'utilisation de va_copy. –

Questions connexes