bool fill_something(void* buf, int len)
{
const int MAX_LEN = 256;
char mybuf[MAX_LEN];
if(len > MAX_LEN)
{
return false;
}
memcpy(mybuf, buf, len);
return true;
}
bool copy_two_buff(char* buf1, unsigned int len1, char* buf2, unsigned int len2 )
{
char mybuf[256];
if( len1 + len2 > 256 )
{
return false;
}
memcpy(mybuf, buf1, len1);
memcpy(mybuf + len1, buf2, len2);
return true;
}
// 以上两个代码看起来似乎很正常吧,也是常见的写法,但是....会crash哦!!!
void OnRecvData(void* data, int data_size);
int random(int Min, int Max)
{
return rand() % (Max - Min + 1) + Min;
}
int _tmain(int argc, _TCHAR* argv[])
{
char mybuf[256];
int testid = random(1, 3);
switch(testid)
{
case 1:
fill_something(mybuf, -5);
break;
case 2:
*((int*)mybuf) = -10;
OnRecvData(mybuf, sizeof(mybuf));
break;
case 3:
{
char buf2[256];
copy_two_buff(mybuf, -10, buf2, 50);
}
break;
}
system("pause");
return 0;
}
// 再来个常见的网络相关的代码实例
void OnRecvData(void* data, int data_size)
{
int pack_len = *(int*)data;
if( pack_len <= data_size ) // I WILL: check field size <= net data size
{
const int MAX_LEN = 256;
char mybuf[MAX_LEN];
if(pack_len <= MAX_LEN) // I WILL: check len <= limit
{
memcpy(mybuf, data, pack_len); // crash
}
}
}
参考资料: http://coolshell.cn/articles/11466.html