make - могу ли я подавить ошибку форматирования? - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь установить пакет intel psm из исходного кода. Когда я запускаю make, я получаю эту странную ошибку.

$ make
...
make libpsm_infinipath.so
make[1]: Entering directory `/home/kilojoules/psm'
cc   -Wall -Werror  -fpic -fPIC -D_GNU_SOURCE -funwind-tables   -O3 -g3   -DNVALGRIND -I. -I/home/kilojoules/psm/include -I/home/kilojoules/psm/mpspawn -I/home/kilojoules/psm/include/linux-x86_64  -c psm_context.c -o psm_context.o
cc   -Wall -Werror  -fpic -fPIC -D_GNU_SOURCE -funwind-tables   -O3 -g3   -DNVALGRIND -I. -I/home/kilojoules/psm/include -I/home/kilojoules/psm/mpspawn -I/home/kilojoules/psm/include/linux-x86_64  -c psm_ep.c -o psm_ep.o
psm_ep.c: In function '__psm_ep_open':
psm_ep.c:1013:27: error: '%1d' directive output may be truncated writing between 1 and 5 bytes into a region of size 4 [-Werror=format-truncation=]
      snprintf(pvalue, 4, "%1d", ports[0]);
                           ^~~
psm_ep.c:1013:26: note: directive argument in the range [0, 65535]
      snprintf(pvalue, 4, "%1d", ports[0]);
                          ^~~~~
psm_ep.c:1013:6: note: 'snprintf' output between 2 and 6 bytes into a destination of size 4
      snprintf(pvalue, 4, "%1d", ports[0]);
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
psm_ep.c:1041:27: error: '%1d' directive output may be truncated writing between 1 and 5 bytes into a region of size 4 [-Werror=format-truncation=]
      snprintf(pvalue, 4, "%1d", ports[i]);
                           ^~~
psm_ep.c:1041:26: note: directive argument in the range [0, 65535]
      snprintf(pvalue, 4, "%1d", ports[i]);
                          ^~~~~
psm_ep.c:1041:6: note: 'snprintf' output between 2 and 6 bytes into a destination of size 4
      snprintf(pvalue, 4, "%1d", ports[i]);
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [psm_ep.o] Error 1
make: *** [libs] Error 2

Я хочу подавить ошибку. Кажется, это предупреждение больше, чем ошибка. Это то, что я могу сделать здесь? Как бы я это сделал?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Похоже на возможную ошибку в исходном коде, поэтому имеет смысл предупреждать компилятор, особенно с -Wall. (А с -Werror это трактуется как ошибка.)

"%1d" никогда не отличается от "%d": установка минимальной ширины на 1 является 1 избыточной. (Я не нашел SO Q & A по этому поводу, но см. http://www.kurabiyeaski.com/ym/201501/a_Meaning_of__1d_in_printf_statement_in__c__.html).

"%.1d" также будет избыточным: он устанавливает минимальное количество цифр в 1 (http://man7.org/linux/man-pages/man3/printf.3.html),, но %d уже всегда печатает как минимум 1 цифру и, возможно, знак.

В любом случае, это может указывать на то, что программист, написавший этот код, намеревался что-то другое, например, возможно, печатать только одну цифру . Насколько я знаю, вы не можете усекать целочисленные форматы с printf, поэтому вам придется использовать ports[i] % 10, если вы хотите, например, последнюю десятичную цифру.

Я бы рекомендовал изменить строку формата на "%d" и отправить патч авторам.


Тем не менее, snprintf завершает строку 0, даже если она слишком велика для буфера , поэтому можно смело использовать усеченный вывод как строку C. В отличие от strncpy().

Это означает, что можно игнорировать это предупреждение, если программа работает правильно. Это не сбой или переполнение буфера в ожидании.

0 голосов
/ 01 июля 2018

Это воспринимается как ошибка из-за того, что флаг -Werror передается компилятору. Этот флаг указывает компилятору превратить любые предупреждения в ошибки (см. cc1: all warnings being treated as errors) строку вывода. Удалите этот флаг, чтобы изменить поведение (вам, вероятно, придется редактировать make-файл).

...