make-我可以抑制格式截断错误吗?

时间:2018-07-01 02:09:07

标签: c makefile intel

我正在尝试从源代码安装intel's psm package。运行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

我想抑制该错误。似乎这是警告,而不是错误。那是我可以在这里做的吗?我该怎么办?

3 个答案:

答案 0 :(得分:4)

由于-Werror标志被传递给编译器,因此将其视为错误。该标志告诉编译器将所有警告变为错误(请参见cc1: all warnings being treated as errors)输出行。删除该标志以更改行为(您可能必须编辑makefile)。

答案 1 :(得分:3)

看起来像源代码中的可能错误,因此编译器发出警告是有道理的,尤其是对于-Wall。 (对于-Werror,这被视为错误。)

"%1d""%d"没什么不同:将最小宽度设置为1表示1冗余。 (我没有找到关于此的常见问题解答,但请参见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已经总是打印至少一位数字,并且可能会打印一个符号。

无论如何,这可能表明编写此代码的程序员还有其他目的,例如可能只打印一位数字。据我所知,您不能使用printf截断整数格式,因此,例如,如果要使用最后一个十进制数字,则必须使用ports[i] % 10

我建议将格式字符串更改为"%d"并向作者提交补丁。


但是 snprintf does 0-terminate the string even when it's too big for the buffer ,因此可以安全地将截断的输出用作C字符串。 Unlike strncpy()

这意味着只要程序能够正常运行,就可以忽略此警告。这不是崩溃或缓冲区溢出等待发生的情况。

答案 2 :(得分:0)

这只是一个更正,编译器需要关键字'ignored'而不是'ignore'。

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-truncation" 
// Code here   
#pragma GCC diagnostic pop

很多时候,更改 Makefile 是不方便的,因此这是消除错误的一种快速简便的方法。请注意,如果编译器认为这是一个错误,则必须小心注意。但是,编译器没有上下文信息,因此安全起见,它是错误的。例如,'%s' s(n)printf 标签需要 512 字节的空间;显然,这不是一个常见的案例;这就是这个 pragma 有用的地方。