You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:52:48