如何在Clang中将特定函数参数标记为安全格式字符串?

时间:2016-10-04 04:29:26

标签: c clang compiler-warnings variadic-functions

我有这样的事情:

static void
my_varargs_internal (const char *prefix, const char *format, va_list args)
{
    printf ("%s: ", prefix);
    vprintf (format, args);
    /* Other more complicated stuff which is why I want this to be a separate function */
    printf ("\n");
}

void
__attribute__ ((format (printf, 1, 2)))
varargs_general (const char *format, ...)
{
    va_list args;
    va_start (args, format);
    my_varargs_internal ("General", format, args);
    va_end (args);
}

void
__attribute__ ((format (printf, 2, 3)))
varargs_specialized (const char *prefix, const char *format, ...)
{
    va_list args;
    va_start (args, format);
    my_varargs_internal (prefix, format, args);
    va_end (args);
}

使用Clang与-Wformat -Wformat-nonliteral进行编译,我在vprintf行上收到“Format string is a string literal”警告。有没有办法将format参数标记为已经检查过的格式字符串,因为编译器已在调用varargs_generalvarargs_specialized时检查过它?我无法使用format属性执行此操作,因为这仅适用于varargs函数,而不适用于va_list参数的函数。

海湾合作委员会似乎正确理解了这种情况,并没有发出警告。

1 个答案:

答案 0 :(得分:1)

我能够使用:

来抑制警告
static void
__attribute__ ((format (printf, 2, 0)))
my_varargs_internal (const char *prefix, const char *format, va_list args)
{
    printf ("%s: ", prefix);
    vprintf (format, args);
    /* Other more complicated stuff which is why I want this to be a separate function */
    printf ("\n");
}

基于Declaring Attributes of Functions:

  

对于无法检查参数的函数   (例如vprintf),将第三个参数指定为零。