Core.vararg问题,重复调用va_arg时产生的垃圾

时间:2012-07-11 12:41:39

标签: d variadic-functions void-pointers

请参阅以下代码:

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));
    }
}

输出:

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

如您所见,var_arg正在产生垃圾。第一个调用总是返回正确的值。

这里有什么问题? core.vararg的源代码非常简单,我无法发现任何改变7FFF61F21AE0底层数据的内容

1 个答案:

答案 0 :(得分:2)

7FFF61F21AE0看起来像是64位地址。请注意,对于X86以外的平台,core.vararg会将其实施转发给core.stdc.stdarg

64位实现在这里:https://github.com/D-Programming-Language/druntime/blob/master/src/core/stdc/stdarg.d#L84

我认为,示例中代码的明显解释是模块使用不正确(没有va_start调用)。