为什么所有C++编译器都会崩溃或挂起此代码
Why do all C++ compilers crash or hang from this code?
当我测试过的每一个C++编译器编译时,以下代码都会崩溃或挂起,直到内存耗尽:
#include <tuple>
template<class... Ts>
auto f(Ts... ts){
return f(std::make_tuple(ts...));
}
auto a = f();
在GCC、Clang、MSVC、icc、ELLCC的各种版本上进行测试:https://godbolt.org/z/cwqiZK
我的问题是,为什么这些编译器没有实现模板深度限制或类似的安全性?我发现了一些代码示例,比如这个旧示例,会导致编译器挂起,但自从限制模板实例化深度成为标准以来,我能找到的所有问题似乎都得到了解决。
我应该注意,这不是make_tuple
独有的,适用于tie
、forward_as_tuple
。。。等
作为警告,如果您尝试在本地编译,请确保使用类似ulimit
的东西来确保编译器不会耗尽您的内存。在玩这个游戏的时候,我不得不硬重启几次。
GCC没有实现所有可能的可变函数模板递归检测方法(或者可能没有实现任何方法?(,这可能是由于评论中提出的各种问题。
OP示例看起来与2014年未解决的GCC错误59914非常相似(相同?(。对于GCC开发人员来说,防止此类错误,或者实际上防止此类错误在开发人员的工作站上爆发,似乎并不是一个高度优先事项。BTW-错误中报告的示例程序比OP更快地滥用内存:在800MB的数据限制下,我可以让OP进行150多次模板实例化,而错误报告中的程序在不到20次后就耗尽了内存。
这两个程序也会崩溃clang,所以我想clang开发人员有相似的优先级。
相关文章:
- 挂起和取消挂起一个文件DLL
- 如何防止C++遗留代码中的挂起指针
- 为什么所有C++编译器都会崩溃或挂起此代码
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 构建挂起,即使是适度的文件大小
- 循环挂起迭代的 std::擦除 on std::list
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 从不同进程中的另一个线程挂起/恢复线程或进程
- Boost (Beast) websocket:同步写入挂起
- 为什么析构函数挂起
- 使用互斥会挂起程序
- 在C++和 Python 程序中使用命名管道的 IPC 挂起
- 设置变量时C++程序挂起
- 第一次尝试使用new动态创建结构数组,程序挂起没有错误
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 有时ShowWindow从不调用OnShowWindow,主应用程序挂起
- 如何防止GUI挂起,同时允许第二次操作与Qt中的第一次操作一起执行
- c++ JNI在做任何IO/Streams时崩溃/挂起
- Winapi钩子通过mhook导致程序崩溃或挂起