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

Finding potential stack overflow issues in templates

我将我的应用程序中最近的一次崩溃归因于堆栈溢出问题,在解决该问题后,我想我会使用 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;

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

typeid(TYPE).name() 提供适合调试的字符串,通常是根据 ABI name-mangling 规则的类型名称。