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

2022-04-12 00:00:00 stack-overflow templates c++

我将应用程序中最近的一次崩溃跟踪为堆栈溢出问题,修复了该问题后,我想我应该使用Visual Studio代码分析工具重新检查代码中是否有任何类似的潜在错误。这发现了许多可能与报告类似的案例,如

警告C6262函数使用‘148140’个字节的堆栈:超过 /Analyze:堆栈大小为‘16384’。考虑将一些数据移动到 堆。SCCW-VC2015 c:cppaclCommonacltainer.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;

这将在模板实例化的每个位置中断编译,该模板的类型对于堆栈来说太大。

相关文章