这是我今天遇到的一个bug的简化版本。
我在 M1 Mac 上使用 Homebrew clang 版本 17.0.3 编译并运行了这段代码。
异常未被捕获,程序退出并显示如下信息:
如果我从run函数中删除
编辑: 所以,我最初是通过CLion使用cmake进行编译的,它还添加了
我手动测试了它的编译,结果是:
生成的汇编文件:https://drive.google.com/drive/folders/13UKnC0mp6_3l_QULO62ts_UQHK1ZR23u?usp=share_link 我猜-O1只是简单地去除了创建向量的操作,因为添加更多的代码来确保它被保留会导致陷阱。
在run()函数内创建一个空类,该类具有打印某些内容的析构函数,也会导致同样的问题。
#include <iostream>
#include <vector>
#include <stdexcept>
void run() {
std::vector<int> v;
throw std::runtime_error("error");
}
int main() {
try {
run();
} catch (const std::exception &e) {
std::cerr << e.what() << std::endl;
return 1;
}
return 0;
}
我在 M1 Mac 上使用 Homebrew clang 版本 17.0.3 编译并运行了这段代码。
clang++ -std=c++20 -o main main.cpp
异常未被捕获,程序退出并显示如下信息:
Process finished with exit code 133 (interrupted by signal 5: SIGTRAP)
如果我从run函数中删除
std::vector<int> v;
,或者在Linux上编译它,那么它就可以工作。编辑: 所以,我最初是通过CLion使用cmake进行编译的,它还添加了
-L/opt/homebrew/opt/llvm/lib
。我手动测试了它的编译,结果是:
# works
clang++ -std=c++20 -o main main.cpp
# crashes with c++11, c++17 and c++20
clang++ -std=c++20 -O0 -o main -L/opt/homebrew/opt/llvm/lib main.cpp
# works
clang++ -std=c++20 -O1 -o main -L/opt/homebrew/opt/llvm/lib main.cpp
生成的汇编文件:https://drive.google.com/drive/folders/13UKnC0mp6_3l_QULO62ts_UQHK1ZR23u?usp=share_link 我猜-O1只是简单地去除了创建向量的操作,因为添加更多的代码来确保它被保留会导致陷阱。
在run()函数内创建一个空类,该类具有打印某些内容的析构函数,也会导致同样的问题。
-std=xxx
,其中xxx可以是c++11、c++14、c++17、c++20等,或者不同的优化级别吗?[编辑]将问题修改并将所有细节放入问题中。 - undefinedcatch (...)
,那么这个块会捕获异常吗? - undefined-std=c++-17
等吗?还有不同的优化级别,比如-O0
,-O1
,-O2
,-O3
?请编辑问题并将所有信息放入其中。 - undefined-O1
版本可以工作,但-O0
版本却不能。你能否按照之前的要求,发布一个可以工作的版本和一个不能工作的版本的生成汇编代码?但无论如何,这更像是与-L/opt/homebrew/opt/llvm/lib
选项有关的问题。 - undefined