Compilation with CMake and enabled optimizations fails on processing carp.prm
Summary
Compilation with CMake and -DCMAKE_BUILD_TYPE=Release
fails with segmentation fault on the following line
[ 18%] Use param to generate carp_d.h;carp_p.cc;carp_p.h from carp.prm
cd /tmp/openCARP/_build/simulator && cpp -DSOLVE_CURRENT -DWITH_BLAS -D_GNU_SOURCE -traditional /tmp/openCARP/simulator/carp.prm | awk ' ! ( /pragma/||/^# / ) ' | ../param/param - carp -ext prm -ansi
/bin/sh: line 1: 20544 Done cpp -DSOLVE_CURRENT -DWITH_BLAS -D_GNU_SOURCE -traditional /tmp/openCARP/simulator/carp.prm
20545 | awk ' ! ( /pragma/||/^# / ) '
20546 Segmentation fault | ../param/param - carp -ext prm -ansi
What version of openCARP are you using?
openCARP tag workshop2020, also tried v4.0 with the same problem.
What operating system and processor architecture are you using?
Gentoo Linux, x86_64, gcc version 9.3.0 (Gentoo 9.3.0-r1 p3), cmake version 3.17.4
Steps to reproduce
The following commands were used to reproduce in a clean workdir:
git clone --recurse-submodules -b workshop2020 https://git.opencarp.org/openCARP/openCARP.git
cd openCARP/
cmake -S. -B_build -DCMAKE_BUILD_TYPE=Release
cmake --build _build/ -- VERBOSE=1
What is the current bug behavior?
Compilation fails on processing carp.prm
with the freshly compiled param
executable.
What is the expected correct behavior?
Compilation works just fine if I unset CMAKE_BUILD_TYPE
. Also approach with plain Makefiles instead of CMake works as well, even with optimizations enabled (-O2 -g
).
Relevant logs and/or screenshots
Compilation verbose log:
/usr/bin/cmake -S/tmp/openCARP -B/tmp/openCARP/_build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /tmp/openCARP/_build/CMakeFiles /tmp/openCARP/_build/CMakeFiles/progress.marks
/usr/bin/gmake -f CMakeFiles/Makefile2 all
gmake[1]: Entering directory '/tmp/openCARP/_build'
/usr/bin/gmake -f param/CMakeFiles/param.dir/build.make param/CMakeFiles/param.dir/depend
gmake[2]: Entering directory '/tmp/openCARP/_build'
cd /tmp/openCARP/_build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /tmp/openCARP /tmp/openCARP/param /tmp/openCARP/_build /tmp/openCARP/_build/param /tmp/openCARP/_build/param/CMakeFiles/param.dir/DependInfo.cmake --color=
Dependee "/tmp/openCARP/_build/param/CMakeFiles/param.dir/DependInfo.cmake" is newer than depender "/tmp/openCARP/_build/param/CMakeFiles/param.dir/depend.internal".
Dependee "/tmp/openCARP/_build/param/CMakeFiles/CMakeDirectoryInformation.cmake" is newer than depender "/tmp/openCARP/_build/param/CMakeFiles/param.dir/depend.internal".
Scanning dependencies of target param
gmake[2]: Leaving directory '/tmp/openCARP/_build'
/usr/bin/gmake -f param/CMakeFiles/param.dir/build.make param/CMakeFiles/param.dir/build
gmake[2]: Entering directory '/tmp/openCARP/_build'
[ 0%] Building CXX object param/CMakeFiles/param.dir/src/arg_code.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/arg_code.cc.o -c /tmp/openCARP/param/src/arg_code.cc
[ 1%] Building CXX object param/CMakeFiles/param.dir/src/build_c.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/build_c.cc.o -c /tmp/openCARP/param/src/build_c.cc
[ 2%] Building CXX object param/CMakeFiles/param.dir/src/build_xml.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/build_xml.cc.o -c /tmp/openCARP/param/src/build_xml.cc
[ 2%] Building CXX object param/CMakeFiles/param.dir/src/build_dummy.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/build_dummy.cc.o -c /tmp/openCARP/param/src/build_dummy.cc
[ 3%] Building CXX object param/CMakeFiles/param.dir/src/build_f.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/build_f.cc.o -c /tmp/openCARP/param/src/build_f.cc
[ 4%] Building CXX object param/CMakeFiles/param.dir/src/build_make.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/build_make.cc.o -c /tmp/openCARP/param/src/build_make.cc
[ 4%] Building CXX object param/CMakeFiles/param.dir/src/build_mex.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/build_mex.cc.o -c /tmp/openCARP/param/src/build_mex.cc
[ 5%] Building CXX object param/CMakeFiles/param.dir/src/c_code.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/c_code.cc.o -c /tmp/openCARP/param/src/c_code.cc
[ 6%] Building CXX object param/CMakeFiles/param.dir/src/common_code.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/common_code.cc.o -c /tmp/openCARP/param/src/common_code.cc
[ 6%] Building CXX object param/CMakeFiles/param.dir/src/compiled.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/compiled.cc.o -c /tmp/openCARP/param/src/compiled.cc
[ 7%] Building CXX object param/CMakeFiles/param.dir/src/declare_code.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/declare_code.cc.o -c /tmp/openCARP/param/src/declare_code.cc
[ 8%] Building CXX object param/CMakeFiles/param.dir/src/display.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/display.cc.o -c /tmp/openCARP/param/src/display.cc
[ 8%] Building CXX object param/CMakeFiles/param.dir/src/ex_p.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/ex_p.cc.o -c /tmp/openCARP/param/src/ex_p.cc
[ 9%] Building CXX object param/CMakeFiles/param.dir/src/file_code.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/file_code.cc.o -c /tmp/openCARP/param/src/file_code.cc
[ 10%] Building CXX object param/CMakeFiles/param.dir/src/header_code.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/header_code.cc.o -c /tmp/openCARP/param/src/header_code.cc
[ 11%] Building CXX object param/CMakeFiles/param.dir/src/lex.yy.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/lex.yy.cc.o -c /tmp/openCARP/param/src/lex.yy.cc
[ 11%] Building CXX object param/CMakeFiles/param.dir/src/libparam.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/libparam.cc.o -c /tmp/openCARP/param/src/libparam.cc
[ 12%] Building CXX object param/CMakeFiles/param.dir/src/param_code.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/param_code.cc.o -c /tmp/openCARP/param/src/param_code.cc
[ 13%] Building CXX object param/CMakeFiles/param.dir/src/restructure.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/restructure.cc.o -c /tmp/openCARP/param/src/restructure.cc
[ 13%] Building CXX object param/CMakeFiles/param.dir/src/usage_code.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/usage_code.cc.o -c /tmp/openCARP/param/src/usage_code.cc
[ 14%] Building CXX object param/CMakeFiles/param.dir/src/valid_code.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/valid_code.cc.o -c /tmp/openCARP/param/src/valid_code.cc
[ 15%] Building CXX object param/CMakeFiles/param.dir/src/y.tab.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -I/tmp/openCARP/param/src -O3 -DNDEBUG -o CMakeFiles/param.dir/src/y.tab.cc.o -c /tmp/openCARP/param/src/y.tab.cc
[ 15%] Linking CXX static library libparam.a
cd /tmp/openCARP/_build/param && /usr/bin/cmake -P CMakeFiles/param.dir/cmake_clean_target.cmake
cd /tmp/openCARP/_build/param && /usr/bin/cmake -E cmake_link_script CMakeFiles/param.dir/link.txt --verbose=1
/usr/bin/ar qc libparam.a CMakeFiles/param.dir/src/arg_code.cc.o CMakeFiles/param.dir/src/build_c.cc.o CMakeFiles/param.dir/src/build_xml.cc.o CMakeFiles/param.dir/src/build_dummy.cc.o CMakeFiles/param.dir/src/build_f.cc.o CMakeFiles/param.dir/src/build_make.cc.o CMakeFiles/param.dir/src/build_mex.cc.o CMakeFiles/param.dir/src/c_code.cc.o CMakeFiles/param.dir/src/common_code.cc.o CMakeFiles/param.dir/src/compiled.cc.o CMakeFiles/param.dir/src/declare_code.cc.o CMakeFiles/param.dir/src/display.cc.o CMakeFiles/param.dir/src/ex_p.cc.o CMakeFiles/param.dir/src/file_code.cc.o CMakeFiles/param.dir/src/header_code.cc.o CMakeFiles/param.dir/src/lex.yy.cc.o CMakeFiles/param.dir/src/libparam.cc.o CMakeFiles/param.dir/src/param_code.cc.o CMakeFiles/param.dir/src/restructure.cc.o CMakeFiles/param.dir/src/usage_code.cc.o CMakeFiles/param.dir/src/valid_code.cc.o CMakeFiles/param.dir/src/y.tab.cc.o
/usr/bin/ranlib libparam.a
gmake[2]: Leaving directory '/tmp/openCARP/_build'
[ 15%] Built target param
/usr/bin/gmake -f param/CMakeFiles/param-bin.dir/build.make param/CMakeFiles/param-bin.dir/depend
gmake[2]: Entering directory '/tmp/openCARP/_build'
cd /tmp/openCARP/_build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /tmp/openCARP /tmp/openCARP/param /tmp/openCARP/_build /tmp/openCARP/_build/param /tmp/openCARP/_build/param/CMakeFiles/param-bin.dir/DependInfo.cmake --color=
Dependee "/tmp/openCARP/_build/param/CMakeFiles/param-bin.dir/DependInfo.cmake" is newer than depender "/tmp/openCARP/_build/param/CMakeFiles/param-bin.dir/depend.internal".
Dependee "/tmp/openCARP/_build/param/CMakeFiles/CMakeDirectoryInformation.cmake" is newer than depender "/tmp/openCARP/_build/param/CMakeFiles/param-bin.dir/depend.internal".
Scanning dependencies of target param-bin
gmake[2]: Leaving directory '/tmp/openCARP/_build'
/usr/bin/gmake -f param/CMakeFiles/param-bin.dir/build.make param/CMakeFiles/param-bin.dir/build
gmake[2]: Entering directory '/tmp/openCARP/_build'
[ 16%] Building CXX object param/CMakeFiles/param-bin.dir/src/param.cc.o
cd /tmp/openCARP/_build/param && /usr/bin/c++ -D_GNU_SOURCE -I/tmp/openCARP/param/include -O3 -DNDEBUG -o CMakeFiles/param-bin.dir/src/param.cc.o -c /tmp/openCARP/param/src/param.cc
[ 17%] Linking CXX executable param
cd /tmp/openCARP/_build/param && /usr/bin/cmake -E cmake_link_script CMakeFiles/param-bin.dir/link.txt --verbose=1
/usr/bin/c++ -O3 -DNDEBUG CMakeFiles/param-bin.dir/src/param.cc.o -o param libparam.a
gmake[2]: Leaving directory '/tmp/openCARP/_build'
[ 17%] Built target param-bin
/usr/bin/gmake -f simulator/CMakeFiles/carp.dir/build.make simulator/CMakeFiles/carp.dir/depend
gmake[2]: Entering directory '/tmp/openCARP/_build'
[ 18%] Use param to generate carp_d.h;carp_p.cc;carp_p.h from carp.prm
cd /tmp/openCARP/_build/simulator && cpp -DSOLVE_CURRENT -DWITH_BLAS -D_GNU_SOURCE -traditional /tmp/openCARP/simulator/carp.prm | awk ' ! ( /pragma/||/^# / ) ' | ../param/param - carp -ext prm -ansi
/bin/sh: line 1: 20544 Done cpp -DSOLVE_CURRENT -DWITH_BLAS -D_GNU_SOURCE -traditional /tmp/openCARP/simulator/carp.prm
20545 | awk ' ! ( /pragma/||/^# / ) '
20546 Segmentation fault | ../param/param - carp -ext prm -ansi
gmake[2]: *** [simulator/CMakeFiles/carp.dir/build.make:87: simulator/carp_d.h] Error 139
gmake[2]: *** Deleting file 'simulator/carp_d.h'
gmake[2]: Leaving directory '/tmp/openCARP/_build'
gmake[1]: *** [CMakeFiles/Makefile2:440: simulator/CMakeFiles/carp.dir/all] Error 2
gmake[1]: Leaving directory '/tmp/openCARP/_build'
gmake: *** [Makefile:172: all] Error 2
Possible fixes
At first I checked if disabling optimizations just for param
target works. I added the following line to param/CMakeLists.txt
:
target_compile_options(param PRIVATE "-O0")
With this line the whole project compiles without any problems.
Later I tried to trace down the specific file which causes the problem. After few iterations I found that disabling optimization just for one file param/src/libparam.cc
fixes the problem too:
set_source_files_properties(src/libparam.cc PROPERTIES COMPILE_FLAGS -O0)