符号检查很重要

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值