Regression between 0.8.29 and 0.8.30 with GCC 14.2.1 on AArch64 and PPC64le
- Dominant language
- C++
- Stars
- 25.7k
- Forks
- 6.2k
- Avg merge
- 2d 19h
- Merged PRs (30d)
- 29
Description
## Description
Solidity build fails with GCC 14.2.1 on AArch64 and PPC64le but completes just fine on these arches with a more modern GCC 15.1.1. On X86_64 it compiles just fine with both GCC versions.
## Environment
- Compiler version: GCC 14.2.1
- Compilation pipeline (legacy, IR, EOF): n/a
- Target EVM version (as per compiler settings): n/a
- Framework/IDE (e.g. Foundry, Hardhat, Remix): n/a
- EVM execution environment / backend / blockchain client: n/a
- Operating system: Linux
## Steps to Reproduce
I've tried to build solidity with the following parameters (note the `-Werror=array-bounds` parameter implied by `-Wall`):
```sh
CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection '
CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection '
...
/usr/bin/cmake -S . -B redhat-linux-build -DCMAKE_C_FLAGS_RELEASE:STRING=-DNDEBUG -DCMAKE_CXX_FLAGS_RELEASE:STRING=-DNDEBUG -DCMAKE_Fortran_FLAGS_RELEASE:STRING=-DNDEBUG -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON -DCMAKE_INSTALL_DO_STRIP:BOOL=OFF -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_INSTALL_FULL_SBINDIR:PATH=/usr/sbin -DCMAKE_INSTALL_SBINDIR:PATH=sbin -DINCLUDE_INSTALL_DIR:PATH=/usr/include -DLIB_INSTALL_DIR:PATH=/usr/lib64 -DSYSCONF_INSTALL_DIR:PATH=/etc -DSHARE_INSTALL_PREFIX:PATH=/usr/share -DLIB_SUFFIX=64 -DBUILD_SHARED_LIBS:BOOL=ON -DIGNORE_VENDORED_DEPENDENCIES:BOOL=ON -DBoost_USE_STATIC_LIBS:BOOL=OFF -DSTRICT_Z3_VERSION:BOOL=OFF -DTESTS:BOOL=OFF
```
It works just fine on x86_64 with this old GCC version but fails on secondary arches (aarch64, ppc64le) with the following stacktrace:
```c++
[ 57%] Building CXX object libsolidity/CMakeFiles/solidity.dir/analysis/ControlFlowRevertPruner.cpp.o
cd /builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/redhat-linux-build/libsolidity && /usr/bin/g++ -DBOOST_ATOMIC_DYN_LINK -DBOOST_ATOMIC_NO_LIB -DBOOST_FILESYSTEM_DYN_LINK -DBOOST_FILESYSTEM_NO_LIB -DBOOST_SYSTEM_DYN_LINK -DBOOST_SYSTEM_NO_LIB -DFMT_HEADER_ONLY=1 -I/builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/redhat-linux-build/include -I/builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30 -O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -O2 -DNDEBUG -std=c++20 -fstack-protector-strong -Wimplicit-fallthrough -fmacro-prefix-map=/builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30=/solidity -Wpessimizing-move -Wredundant-move -Wall -Wextra -Werror -pedantic -Wmissing-declarations -Wno-unknown-pragmas -Wsign-conversion -Wconversion -Wextra-semi -Wno-dangling-reference -Wduplicated-cond -Wlogical-op -fdiagnostics-color -MD -MT libsolidity/CMakeFiles/solidity.dir/analysis/ControlFlowRevertPruner.cpp.o -MF CMakeFiles/solidity.dir/analysis/ControlFlowRevertPruner.cpp.o.d -o CMakeFiles/solidity.dir/analysis/ControlFlowRevertPruner.cpp.o -c /builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolidity/analysis/ControlFlowRevertPruner.cpp
In file included from /usr/include/c++/14/bits/stl_uninitialized.h:63,
from /usr/include/c++/14/memory:69,
from /builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolidity/ast/ASTForward.h:26,
from /builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolidity/ast/AST.h:26,
from /builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolidity/analysis/ControlFlowRevertPruner.h:21,
from /builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolidity/analysis/ControlFlowRevertPruner.cpp:19:
In function ‘std::__copy_move::__copy_m(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode**)solidity::frontend::CFGNode**’,
inlined from ‘std::__copy_move_a2(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode**)solidity::frontend::CFGNode**’ at /usr/include/c++/14/bits/stl_algobase.h:521:30,
inlined from ‘std::__copy_move_a1(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode**)solidity::frontend::CFGNode**’ at /usr/include/c++/14/bits/stl_algobase.h:548:42,
inlined from ‘std::__copy_move_a(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode**)solidity::frontend::CFGNode**’ at /usr/include/c++/14/bits/stl_algobase.h:555:31,
inlined from ‘std::copy(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode**)solidity::frontend::CFGNode**’ at /usr/include/c++/14/bits/stl_algobase.h:651:7,
inlined from ‘std::vector >::_M_assign_aux(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, std::forward_iterator_tag)void’ at /usr/include/c++/14/bits/vector.tcc:348:15,
inlined from ‘std::vector >::operator=(std::initializer_list)’ at /usr/include/c++/14/bits/stl_vector.h:790:21,
inlined from ‘solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()::{lambda(solidity::frontend::CFGNode*, auto:1&&)#1}::operator()::run<{lambda(solidity::frontend::CFGNode*, auto:1&&)#1}>({lambda(solidity::frontend::CFGNode*, auto:1&&)#1}&&)::{lambda(solidity::frontend::CFGNode*)#1}>(solidity::frontend::CFGNode*, {lambda(solidity::frontend::CFGNode*, auto:1&&)#1}&&) constauto’ at /builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolidity/analysis/ControlFlowRevertPruner.cpp:148:43,
inlined from ‘solidity::util::BreadthFirstSearch::run(solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()::{lambda(solidity::frontend::CFGNode*, auto:1&&)#1}&&)solidity::util::BreadthFirstSearch&’ at /builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolutil/Algorithms.h:113:17,
inlined from ‘solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()’ at /builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolidity/analysis/ControlFlowRevertPruner.cpp:132:73:
/usr/include/c++/14/bits/stl_algobase.h:452:30: error: ‘memcpy’ forming offset 8 is out of the bounds [0, 8] of object ‘’ with type ‘struct CFGNode * const[1]’ [-Werror=array-bounds=]
452 | __builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
| ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolidity/analysis/ControlFlowRevertPruner.cpp: In member function ‘solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()’:
/builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolidity/analysis/ControlFlowRevertPruner.cpp:148:92: note: ‘’ declared here
148 | _node->exits = {functionFlow.revert};
| ^
In function ‘std::__copy_move::__copy_m(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode**)solidity::frontend::CFGNode**’,
inlined from ‘std::__copy_move_a2(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode**)solidity::frontend::CFGNode**’ at /usr/include/c++/14/bits/stl_algobase.h:521:30,
inlined from ‘std::__copy_move_a1(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode**)solidity::frontend::CFGNode**’ at /usr/include/c++/14/bits/stl_algobase.h:548:42,
inlined from ‘std::__copy_move_a(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode**)solidity::frontend::CFGNode**’ at /usr/include/c++/14/bits/stl_algobase.h:555:31,
inlined from ‘std::copy(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode**)solidity::frontend::CFGNode**’ at /usr/include/c++/14/bits/stl_algobase.h:651:7,
inlined from ‘std::__uninitialized_copy::__uninit_copy(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode**)solidity::frontend::CFGNode**’ at /usr/include/c++/14/bits/stl_uninitialized.h:147:27,
inlined from ‘std::uninitialized_copy(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode**)solidity::frontend::CFGNode**’ at /usr/include/c++/14/bits/stl_uninitialized.h:185:15,
inlined from ‘std::__uninitialized_copy_a(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode**, std::allocator&)solidity::frontend::CFGNode**’ at /usr/include/c++/14/bits/stl_uninitialized.h:373:37,
inlined from ‘std::vector >::_M_assign_aux(solidity::frontend::CFGNode* const*, solidity::frontend::CFGNode* const*, std::forward_iterator_tag)void’ at /usr/include/c++/14/bits/vector.tcc:352:35,
inlined from ‘std::vector >::operator=(std::initializer_list)’ at /usr/include/c++/14/bits/stl_vector.h:790:21,
inlined from ‘solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()::{lambda(solidity::frontend::CFGNode*, auto:1&&)#1}::operator()::run<{lambda(solidity::frontend::CFGNode*, auto:1&&)#1}>({lambda(solidity::frontend::CFGNode*, auto:1&&)#1}&&)::{lambda(solidity::frontend::CFGNode*)#1}>(solidity::frontend::CFGNode*, {lambda(solidity::frontend::CFGNode*, auto:1&&)#1}&&) constauto’ at /builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolidity/analysis/ControlFlowRevertPruner.cpp:148:43,
inlined from ‘solidity::util::BreadthFirstSearch::run(solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()::{lambda(solidity::frontend::CFGNode*, auto:1&&)#1}&&)solidity::util::BreadthFirstSearch&’ at /builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolutil/Algorithms.h:113:17,
inlined from ‘solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()’ at /builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolidity/analysis/ControlFlowRevertPruner.cpp:132:73:
/usr/include/c++/14/bits/stl_algobase.h:452:30: error: ‘memcpy’ offset [-9223372036854775799, -1] is out of the bounds [0, 8] of object ‘’ with type ‘struct CFGNode * const[1]’ [-Werror=array-bounds=]
452 | __builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
| ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolidity/analysis/ControlFlowRevertPruner.cpp: In member function ‘solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()’:
/builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/libsolidity/analysis/ControlFlowRevertPruner.cpp:148:92: note: ‘’ declared here
148 | _node->exits = {functionFlow.revert};
| ^
cc1plus: all warnings being treated as errors
gmake[2]: Leaving directory '/builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/redhat-linux-build'
gmake[2]: *** [libsolidity/CMakeFiles/solidity.dir/build.make:149: libsolidity/CMakeFiles/solidity.dir/analysis/ControlFlowRevertPruner.cpp.o] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:432: libsolidity/CMakeFiles/solidity.dir/all] Error 2
gmake: *** [Makefile:139: all] Error 2
gmake[1]: Leaving directory '/builddir/build/BUILD/solidity-0.8.30-build/solidity-0.8.30/redhat-linux-build'
```
I suspect this is likely a compiler's bug but maybe we could hint it somehow to calculate arrays properly?
Again everything is totally fine on x86_64, that's just a problem with non-Intel/AMD arches with a non-recent compiler.
Contributor guide
Research direction
Start with libsolidity/analysis/ControlFlowRevertPruner.cpp around lines 132 and 148, where GCC 14.2.1 reports the array-bounds error, and compare the 0.8.29 and 0.8.30 implementations. Reproduce the provided CMake build on AArch64 or PPC64le with GCC 14.2.1 and confirm that the build completes with the shown warning flags while preserving the successful GCC 15.1.1 and x86_64 builds.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp
- Domain
- build-system, compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100