gcc -Wformat-truncation предупреждение, возникающее - PullRequest
0 голосов
/ 16 ноября 2018

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, поэтому я был бы признателен за некоторые рекомендации здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...