gpt4 book ai didi

c - Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

转载 作者:太空狗 更新时间:2023-10-29 15:55:06 24 4
gpt4 key购买 nike

我有这段代码

static void err_doit(int errnoflag, int level, const char *fmt, va_list ap)
{
int errno_save;
unsigned long n;
char buf[MAXLINE];
errno_save = errno;
#ifdef HAVE_VSNPRINTF
vsnprintf(buf, sizeof(buf), fmt, ap); /* this is safe */
#else
vsprintf(buf ,fmt, ap); /* this is not safe */
#endif
n = strlen(buf);
if (errnoflag)
snprintf(buf + n, sizeof(buf) - n, ": %s", strerror(errno_save));
strcat(buf, "\n");

if (daemon_proc) {
syslog(level,"%s", buf);
} else {
fflush(stdout);
fputs(buf, stderr);
fflush(stderr);
}
return;
}

当我编译它时(带有 -Weverything 的 Clang 5.0.0)我收到了这些警告:

Building C object lib/netutils/CMakeFiles/netutils.dir/error.c.o
/Users/User/Desktop/project.cmake/lib/netutils/error.c:98:16: warning: format string is not a string literal [-Wformat-nonliteral]
vsprintf(buf ,fmt, ap); /* this is not safe */
^~~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/secure/_stdio.h:66:57: note: expanded from
macro 'vsprintf'__builtin___vsprintf_chk (str, 0, __darwin_obsz(str), format, ap)
^

同样的事情发生在另一个函数 vsnprintf(buf, sizeof(buf), fmt, ap);

我该如何解决这个警告?

谢谢

最佳答案

显然,解决方案是告诉 Clang,您的 vsnprintf 是在一个实现 printf 系列函数行为的函数中调用的,嗯,调用 vsnprintf。你用一个属性来做到这一点,as described here :

__attribute__((__format__ (__printf__, 3, 0)))
static void err_doit(int errnoflag, int level, const char *fmt, va_list ap)
{
...
}

这会检查格式字符串是否是调用函数的文字。由于 err_doit 已经采用了 va_list,因此您也应该在调用它的函数上指定格式。第二个数字(此处为 0)应该是可变参数 ... 的参数索引。参见 also this discussion .

函数属性是 gcc 的非标准扩展,它也为 Clang 实现。如果你想保持代码编译器独立,你应该将属性包装在一个宏中,为不知道属性的编译器隐藏它。

(免责声明:我无法用 Clang 对此进行检查,但它适用于 gcc。编辑:修复了示例中错误的参数索引)

关于c - Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20167124/

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