gpt4 book ai didi

c++ - 比较 std::system_error::code() 和 std::errc::invalid_argument 时出现段错误

转载 作者:行者123 更新时间:2023-11-30 04:43:50 25 4
gpt4 key购买 nike

我需要检查 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;
}

生成文件:

.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 提出了类似的问题。其中之一是 How to portably compare std::system_error exceptions to std::errc values? .其中描述的内容似乎与我正在经历的问题密切相关。所以我针对问题修复的 gcc 版本列表中的 gcc 8.3 进行了测试。

Fixed on all active branches, so will be fixed in the 6.5, 7.4, 8.3 and 9.1 releases.

但是好像还是没有修复,或者只是另一个问题:

$ 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

最佳答案

似乎我使用的 gcc 工具链版本与构建 libstdc++ 的版本之间的差异是罪魁祸首。

C++ project compiled with modern compiler, but linked against outdated libstdc++

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

至于http://coliru.stacked-crooked.com/a/34662c9678a39e10结果显示没有崩溃,我猜它没有问题,因为库和编译器版本匹配。

关于c++ - 比较 std::system_error::code() 和 std::errc::invalid_argument 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58021212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com