Coverity - 结构类型的溢出

时间:2015-06-16 13:38:41

标签: c sockets

我通过覆盖率工具收到以下错误 -

overrun-buffer-arg:通过将结构类型in_addr传递给一个使用参数" 8UL"来访问字节偏移量为7的函数来超越4字节的结构类型in_addr。

示例代码:

static u_long   addr;
static struct   sockaddr_in remote_server;
addr = inet_addr(remote_servername);
memcpy((char *) &remote_server.sin_addr, (char *)&addr, sizeof(addr));

在最后一行,我收到了上述错误。

有人可以通过一些了解,出了什么问题。

如果您需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:2)

标准警告:不要将指针指向/ void *

对于消息:仔细阅读,它很好地说明了问题。只是一个提示:使用正确的类型。您显然正在访问超出其大小的结构。实际上你的大小有多大?

addr应该正确序列化到uint8_t [],尊重endianess。当你从第二个参数中取sizeof()时,显然第一个参数更短。

为什么不只是分配,而是使用memcpy()?检查两者的类型相同。

答案 1 :(得分:2)

inet_addr()返回in_addr_t,而不是u_long。 struct sockaddr_in的sin_addr是一个结构in_addr,它包含一个in_addr_t s_addr。

这应该可以解决问题:

static struct   sockaddr_in remote_server;
remote_server.sin_addr.s_addr = inet_addr(remote_servername);