Valgrind strange“;Syscall param socketcall.sendto(msg)指向未初始化的字节;

Valgrind strange“;Syscall param socketcall.sendto(msg)指向未初始化的字节;,c,valgrind,C,Valgrind,也许我完全失明或愚蠢,但我不明白我怎么会在这里遇到瓦尔格兰德问题。Valgrind给了我这个: ==3728== Syscall param socketcall.sendto(msg) points to uninitialised byte(s) ==3728== at 0x57835DC: send (send.c:33) ==3728== by 0x4058B7: CBSocketSend (CBLibEventSockets.c:287) ==3728== by 0x

也许我完全失明或愚蠢,但我不明白我怎么会在这里遇到瓦尔格兰德问题。Valgrind给了我这个:

==3728== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==3728==    at 0x57835DC: send (send.c:33)
==3728==    by 0x4058B7: CBSocketSend (CBLibEventSockets.c:287)
==3728==    by 0x4E522FB: CBNetworkCommunicatorOnCanSend (CBNetworkCommunicator.c:649)
==3728==    by 0x40564F: CBCanSend (CBLibEventSockets.c:235)
==3728==    by 0x526E54B: event_base_loop (event.c:1346)
==3728==    by 0x405244: CBStartEventLoop (CBLibEventSockets.c:154)
==3728==    by 0x5A54E99: start_thread (pthread_create.c:308)
==3728==  Address 0x5e7b6b4 is 20 bytes inside a block of size 24 alloc'd
==3728==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3728==    by 0x4E51E2A: CBNetworkCommunicatorOnCanSend (CBNetworkCommunicator.c:592)
==3728==    by 0x40564F: CBCanSend (CBLibEventSockets.c:235)
==3728==    by 0x526E54B: event_base_loop (event.c:1346)
==3728==    by 0x405244: CBStartEventLoop (CBLibEventSockets.c:154)
==3728==    by 0x5A54E99: start_thread (pthread_create.c:308)
==3728==
==3728== (action on error) vgdb me ...
当这种情况发生时,GDB会给出回溯:

0x00000000057835dc in __libc_send (fd=<optimized out>, buf=<optimized out>,
    n=<optimized out>, flags=<optimized out>) at ../sysdeps/unix/sysv/linux/x86_64/send.c:33
33  ../sysdeps/unix/sysv/linux/x86_64/send.c: No such file or directory.
(gdb) bt
#0  0x00000000057835dc in __libc_send (fd=<optimized out>, buf=<optimized out>,
    n=<optimized out>, flags=<optimized out>) at ../sysdeps/unix/sysv/linux/x86_64/send.c:33
#1  0x00000000004058b8 in CBSocketSend (socketID=20,
    data=0x5e7b6a0 "\371\276\264\331version", len=24)
    at /media/sf_BitEagle_Projects/cbitcoin/dependencies/sockets/CBLibEventSockets.c:287
#2  0x0000000004e522fc in CBNetworkCommunicatorOnCanSend (vself=0x5e76c30, vpeer=0x5e791c0)
    at /media/sf_BitEagle_Projects/cbitcoin/src/structures/CBObject/CBNetworkCommunicator/CBNetworkCommunicator.c:649
#3  0x0000000000405650 in CBCanSend (socketID=20, eventNum=4, arg=0x5e7a2d0)
    at /media/sf_BitEagle_Projects/cbitcoin/dependencies/sockets/CBLibEventSockets.c:235
#4  0x000000000526e54c in event_process_active_single_queue (activeq=0x5e78be0,
    base=0x5e78710) at event.c:1346
#5  event_process_active (base=<optimized out>) at event.c:1416
#6  event_base_loop (base=0x5e78710, flags=0) at event.c:1617
#7  0x0000000000405245 in CBStartEventLoop (vloop=0x5e78eb0)
    at /media/sf_BitEagle_Projects/cbitcoin/dependencies/sockets/CBLibEventSockets.c:154
#8  0x0000000005a54e9a in start_thread (arg=0x7a74700) at pthread_create.c:308
#9  0x00000000057824bd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#10 0x0000000000000000 in ?? ()
这是:


谢谢。

以下Valgrind参数可能有助于确定未初始化数据的来源:

--track-origins=yes
您也可以尝试使用

 --vgdb-error=0

在初始化字节20之前和之后放置断点,并使用memcheck命令验证发生了什么,我认为是在
peer->sendingHeader[17]=toSend->bytes->length>
而不是
int8\t len=CBSocketSend(peer->socketID,…)
没有错,但至少是正确的;其他返回类型(ssize_t…)是32位类型。除此之外:我不喜欢“不”,也不喜欢长的“链式”的“如果”@DanielFischer有一个很好的技巧。@DanielFischer:你说得对,谢谢。@wildplasser:我不知道我没有使用switch语句是什么。我会改变的。而且“不”使编程对我来说更容易,因为我的眼睛经常通过“!”。我使用了8位整数,因为这是本例中所需的全部内容,但使用CBSocketSend的返回类型是否更好?8位整数可能比本机整数成本更高。而且更容易出错。我不同意。如果(!*cp){}
,您仍然需要从其他只使用
if(!*cp){}
的用户那里读取代码。谢谢。我还不能正确地调试所有的东西。当事情不总是想成功的时候,它可能会很乏味,但我会回来告诉你细节。我可以说--track origins=yes告诉我未初始化数据的来源显然是在第30行()上分配的。那对我来说毫无意义。希望我明天能弄清楚。Valgrind坏了:这里是我认为哈希数据没有被分配,但它被分配了。我已经证实了这一点:所以一直以来valgrind都是坏的@马修米切尔:我在很多代码中使用了valgrind,我怀疑在这种情况下valgrind是否被破坏。查看进行哈希初始化的代码,我发现哈希至少有一种可能没有正确初始化。也就是说,如果
message->bytes->length
等于
0
。我善意的建议:考虑做更多的默认初始化和更多的错误检查。消息->字节->长度不等于0。我查过了。很明显valgrind没有接收到分配给数据的OpenSSL。
--track-origins=yes
 --vgdb-error=0