错误:在编译`gcc`时,将'-1'的转换范围从'int'缩小为'long unsigned int'[-Wnarrowing]

问题描述

当我遇到以下错误消息时,我正在使用gcc-9.2.0编译最终的glibc-2.31构建,同时在make && make install之后跟随this article

In file included from ../../../../libsanitizer/sanitizer_common/sanitizer
_platform_limits_posix.cc:193:
../../../../libsanitizer/sanitizer_common/sanitizer_internal_defs.h:339:7
2: error: narrowing conversion of '-1' from 'int' to 'long unsigned int'
[-Wnarrowing]
  339 | IMPL_PASTE(assertion_failed_##_,line)[2*(int)(pred)-1]
      |                                                       ^

../../../../libsanitizer/sanitizer_common/sanitizer_internal_defs.h:333:3
0: note: in expansion of macro 'IMPL_COMPILER_ASSERT'
  333 | #define COMPILER_CHECK(pred) IMPL_COMPILER_ASSERT(pred,__LINE__)
      |                              ^~~~~~~~~~~~~~~~~~~~
../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix
.h:1511:3: note: in expansion of macro 'COMPILER_CHECK'
 1511 |   COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *) NULL)->MEMBER) =
= \
      |   ^~~~~~~~~~~~~~
../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix
.cc:1161:1: note: in expansion of macro 'CHECK_SIZE_AND_OFFSET'
 1161 | CHECK_SIZE_AND_OFFSET(ipc_perm,mode);
      | ^~~~~~~~~~~~~~~~~~~~~
../../../../libsanitizer/sanitizer_common/sanitizer_internal_defs.h:339:7
0: warning: size of array 'assertion_failed__1161' is not an integral con
stant-expression [-Wpedantic]
  339 | r IMPL_PASTE(assertion_failed_##_,line)[2*(int)(pred)-1]
      |                                          ~~~~~~~~~~~~~^~

../../../../libsanitizer/sanitizer_common/sanitizer_internal_defs.h:333:3
0: note: in expansion of macro 'IMPL_COMPILER_ASSERT'
  333 | #define COMPILER_CHECK(pred) IMPL_COMPILER_ASSERT(pred,mode);
      | ^~~~~~~~~~~~~~~~~~~~~
../../../../libsanitizer/sanitizer_common/sanitizer_internal_defs.h:339:7
0: error: size '-1' of array 'assertion_failed__1161' is negative
  339 | r IMPL_PASTE(assertion_failed_##_,mode);
      | ^~~~~~~~~~~~~~~~~~~~~
make[4]: *** [Makefile:663: sanitizer_platform_limits_posix.lo] Error 1
make[4]: Leaving directory '/home/sayakbrm/sbos/sources/gcc-9.2.0/gcc-bui
ld/x86_64-unknown-linux-gnu/libsanitizer/sanitizer_common'
make[3]: *** [Makefile:527: all-recursive] Error 1
make[3]: Leaving directory '/home/sayakbrm/sbos/sources/gcc-9.2.0/gcc-bui
ld/x86_64-unknown-linux-gnu/libsanitizer'
make[2]: *** [Makefile:414: all] Error 2
make[2]: Leaving directory '/home/sayakbrm/sbos/sources/gcc-9.2.0/gcc-bui
ld/x86_64-unknown-linux-gnu/libsanitizer'
make[1]: *** [Makefile:12361: all-target-libsanitizer] Error 2
make[1]: Leaving directory '/home/sayakbrm/sbos/sources/gcc-9.2.0/gcc-bui
ld'
make: *** [Makefile:962: all] Error 2

我已经设法编译了阶段1 gccglibc,并且只有在构建最终阶段的gcc时才会发生此错误。

解决方法

由于使用Glibc-2.31引入了问题,因此发生上述错误。

可以使用以下命令解决此问题:

sed -e '1161 s|^|//|' \
    -i libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc

Source

,

GCC的libsanitizer需要移植到此glibc更改:

这是在GCC PR 92154: new glibc breaks arm bootstrap due to libsanitizer中发生的,该事件包含在GCC 9.3中,但未包含在GCC 9.2中。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...