调用inet_pton()时Valgrind报内存重叠错误的原因排查
inet_pton()验证IPv6地址时Valgrind报内存重叠错误的原因
运行以下验证IPv6地址的程序时,程序输出「Valid IP address.」,但Valgrind检测到内存重叠错误:
#include <stdio.h> #include <arpa/inet.h> int main() { struct in6_addr addr; if (inet_pton(AF_INET6, "fe80::a00:27ff:fe80:e79", &addr) == 1) { printf("Valid IP address.\n"); } else { printf("Invalid IP address.\n"); } return 0; }
Valgrind报错信息:
==3903== Source and destination overlap in memcpy_chk(0x1ffefffe08, 0x1ffefffe02, 8) ==3903== at 0x4851042: __memcpy_chk (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==3903== by 0x49B29CC: memmove (string_fortified.h:36) ==3903== by 0x49B29CC: inet_pton6 (inet_pton.c:226) ==3903== by 0x49B29CC: __inet_pton_length (inet_pton.c:56) ==3903== by 0x49B29CC: inet_pton (inet_pton.c:69) ==3903== by 0x1091BE: main (in /home/user/inet_pton)
环境信息:Valgrind版本为valgrind-3.21.0,Gcc版本为13.2.0-4ubuntu3。
报错原因分析
- 该错误并非你的代码导致,而是来自glibc库中
inet_pton6函数的内部实现。 - 当处理包含压缩段(
::)的IPv6地址时,inet_pton6会在栈上开辟临时缓冲区用于处理地址段的填充逻辑。在特定的栈内存布局下,这个临时缓冲区与你传入的struct in6_addr addr变量的内存区域发生了重叠,导致内部调用的memmove操作触发了Valgrind的内存重叠检测机制。 - 程序本身的地址解析逻辑是正确的,输出的「Valid IP address.」也验证了这一点,该Valgrind报错属于glibc实现与Valgrind检测的兼容性问题,或是特定glibc版本的小缺陷。
内容的提问来源于stack exchange,提问作者user22812972
相关产品推荐
相关产品推荐

