gpt4 book ai didi

c++ - 系统调用参数 socketcall.recvfrom(buf) 指向不可寻址的字节

转载 作者:行者123 更新时间:2023-11-30 05:43:19 25 4
gpt4 key购买 nike

<分区>

运行此方法时,我在调用 socket.getBytes 时从 Valgrind 收到错误消息

void Client::register(VMap::VType type, char *id)
{
const int sizeOfType = sizeof(type);
char *buffer = (char *) malloc(sizeOfType);
memcpy(buffer, &type, sizeOfType);
socket.send(buffer, sizeOfType);
sleep(1);
char *bufferRecv = (char *) malloc(sizeOfType);
memset(bufferRecv, 0 ,sizeOfType);
int size = socket.getBytes(bufferRecv);

free(buffer);
free(bufferRecv);
}


int Socket::getBytes(char *buf)
{
int ret = ::recv(m_sock, buf, MAXRECV, 0);

return ret;
}

错误是:

==30653== Syscall param socketcall.recvfrom(buf) points to unaddressable byte(s)
==30653== at 0x58C214C: recv (recv.c:34)
==30653== by 0x4E47B84: pippo::Socket::getBytes(char*) (Socket.cpp:115)
==30653== by 0x4E48BAE: pippo::Rossi::register(pippo::sMap::Type, char*) (Rossi.cpp:80)
==30653== by 0x4E48EEE: pippo::Rossi::initsMap(std::string) (Rossi.cpp:111)
==30653== by 0x4E486B0: pippo::Rossi::Rossi(std::string, std::string, std::string, unsigned int) (Rossi.cpp:54)
==30653== by 0x4E45884: test::TestRossi::testConstructor() (TestRossi.cpp:70)
==30653== by 0x4E456D8: test::TestRossi::testBody() (TestRossi.cpp:48)
==30653== by 0x5288D03: test::TestUnit::test() (TestUnit.cpp:42)
==30653== by 0x5288513: test::TestRunner::run() (TestRunner.cpp:44)
==30653== by 0x407F26: main (TestDUMBO.cpp:125)
==30653== Address 0x67a9d64 is 0 bytes after a block of size 4 alloc'd
==30653== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30653== by 0x4E48B21: pippo::Rossi::register(pippo::sMap::Type, char*) (Rossi.cpp:76)
==30653== by 0x4E48EEE: pippo::Rossi::initsMap(std::string) (Rossi.cpp:111)
==30653== by 0x4E486B0: pippo::Rossi::Rossi(std::string, std::string, std::string, unsigned int) (Rossi.cpp:54)
==30653== by 0x4E45884: test::TestRossi::testConstructor() (TestRossi.cpp:70)
==30653== by 0x4E456D8: test::TestRossi::testBody() (TestRossi.cpp:48)
==30653== by 0x5288D03: test::TestUnit::test() (TestUnit.cpp:42)
==30653== by 0x5288513: test::TestRunner::run() (TestRunner.cpp:44)
==30653== by 0x407F26: main (TestDUMBO.cpp:125)

我真的不明白哪里出了问题。例如,如果我使用 sprintf 简单地在 bufferRecv 中写入,我不会收到任何错误。

::recv 的原型(prototype)如下:

/* Read N bytes into BUF from socket FD.
Returns the number read or -1 for errors.

This function is a cancellation point and therefore not marked with
__THROW. */
extern ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);

编辑 另一个信息:如果我像这样声明缓冲区 char bufferRecv[4]; 我不会从 Valgrind 收到任何错误。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com