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

Sma*_*acL 2 c++ stack-overflow templates

我追溯了我的应用程序最近崩溃的堆栈溢出问题,并解决了问题,我想我会使用visual studio代码分析工具重新检查代码中是否存在任何类似的潜在错误.这发现了一些可能类似的案例,如报告所示

警告C6262函数使用'148140'字节堆栈:超出/分析:stacksize'16384'.考虑将一些数据移动到堆中.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; 
}
Run Code Online (Sandbox Code Playgroud)

令人讨厌TYPE Temp = newElement; 的问题是问题是我需要找出哪些代码正在使用具有如此大元素的模板化容器,因为模板本身不是问题所在.反正有没有找到模板的具体实例在这里使用,即找出TYPE指的是什么?

das*_*ght 6

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

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

这将破坏模板实例化的每个地方的编译,其类型对于堆栈来说太大.