星期一, 9月 22, 2014

HEAP CORRUPTION DETECTED


發生的時間點在delete時



原因有幾種狀況

大概都是new出來的物件中有使用到char array時

char test[5];
//正常的情況下
test = "12345";
此時delete會正常

(1)取用的字串長度剛好為5時
string str = "12345";
strcpy_s(&test, 5,str.c_str());

因為字串長度為5 copy進去test會沒有空間存放結尾符號
如果透過IDE輔助可以看到test array index 5之後會出現一些奇怪的值
與其他的記憶體連接在一起
最後在delete時刪除超過原先new出來的空間
而導致HEAP CORRUPTION DETECTED

(2)memset、ZeroMemory

做初始化常發生的粗心錯誤

//正常
memset(&test,0,5);
ZeroMemory(&test,5);

//異常
memset(&test,0,6);
ZeroMemory(&test,6);

//預防
memset(&test,0,sizeof(test));
ZeroMemory(&test,sizeof(test));

長度超過時在執行當下不會有問題
編譯時也不會報錯
可是在delete階段就會報錯HEAP CORRUPTION DETECTED



這個大概都算比較粗心的bug
在codereview階段沒有認真的下去檢查
因為填錯長度 (我自己是sizeof到類似命名struct包裝的資料結構XD)
發生crash的時候真的會找死人
如果您也到相同的問題
不妨從char array、memset及ZeroMemory下去追蹤
看是不是也是帶入的長度overflow了

星期六, 8月 23, 2014

VC++ error:MSB8020

Visual Studio報錯會顯示:
專案檔包含 ToolsVersion="12.0"。這個 Toolset 未知或遺漏。您可以為這個 Toolset 安裝適當的 .NET Framework,藉此解決這個問題。專案將被視為包含 ToolsVersion="4.0"。

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.Cpp.Platform.targets(44,5): error MSB8020: The builds tools for v120 (Platform Toolset = 'v120') cannot be found. To build using the v120 build tools, either click the Project menu or right-click the solution, and then select "Update VC++ Projects...". Install v120 to build using the v120 build tools.

這個問題是當專案升級到Visual Studio 2013,結果陰錯陽差需回到Visual Studio 2012開發時,則在建置Compile時會出現這個建置失敗的訊息。

只要重新設定一下專案屬性就可以解決此問題編譯成功。

Step1. 開啟專案屬性

Step2. 一般底下

Step3. 選擇平台工具
Visual Studio 2012 (v110) or (v110_xp)後 套用即可