是否可以验证可变参数计数?

问题描述

在C中,stdarg.h库下的变量参数可以被函数或过程接受,并且通常在参数列表之前是要跟随的参数数目的计数。可以验证用户对参数的计数吗?

我怀疑这是有可能的,因为printf()是一个varargs函数,并且如果程序员在格式字符串中的标记数与提供的参数数之间不匹配,则会发生运行时错误。因此,似乎printf具有某种检测提供的参数数量方法

解决方法

C标准对此不提供任何便利。通常,printf实现不能也不会为此 1 提供运行时错误,尽管使用不正确的参数会生成运行时错误,例如尝试访问未映射的内存。当C编译器可以看到格式字符串时,通常会为此提供编译时错误。

脚注

1 从技术上来说,C实现不能将其作为功能提供,但是大多数C实现不具备此功能,主要是因为它们符合不支持该功能的ABI。 / p>

,

用C语言是不可能的。

printf不计算参数。在编译期间,编译器将分析格式字符串并将其与参数进行比较。它不是仅在运行时编译时完成的。

在不知道格式说明符的编译时间时很容易发现:

#include <stdio.h>
void foo(const char *str)
{
    printf(str,34,57.0,(void *)5655);
}

void bar(void)
{
    printf("%s,%d,%c",(void *)5655);
}

https://godbolt.org/z/ans7Kh