Ошибка сегментации при сравнении std :: system_error :: code () и std :: errc :: invalid_argument - PullRequest
1 голос
/ 20 сентября 2019

Мне нужно было проверить код ошибки std::system_error, выполняющей мой проект.Но когда я сделал это, я получил SIGSEGV.

foo.cpp:

#include <thread>
#include <iostream>
#include <system_error>

int main(void)
{
    std::thread t1;

    try
    {
        t1.join();
    }
    catch (const std::system_error& e)
    {
        std::cout << "System error\n";

        if (e.code() == std::errc::invalid_argument) // here in the operator==(), running into SIGSEGV 
        {
            std::cout << e.what() << "\n";
        }
        else
        {
            throw;
        }
    }

    return 0;
}

Makefile:

.PHONY: all clean

all: foo

SRCS := $(shell find . -name '*.cpp')
OBJS := $(SRCS:.cpp=.o)

foo: $(OBJS)
        gcc -o $@ $^ -lstdc++ -lpthread

%.o: %.cpp
        gcc -std=c++17 -Wall -c -g -O0 -pthread -o $@ $<

clean:
        rm -rf foo *.o

Моя версия gcc:

$ gcc --version
gcc (GCC) 7.2.1 20170829 (Red Hat 7.2.1-1)
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Когда я публиковал этот вопрос, StackOverflow предлагал похожие вопросы.Одним из них является Как переносимо сравнить исключения std :: system_error со значениями std :: errc? .То, что описано в нем, казалось, тесно связано с проблемой, которую я рассматриваю.Поэтому я проверил gcc 8.3, который был в списке исправленных версий gcc.

Исправлено во всех активных ветвях, поэтому будет исправлено в версиях 6.5, 7.4, 8.3 и 9.1.

Но, похоже, он все еще не исправлен, или это просто еще одна проблема:

$ gcc --version
gcc (GCC) 8.3.1 20190311 (Red Hat 8.3.1-3)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ make
gcc -std=c++17 -Wall -c -g -O0 -pthread -o foo.o foo.cpp
gcc -o foo foo.o -lstdc++ -lpthread

$ ./foo
System error
Segmentation fault (core dumped)

Любые идеи, позволяющие обойти эту проблему и определить, какая это ошибка на самом деле, когда system_error происходит?


Редактировать: Добавление информации о трассировке с помощью gdb

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000003603269ca2 in std::error_category::equivalent(std::error_code const&, int) const () from /usr/lib64/libstdc++.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.192.el6.x86_64 libgcc-4.4.7-17.el6.x86_64 libstdc++-4.4.7-17.el6.x86_64
(gdb) where
#0  0x0000003603269ca2 in std::error_category::equivalent(std::error_code const&, int) const () from /usr/lib64/libstdc++.so.6
#1  0x000000000040285f in std::operator== (__lhs=..., __rhs=...) at /opt/rh/devtoolset-7/root/usr/include/c++/7/system_error:299
#2  0x0000000000402628 in main () at foo.cpp:17

1 Ответ

1 голос
/ 25 сентября 2019

Кажется, что различие между версией набора инструментов gcc, которую я использовал, и версией, на которой построен libstdc ++, является виновником.

C ++ проект, скомпилированный с помощью современного компилятора, но связанный с устаревшей libstdc ++

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91876

Что касается http://coliru.stacked -crooked.com / a / 34662c9678a39e10 , который показывает результат, который не дает сбоя, я думаю, что он не имелпроблема из-за совпадения версий библиотеки и компилятора.

...