如何防止GCC编译容易出错的vsnprintf?
How to prevent GCC from compiling error-prone vsnprintf?
是否可以在编译时检测到 vsnprintf() 的第四个参数少于 vsnprintf() 的第三个参数所需的数量?我的意思是:
#include <stdio.h>
#include <stdarg.h>
void foo(const char* format, ...)
{
char buffer[256];
va_list args;
va_start (args, format);
vsnprintf(buffer, 256, format, args); // args may points to fewer arguments than expected in the format
va_end (args);
}
int main ()
{
foo("%d %d", 1); // the format requires two arguments, but only one is provided, so a warning from the compiler is expected here
return 0;
}
gcc -Wall main.c
编译上面没有警告
将属性应用于 foo
。
__attribute__((__format__(__printf__, 1, 2)))
void foo(const char* format, ...) {
用-Werror=format
编译。
是否可以在编译时检测到 vsnprintf() 的第四个参数少于 vsnprintf() 的第三个参数所需的数量?我的意思是:
#include <stdio.h>
#include <stdarg.h>
void foo(const char* format, ...)
{
char buffer[256];
va_list args;
va_start (args, format);
vsnprintf(buffer, 256, format, args); // args may points to fewer arguments than expected in the format
va_end (args);
}
int main ()
{
foo("%d %d", 1); // the format requires two arguments, but only one is provided, so a warning from the compiler is expected here
return 0;
}
gcc -Wall main.c
编译上面没有警告
将属性应用于 foo
。
__attribute__((__format__(__printf__, 1, 2)))
void foo(const char* format, ...) {
用-Werror=format
编译。