老马失前蹄,阴沟里翻船了

哈哈,记录下逗比的事。

段错误代码:

/* 消息结构体 */
typedef struct _message_
{
		uint headSign;										// 消息标识头
		uint type;											// 消息类型
		uint len;											// 消息内容长度
		char* data;
} MESSAGE_T, *MESSAGE_PT;

int SSend::send_msg(char* buf, int len, int type)
{
	int msglen = len;
	if (buf && len < 0)
	{
		printf("buf not null,but len less than 0\n");
		return -1;
	}

	if (!buf)
	{
		msglen = 0;
	}
	
	MESSAGE_T* msg = (MESSAGE_T*)calloc(1, sizeof(MESSAGE_T) + msglen);
	
	msg->headSign = DEFAULT_HEAD_SIGN;
	msg->type = type;
	msg->len = msglen;
	if (msglen > 0)
	{
		memcpy(msg->data, buf, msglen);
	}
	m_client->sendDataByTcp(m_sessionid, (char*)msg, 3*sizeof(unsigned) + msglen);
	free (msg);
	msg = NULL;
	return 0;
}

定睛一看:发现这个这个bug这MESSAGE_T里面的char* data是个指针,用错了。data不是这个结构体的结束处的指针。是一个野指针。

正确做法:

/* 消息结构体 */
typedef struct _message_
{
		uint headSign;										// 消息标识头
		uint type;											// 消息类型
		uint len;											// 消息内容长度
		char data[1];
} MESSAGE_T, *MESSAGE_PT;
int SSend::send_msg(char* buf, int len, int type)
{
	int msglen = len;
	
	if (buf && len < 0)
	{
		printf("buf not null,but len less than 0\n");
		return -1;
	}

	if (!buf)
	{
		msglen = 0;
	}
	
	MESSAGE_T* msg = (MESSAGE_T*)calloc(1, sizeof(MESSAGE_T) + msglen);
	
	msg->headSign = DEFAULT_HEAD_SIGN;
	msg->type = type;
	msg->len = msglen;
	if (msglen > 0)
	{
		memcpy(msg->data, buf, msglen);
	}
	m_client->sendDataByTcp(m_sessionid, (char*)msg, 3*sizeof(unsigned) + msglen);
	free (msg);
	msg = NULL;
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值