2017-02-04 37 views
2

我追蹤了我的應用程序中最近發生的一次崩潰,導致堆棧溢出問題,並修復了問題,我想我會重新檢查代碼中是否存在類似的潛在錯誤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; 
} 

其中有問題的行是TYPE Temp = newElement;的問題是,我需要找出哪些一段代碼是使用模板容器具有這樣大的元素,作爲模板本身是沒有問題的。無論如何要找出模板的哪個具體實例在這裏使用,即找出TYPE指的是什麼?

回答

6

一種方法是在模板代碼中的元素的尺寸使用static_assert,像這樣:

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

這將打破編譯在每一個地方的模板實例與一類是太到位大的堆棧。

+0

哇,什麼技術! –

+0

謝謝dasblinkenlight,正是我在找的東西。 –

+1

只需爲上面的MSVC用戶添加註釋,您需要查看文本輸出窗口以獲取所需的詳細信息,因爲錯誤列表中的數據是縮寫的,並且不包含TYPE的特定值。 –

1

typeid(TYPE).name()提供了一個適用於調試的字符串,通常是根據ABI名稱 - 規則規則的類型名稱。