trafficserver icon indicating copy to clipboard operation
trafficserver copied to clipboard

Fedora 36 build issue with catch.hpp

Open bryancall opened this issue 3 years ago • 5 comments

I get this error with gcc 12.1.1 on Fedora 36. We are using catch 2.13.8 and I tried upgrading to 2.13.9, but that didn't help. I am able to get around this issue if I make this modification to catch.hpp:

Patch:

+#pragma GCC diagnostic error "-Wmaybe-uninitialized"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
 #include <functional>
+#pragma GCC diagnostic pop
+#pragma GCC diagnostic pop

Compiler error:

  CXX      unit_tests/freelist_benchmark-freelist_benchmark.o
In file included from /usr/include/c++/12/functional:59,
                 from /home/bcall/dev/apache/trafficserver/build-Linux_gcc/../tests/include/catch.hpp:3483,
                 from ../../../src/tscore/unit_tests/freelist_benchmark.cc:25:
In constructor ‘std::function<_Res(_ArgTypes ...)>::function(std::function<_Res(_ArgTypes ...)>&&) [with _Res = bool; _ArgTypes = {char}]’,
    inlined from ‘std::__detail::_State<_Char_type>::_State(std::__detail::_State<_Char_type>&&) [with _Char_type = char]’ at /usr/include/c++/12/bits/regex_automaton.h:149:4,
    inlined from ‘std::__detail::_State<_Char_type>::_State(std::__detail::_State<_Char_type>&&) [with _Char_type = char]’ at /usr/include/c++/12/bits/regex_automaton.h:146:7,
    inlined from ‘std::__detail::_StateIdT std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_end() [with _TraitsT = std::__cxx11::regex_traits<char>]’ at /usr/include/c++/12/bits/regex_automaton.h:290:24:
/usr/include/c++/12/bits/std_function.h:405:42: error: ‘*(std::function<bool(char)>*)((char*)&__tmp + offsetof(std::__detail::_StateT, std::__detail::_State<char>::<unnamed>.std::__detail::_State_base::<unnamed>)).std::function<bool(char)>::_M_invoker’ may be used uninitialized [-Werror=maybe-uninitialized]
  405 |       : _Function_base(), _M_invoker(__x._M_invoker)
      |                                      ~~~~^~~~~~~~~~
In file included from /usr/include/c++/12/regex:63,
                 from /home/bcall/dev/apache/trafficserver/build-Linux_gcc/../tests/include/catch.hpp:11706:
/usr/include/c++/12/bits/regex_automaton.h: In member function ‘std::__detail::_StateIdT std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_end() [with _TraitsT = std::__cxx11::regex_traits<char>]’:
/usr/include/c++/12/bits/regex_automaton.h:287:17: note: ‘__tmp’ declared here
  287 |         _StateT __tmp(_S_opcode_subexpr_end);
      |                 ^~~~~
In member function ‘bool std::_Function_base::_M_empty() const’,
    inlined from ‘std::function<_Res(_ArgTypes ...)>::operator bool() const [with _Res = bool; _ArgTypes = {char}]’ at /usr/include/c++/12/bits/std_function.h:574:25,
    inlined from ‘std::function<_Res(_ArgTypes ...)>::function(std::function<_Res(_ArgTypes ...)>&&) [with _Res = bool; _ArgTypes = {char}]’ at /usr/include/c++/12/bits/std_function.h:407:6,
    inlined from ‘std::__detail::_State<_Char_type>::_State(std::__detail::_State<_Char_type>&&) [with _Char_type = char]’ at /usr/include/c++/12/bits/regex_automaton.h:149:4,
    inlined from ‘std::__detail::_State<_Char_type>::_State(std::__detail::_State<_Char_type>&&) [with _Char_type = char]’ at /usr/include/c++/12/bits/regex_automaton.h:146:7,
    inlined from ‘std::__detail::_StateIdT std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_end() [with _TraitsT = std::__cxx11::regex_traits<char>]’ at /usr/include/c++/12/bits/regex_automaton.h:290:24:
