2010年10月18日

[心得]sprintf and snprintf and buffer overflow 補充

補充上一篇的一個小地方

假使今天我要印的目標暫存區不是靜態陣列,而是動態 new 出來的該怎麼辦?

我直接把說明寫在註解中:

// 動態產生陣列
TCHAR* pBufTemp = new TCHAR[c_BUFFER_MAX+1];
// 這邊最容易犯錯的就是對指標位置 pBufTemp 直接使用 sizeof() 來取大小
// 你永遠都只會得到一個 int 的大小
sizeBuffer = sizeof(pBufTemp);                  // 4 - size of pointer
// 實際上要得知陣列大小,必須要將元素數量乘上單一元素大小
sizeBuffer = sizeof(TCHAR) * (c_BUFFER_MAX+1);  // 18
// 而做 zero initialize 的時候才會有正確的結果
memset(pBufTemp, 0, sizeBuffer);                // do not use sizeof(pBufTemp)

// 所以需要計算出來的元素數量如下
sizeCount = (sizeof(TCHAR) * (c_BUFFER_MAX+1)) / sizeof(TCHAR); // 9
// 事實上,這個值我們直接由宣告用的常數拿取就可以了
sizeCount = c_BUFFER_MAX+1; // 9

// 以下兩種呼叫都可以安全地複製
_sntprintf(pBufTemp, c_BUFFER_MAX, _T("%s"), c_CopyString);
// ok -> has zero end.
_sntprintf_s(pBufTemp, c_BUFFER_MAX+1, c_BUFFER_MAX, _T("%s"), c_CopyString);
// ok -> has zero end.

delete [] pBufTemp;
// 記得歸還 new 出來的記憶體區塊

以上

1 則留言:

匿名 提到...

King casino slot machines for free - Vie Casino
There's always a lot 인카지노 of fun and competition to be had when playing for 퍼스트카지노 real money at a vua nhà cái real casino. From slot machines to video poker, to