error: narrowing conversion of '-1' from 'int' to 'long unsigned int' [-Wnarrowing] while compiling `gcc`
error: narrowing conversion of '-1' from 'int' to 'long unsigned int' [-Wnarrowing] while compiling `gcc`
当我遇到以下错误消息时,我正在用 make && make install
编译最终的 gcc-9.2.0
build using glibc-2.31
while following 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, __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: error: size '-1' of array 'assertion_failed__1161' is negative
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, __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);
| ^~~~~~~~~~~~~~~~~~~~~
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 gcc
和 glibc
,并且仅在构建 gcc
.
的最终阶段时才会出现此错误
以上错误是由于使用 Glibc-2.31 引入的问题。
可以使用以下命令修复问题:
sed -e '1161 s|^|//|' \
-i libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc
GCC 的 libsanitizer 需要移植到这个 glibc 更改:
这发生在 GCC PR 92154: new glibc breaks arm bootstrap due to libsanitizer 中,它包含在 GCC 9.3 中,但不包含在 GCC 9.2 中。
当我遇到以下错误消息时,我正在用 make && make install
编译最终的 gcc-9.2.0
build using glibc-2.31
while following 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, __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: error: size '-1' of array 'assertion_failed__1161' is negative
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, __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);
| ^~~~~~~~~~~~~~~~~~~~~
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 gcc
和 glibc
,并且仅在构建 gcc
.
以上错误是由于使用 Glibc-2.31 引入的问题。
可以使用以下命令修复问题:
sed -e '1161 s|^|//|' \
-i libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc
GCC 的 libsanitizer 需要移植到这个 glibc 更改:
这发生在 GCC PR 92154: new glibc breaks arm bootstrap due to libsanitizer 中,它包含在 GCC 9.3 中,但不包含在 GCC 9.2 中。