调用va_arg的次数少于传递的参数数量

tan*_*grs 1 c variadic-functions undefined-behavior

如果我调用va_arg的次数少于在可变参数函数中传递的参数数量,那么它是否是未定义的行为?

例如:

#include <stdarg.h>
void foo(unsigned n, ...) {
    va_list ap;
    int bar = 0;

    va_start(ap, n);
    if (n) bar = va_arg(ap,int);
    // Do something with bar
}

int main() {
    foo(2, 3, 4);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序会导致未定义的行为吗?

Car*_*rum 7

您的程序确实会导致未定义的行为,但不是因为您使用的方式va_arg.这只是忽略了额外的论点,所以包含它似乎浪费了打字.

导致未定义行为的原因是您没有包含va_end在该函数中.

从规范(7.15.1.1 va_arg):

每次调用va_arg宏都会修改,ap以便依次返回连续参数的值.......如果没有实际的下一个参数......行为是未定义的......

并从7.15.1.3 va_end:

...如果在va_end返回之前未调用宏,则行为未定义.

没有提到必须拨打va_arg一定次数.如您所见,这va_end很重要.