/usr/include/c++/12/bits/std_function.h:247:37: error: ‘*(const std::_Function_base*)((char*)&__tmp + offsetof(std::__detail::_StateT, std::__detail::_State<char>::<unnamed>.std::__detail::_State_base::<unnamed>)).std::_Function_base::_M_manager’ may be used uninitialized [-Werror=maybe-uninitialized]
  247 |     bool _M_empty() const { return !_M_manager; }
      |                                     ^~~~~~~~~~
/usr/include/c++/12/bits/regex_automaton.h: In member function ‘std::__detail::_StateIdT std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_end() [with _TraitsT = std::__cxx11::regex_traits<char>]’:
/usr/include/c++/12/bits/regex_automaton.h:287:17: note: ‘__tmp’ declared here
  287 |         _StateT __tmp(_S_opcode_subexpr_end);
      |                 ^~~~~
cc1plus: all warnings being treated as errors

bryancall avatar May 12 '22 21:05 bryancall

In case this is helpful, building with the ATS CI's fedora:36 image completes successfully. To reproduce this locally:

docker pull ci.trafficserver.apache.org/ats/fedora:36
docker run --name build_fedora_36 -it ci.trafficserver.apache.org/ats/fedora:36 /bin/bash

# Now, from within the container:

cd /var/tmp
git clone https://github.com/apache/trafficserver.git
cd trafficserver/

autoreconf -fiv
./configure --with-openssl=/opt/openssl-quic --enable-experimental-plugins --enable-example-plugins --prefix=/tmp/ats/ --enable-werror --enable-debug --enable-wccp --enable-luajit --enable-ccache
make -j4 V=1 Q=
make -j 2 check VERBOSE=Y V=1
make install
/tmp/ats/bin/traffic_server -K -k -R 1

Update

btw: not saying that the issue you're seeing isn't valid. But it's good that the ats/fedora:36 docker image based on the fedora:36 works. I've switched our CI system to use fedora:36 to keep those builds clean rather than have a PR break it while we investigate this.

bneradt avatar May 13 '22 16:05 bneradt

@bneradt debug builds and using /opt/openssl work for me too. I get error with test_tscore failing if I use openssl3 (the system's openssl lib). Also, I get build failures doing the non-debug build with the docker container.

Steps to get the non-debug build to fail:

docker pull ci.trafficserver.apache.org/ats/fedora:36
docker run --name build_fedora_36 -it ci.trafficserver.apache.org/ats/fedora:36 /bin/bash

# Now, from within the container:
cd /var/tmp
git clone https://github.com/apache/trafficserver.git
cd trafficserver/

autoreconf -if
./configure --with-openssl=/opt/openssl-quic --enable-experimental-plugins --enable-example-plugins --prefix=/tmp/ats/ --enable-werror --enable-wccp --enable-luajit --enable-ccache
make -j

bryancall avatar May 13 '22 18:05 bryancall

Doing a simple catch test works:

12:07:38 zeus:(master)~/files/src/c/test_code$ cat catch.cc
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
#include <fmt/core.h>

TEST_CASE("test", "test")
{
  REQUIRE(1 == 1);
  fmt::print("hello world\n");
}
12:07:47 zeus:(master)~/files/src/c/test_code$ g++ -O3 -lfmt catch.cc && ./a.out
hello world
===============================================================================
All tests passed (1 assertion in 1 test case)

bryancall avatar May 13 '22 19:05 bryancall

gcc 12.2.1 got available on fedora36, and I don't see the error with it.

maskit avatar Aug 29 '22 03:08 maskit

I confirmed the issue is resolved. I followed the steps above (non-debug build with the docker image) to reproduce the error, and the error disappeared after I ran dnf update gcc.

maskit avatar Aug 29 '22 06:08 maskit