gpt4 book ai didi

c++ - 为什么所有 C++ 编译器都会因为这段代码而崩溃或挂起?

转载 作者:行者123 更新时间:2023-12-03 10:03:35 25 4
gpt4 key购买 nike

当我测试过的每个 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

我的问题是为什么这不被模板深度限制或这些编译器实现的类似安全所捕获?我找到了一些代码示例, like this old example ,这会导致编译器挂起,但似乎我能找到的所有问题都已得到修复,因为它成为限制模板实例化深度的标准。

我应该注意,这不是 make_tuple 独有的。 ,适用于 tie , forward_as_tuple ... 等等。

作为警告,如果您尝试在本地编译它,请确保使用类似 ulimit 的内容。以确保编译器不会耗尽您的内存。在玩这个时,我不得不硬重启几次。

最佳答案

GCC 没有实现所有可能的可变参数函数模板递归检测方法(或者可能没有?),可能是由于评论中提出的问题的变化。
OP 示例看起来与 GCC bug 59914 非常相似(相同?)从 2014 年开始,这个问题没有解决。看起来像防止这些类型的错误,或者实际上 - 防止这些类型的错误在开发人员的工作站上爆炸 - 不是 GCC 开发人员的优先事项。顺便说一句 - 错误报告中报告的示例程序滥用内存的速度比 OP 快得多:在 800MB 的数据限制下,我可以让 OP 进行 150 多个模板实例化,而错误报告中的程序在不到 20 次后内存不足.
这两个程序也会崩溃 clang,所以我猜 clang 开发人员有类似的优先事项。

关于c++ - 为什么所有 C++ 编译器都会因为这段代码而崩溃或挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60328990/

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