c++ - 查找模板中潜在的堆栈溢出问题

标签 c++ templates stack-overflow

我将我的应用程序中最近的一次崩溃归因于堆栈溢出问题,在解决该问题后,我想我应该使用 visual studio 代码分析工具重新检查代码是否存在任何类似的潜在错误。这发现了许多可能的类似案例,并有一份报告,例如

Warning C6262 Function uses '148140' bytes of stack: exceeds /analyze:stacksize '16384'. Consider moving some data to heap. SCCW-VC2015 c:\cpp\aclcommon\aclcontainer.h

当我查看代码时,它会将我带到以下模板函数;

template<class TYPE, class ARG_TYPE, class INDEX>
inline INDEX CContainerBase<TYPE, ARG_TYPE, INDEX>::Add(ARG_TYPE newElement)
{ 
    TYPE Temp = newElement; 
    INDEX nIndex = GetSize();
    SetSize(nIndex  + 1);
    SetAt(nIndex,Temp);
    return nIndex; 
}

有问题的行是 TYPE Temp = newElement; 问题是我需要找出哪段代码正在使用具有如此大元素的模板化容器,因为模板本身不是问题。有没有办法找出这里使用的模板的具体实例化,即找出 TYPE 指的是什么?

最佳答案

一种方法是使用 static_assert关于模板代码中元素的大小,如下所示:

static_assert(sizeof(TYPE) < 16384, "Object is too large for the stack");
TYPE Temp = newElement;

这会在模板被实例化为对于堆栈来说太大的类型的每个地方中断编译。

关于c++ - 查找模板中潜在的堆栈溢出问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42040959/

相关文章:

java - 与 Bunnies Stack OverFlow 一起运行的 Google Foobar Level 4

c++ - 为什么在这里使用 int64_t 错误并编译 int?

c++ - const char 变量的问题

c++和lua-如何开始?

c++ - 我什么时候应该在现代 C++ 中使用(非头文件)源文件?

c++ - SFINAE 重载,必须考虑哪些规则

java - 定义包含 main() 方法的同一类的实例变量时出现 StackOverflowError

c++ - 为什么不能创建空类的 const 对象

templates - 在 Golang 中结合使用模板 block 和模板函数

c - 关于栈溢出的练习