完全忽略C函数的可变参数是否安全?

Mat*_* H. 13 c variadic-functions

我有一个大致如此的功能:

typedef struct SomeType {
  ...
} SomeType;

void TakesArgs(SomeType *t1, ...) {
     // iterates through arguments
}

// usage:
TakesArgs(&a, &b, &c);
Run Code Online (Sandbox Code Playgroud)

如果我要更改TakesArgs为无操作,同时仍保持所有调用代码不变,我是否会使用内存(或其他方式)运行任何奇怪的风险?

void TakesArgs(SomeType *t1, ...) {
    return;
}

// usage unchanged: 
TakesArgs(&a, &b, &c);
Run Code Online (Sandbox Code Playgroud)

换句话说,跳过在原始实现中执行的va_list/ va_startdance会有任何奇怪的副作用吗?

AnT*_*AnT 8

是的,这是非常安全的.您不需要阅读所有可变参数只是为了阅读它们.您甚至不需要在内部启动可变参数读取序列TakesArgs.

在引擎盖下,它通常意味着执行任何参数传递维护任务的负担被赋予调用代码(它们的方式通常被认为是"传统的"C调用约定).被叫者不必做任何事情.

  • @Olaf:这个措辞明确指的是在没有先前调用`va_start` /`va_copy`的情况下调用`va_end`.这是UB.它还指的是调用`va_start` /`va_copy`而没有终止`va_end`.它也是UB.但它没有说任何关于不调用`va_start`和`va_end`的事情. (4认同)
  • @Olaf:具体是什么措辞? (2认同)