NetAddr::IP 4.080_08:又一个试用版,请进行冒烟测试

💡 原文英文,约2100词,阅读约需8分钟。
📝

内容提要

NetAddr::IP 4.080_08 试用版发布,重点加强对模糊或错误输入的处理:构造函数、解析、比较及方法行为更严格,坏输入改为拒绝、返回 undef 或报错。新增 new4() 和 NetAddr::IP::Count,改用 MIT 许可证。split 系列对未对齐计划报错,IPv4 文本解析更严格,canon() 对映射地址改用 RFC 5952 混合格式,比较非地址值不再崩溃。建议安装测试并反馈问题。

🔎

延伸解读

升级前重点检查输入解析与比较逻辑

4.080 系列对模糊或错误输入的处理更严格,许多过去能解析的输入现在会返回 undef 或报错。例如 IPv4 文本不再接受前导零,split 系列对未对齐计划直接 croak。如果你的代码依赖宽松解析或比较非地址值,升级前应针对这些场景做冒烟测试,避免运行时意外失败。

新 API 的适用场景与限制

new4() 适合只接受 IPv4 输入的场景,能识别 IPv4 映射文本并拒绝纯 IPv6 地址;NetAddr::IP::Count 则提供按子网包含关系计数的接口,但缓存大小不再影响计数。注意 new4() 对带前缀的映射地址有特定处理,且 numeric 掩码为 0 时仍表示前缀长度 0,使用时需确认输入格式。

canon() 格式变化可能影响输出一致性

canon() 对 IPv4 映射的 IPv6 地址改为 RFC 5952 混合格式(如 ::ffff:192.0.2.1),而 short()、addr() 和字符串化保持不变。这意味着同一地址的 canon() 与 short() 输出可能不同,且 re()/re6() 不匹配 canon() 形式。若代码依赖 canon() 做匹配或展示,需检查兼容性。

构建测试需覆盖 XS 与纯 Perl 两种模式

4.080_08 修复了 configure 和构建选择,建议分别用 XS 和纯 Perl 模式运行测试。可通过 NetAddr::IP::Util::mode() 确认当前模式,并用 perl Makefile.PL -noxs 切换。反馈问题时附上 Perl 版本、操作系统、构建模式及 mode() 输出,有助于定位平台相关问题。

❓

Q&A

NetAddr::IP 4.080_08 试用版主要改进了哪些方面?

该版本重点加强了对模糊或错误输入的处理:构造函数、解析、比较及方法行为更严格,坏输入改为拒绝、返回 undef 或报错。新增了 new4() 和 NetAddr::IP::Count,改用 MIT 许可证。split 系列对未对齐计划报错,IPv4 文本解析更严格,canon() 对映射地址改用 RFC 5952 混合格式,比较非地址值不再崩溃。

new4() 方法有什么作用?怎么使用?

new4() 读取输入类似 new(),但仅当结果为 IPv4 时返回对象。用于接受 IPv4 输入(包括携带 IPv4 地址的 IPv4 映射文本)并拒绝 IPv6 输入。IPv4 映射文本前缀为 96 位或更长时返回其携带的 IPv4 地址;其他 IPv6 结果返回 undef。示例:NetAddr::IP->new4('192.0.2.1') 返回 192.0.2.1/32;NetAddr::IP->new4('::ffff:192.0.2.1') 返回 192.0.2.1/32;NetAddr::IP->new4('2001:db8::1') 返回 undef。

split 系列方法在什么情况下会报错?

split、splitref、rsplit 和 rsplitref 在计划将片段放置在未对齐到该片段大小的地址时会 croak。例如在 192.0.2.0/28 上执行 split(30, 29) 过去会产生 192.0.2.4/29(不是 /29 网络),现在会报错。按从大到小排序的计划仍然正常工作。

IPv4 文本解析有哪些更严格的规则?

IPv4 文本解析更严格:任何 IPv4 部分都不接受前导零;整个字符串被读取为地址(在 InetBase 和 Util 文本函数中);尾随换行符和某些空白形式被拒绝(相关模式中用 \z 替换 $);inet_aton 和 naip_gethostbyname 对带空白的文本返回 undef 而不进行解析器查找。构造函数仍会去除地址周围空白,现在也会去除单独掩码的空白。在 :aton 下,仅保留 4 字节或 16 字节字符串的结尾。前缀长度前导零仍有效(如 192.0.2.0/024)。new_no() 仍将前导零部分读取为十进制。

canon() 对 IPv4 映射的 IPv6 地址输出格式有什么变化?

canon() 对 IPv4 映射的 IPv6 地址现在返回 RFC 5952 第 5 节混合形式,例如 ::ffff:192.0.2.1。IPv4 兼容、IPv4 转换和 NAT64 前缀仍保持十六进制。short()、addr() 和字符串化不变,因此对于映射地址 canon() 和 short() 可能不同,且 re()/re6() 不匹配 canon() 形式。

如何安装并测试 NetAddr::IP 4.080_08 试用版?

从 CPAN 安装试用版:cpanm DJZORT/NetAddr-IP-4.080_08.tar.gz。直接 cpanm NetAddr::IP 仍安装上一个稳定版,因此需使用 tarball。或从源码克隆测试:git clone https://github.com/cpan-authors/perl-NetAddr-IP.git,cd perl-NetAddr-IP,dzil test。如果发现问题,请提交 issue 并附上 Perl 版本、操作系统、构建的是 XS 还是纯 Perl,以及 mode() 的输出。

🏷️

标签

➡️

继续阅读