为什么 lambda 在 clang 而不是 gcc 上崩溃?
why lambda crash on clang but not gcc?
此程序崩溃并发出 clang
#include <iostream>
#include <string>
#include <mutex>
#include <functional>
int main(int argc, char **argv)
{
auto m = std::function<void()>( [](){
int r = std::rand() % 100;
if (r < 50)
{
return r; //should not return
}
});
for(int i=0;i<100;i++)
m();
return 0;
}
报告:
pt@test$ clang++ -o test test1.cpp -std=c++11
test1.cpp:14:5: warning: control may reach end of non-void lambda [-Wreturn-type]
});
^
1 warning generated.
pt@test$ ./test
Illegal instruction (core dumped)
但是,它不会与 g++
一起崩溃。
我的困惑是,既然会导致崩溃,为什么不clang
在编译时将其视为错误?
更新
考虑以下代码
auto lMayNotReturn = []() {
int rValue = std::rand() % 100;
if (rValue < 50)
{
return rValue; //should not return
}
std::cout << " non-return rValue: " << rValue << std::endl;
};
for(int i=0 ; i< 30;i++){
int rValue= lMayNotReturn();
std::cout << "random value " << rValue << " ";
if (rValue >= 50) {
std::cout << " ???undefined???";
}
std::cout << std::endl;
}
std::cout << "end--------" << std::endl;
由 gcc
和 visual studio
生成的目标将保持 运行 和 return 随机值 为
pt@DESKTOP-S54JIQA:/mnt/e/Projects/uv_test$ ./test
non-return rValue: 83
random value 6295680 ???undefined???
non-return rValue: 86
random value 6295680 ???undefined???
non-return rValue: 77
random value 6295680 ???undefined???
像这样的错误比简单的崩溃和 clang wins 更难追踪。
我能想到的 clang
没有引发错误的唯一原因是兼容性。
因为这是未定义的行为。对于 return statement:
Flowing off the end of a value-returning function (except main) without a return statement is undefined behavior.
这意味着编译器可以做任何事情;他们不需要报错(或不报错)。
此程序崩溃并发出 clang
#include <iostream>
#include <string>
#include <mutex>
#include <functional>
int main(int argc, char **argv)
{
auto m = std::function<void()>( [](){
int r = std::rand() % 100;
if (r < 50)
{
return r; //should not return
}
});
for(int i=0;i<100;i++)
m();
return 0;
}
报告:
pt@test$ clang++ -o test test1.cpp -std=c++11
test1.cpp:14:5: warning: control may reach end of non-void lambda [-Wreturn-type]
});
^
1 warning generated.
pt@test$ ./test
Illegal instruction (core dumped)
但是,它不会与 g++
一起崩溃。
我的困惑是,既然会导致崩溃,为什么不clang
在编译时将其视为错误?
更新
考虑以下代码
auto lMayNotReturn = []() {
int rValue = std::rand() % 100;
if (rValue < 50)
{
return rValue; //should not return
}
std::cout << " non-return rValue: " << rValue << std::endl;
};
for(int i=0 ; i< 30;i++){
int rValue= lMayNotReturn();
std::cout << "random value " << rValue << " ";
if (rValue >= 50) {
std::cout << " ???undefined???";
}
std::cout << std::endl;
}
std::cout << "end--------" << std::endl;
由 gcc
和 visual studio
生成的目标将保持 运行 和 return 随机值 为
pt@DESKTOP-S54JIQA:/mnt/e/Projects/uv_test$ ./test
non-return rValue: 83
random value 6295680 ???undefined???
non-return rValue: 86
random value 6295680 ???undefined???
non-return rValue: 77
random value 6295680 ???undefined???
像这样的错误比简单的崩溃和 clang wins 更难追踪。
我能想到的 clang
没有引发错误的唯一原因是兼容性。
因为这是未定义的行为。对于 return statement:
Flowing off the end of a value-returning function (except main) without a return statement is undefined behavior.
这意味着编译器可以做任何事情;他们不需要报错(或不报错)。