gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:05:25 25 4
gpt4 key购买 nike

我有这样的东西:

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参数作为已检查的格式字符串,因为编译器已在调用 varargs_general 时检查了它。或varargs_specialized ?我无法使用 format 做到这一点属性,因为它仅适用于 varargs 函数,而不适用于带有 va_list 的函数。参数。

GCC 似乎正确理解了这种情况并且没有发出警告。

最佳答案

我能够使用以下方法抑制警告:

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:

For functions where the arguments are not available to be checked (such as vprintf), specify the third parameter as zero.

关于c - 如何在 Clang 中将特定函数参数标记为安全格式字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39844181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com