在GCC中编写SIGSEGV代码,但不在Clang中
Code making SIGSEGV in GCC but not Clang
当使用GCC(4.7.2-5ubuntu)而不是Clang(Apple LLVM 4.2)编译时,此代码在运行时生成SIGSEGV
#include <functional>
#include <iostream>
using FuncType = std::function<int(int)>;
int func(FuncType f, int i) {
return f(i)+1;
}
struct Alpha {
FuncType f, g;
Alpha(FuncType f) : f(f) {
g = [&](int i) -> int {
return func(f, i);
};
}
int go(int i) {
return g(i);
}
};
struct Beta {
int k = 0;
Beta newBeta(int nk) {
Beta beta = *this;
beta.k = nk;
return beta;
}
};
struct Gamma {
Beta beta;
void go(int j) {
auto f = [&](int i) -> int {
int n = beta.newBeta(i).k+j;
return n*n;
};
Alpha alpha(f);
std::cout << alpha.go(beta.k) << std::endl;
}
};
int main(int argc, char *argv[]) {
Gamma gamma;
gamma.go(7);
return 0;
}
调试时,在func
中调用lambda f
时会发生崩溃。beta
报告为无效对象,即使在调用lambda时它应该仍然有效。
看起来这似乎是这个错误的结果,但据报道,这个错误在4.7.2中得到了修复。
编辑:为清晰起见,已初始化Beta::k
,不影响bug。
这里有一个问题:
Alpha(FuncType f) : f(f) {
g = [&](int i) -> int {
return func(f, i);
};
}
您的lambda通过引用绑定f
(构造函数的一个参数,因此是构造函数的本地参数),因此在构造函数完成后,该引用将挂起。当您稍后调用g
时,会得到未定义的行为,因为它引用了这个悬空引用。
将[&]
更改为[=]
以按值绑定,它应该是可以的。
相关文章:
- 奇怪的结构&GCC&clang(void*返回类型)
- 数据成员SFINAE的C++17测试:gcc vs clang
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- Clang bug?使用指针作为模板参数
- clang整洁10忽略了我的NOLINT命令
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在clang++预处理器中确定gcc工具链版本
- 为什么 Clang 不允许"and"作为函数名称?
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- clang格式:宏的缩进
- CLANG 编译器 说:变量"PTR"可能未初始化
- clang格式:禁用排序包含
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 循环展开 - G++ 与 Clang++
- 引发异常导致OSX 10.11.4+clang上的SIGSEGV
- 在GCC中编写SIGSEGV代码,但不在Clang中