gcc 7.1 ввел новое предупреждение, которое сообщает вам, если вы используете такие функции, как snprintf
, и ваши аргументы приведут к усечению вывода.
Документация подразумевает, что она поднимается только в том случае, если вы не проверяете и не действуете с возвращаемым значением:
Уровень 1 -Wformat-усечение, включенное -Wformat, использует
консервативный подход, который предупреждает только о вызовах ограниченных функций
, возвращаемое значение которого не используется , и это, скорее всего, приведет к
усечение вывода.
Вот пример модуля компиляции, скомпилированного с версией 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");
Я неправильно истолковал документацию? Я не вижу, как я могу проверить возвращаемое значение больше, чем уже делаю.
Ссылка: предыдущий вопрос SO , который подразумевает, что предупреждение не должно подниматься. Мне действительно не нравится отключать предупреждения и обычно компилировать с -Wall -Werror
, поэтому я был бы признателен за некоторые рекомендации здесь.