gcc 7.1引入了一个新的警告,告诉您是否使用诸如snprintf
之类的函数,并且您的参数将导致输出截断。
documentation意味着仅当您不检查返回值并根据返回值采取行动时才会引发:
由-Wformat启用的-Wformat-truncation的1级采用了 保守的方法仅警告对有界函数的调用 未使用其返回值的 ,这很可能导致 输出截断。
这是一个示例编译单元,使用版本7.3.0进行了编译,可以说明该问题。
#include <stdio.h>
#include <stdlib.h>
int main() {
char w;
int size = snprintf(&w, 1, "%s", "hello world");
if(size<0) {
abort();
}
char *buffer = malloc(size+1);
snprintf(buffer, size+1, "%s", "hello world");
printf("Wrote %d characters: %s\n", size, buffer);
return 0;
}
像这样编译:
$ gcc -Wformat-truncation=1 test.c
test.c: In function ‘main’:
test.c:8:31: warning: ‘%s’ directive output truncated writing 11 bytes into a region of size 1 [-Wformat-truncation=]
int size = snprintf(&w, 1, "%s", "hello world");
^~ ~~~~~~~~~~~~~
test.c:8:7: note: ‘snprintf’ output 12 bytes into a destination of size 1
int size = snprintf(&w, 1, "%s", "hello world");
我误解了文档吗?我看不到如何检查返回值而已。
参考:previous SO question表示不应提出警告。我真的不喜欢禁用警告并且通常使用-Wall -Werror
进行编译,因此,我希望在这里提供一些指导。