jq 版本演进全解:基于 NEWS.md 的 1.4 至 1.8.2 发布记录、安全修复与语言特性演进

发布时间:2026/9/6 18:15:55
jq 版本演进全解:基于 NEWS.md 的 1.4 至 1.8.2 发布记录、安全修复与语言特性演进 jq 版本演进全解基于 NEWS.md 的 1.4 至 1.8.2 发布记录、安全修复与语言特性演进【免费下载链接】jqCommand-line JSON processor项目地址: https://gitcode.com/GitHub_Trending/jq/jqNEWS.md 是 jq 官方维护的发布记录文档按版本倒序完整记载了从 1.8.2 一路回溯到 1.4 的语言变更、CLI 行为、CVE 安全修复与构建改进。对于需要在生产环境中固定 jq 版本、评估升级风险尤其是 1.8.0 的若干破坏性变更或审计安全补丁覆盖面的开发者来说这份文档是最权威的一手资料。读完本篇你可以快速掌握 jq 各里程碑版本的实际能力边界、1.8.2 最新安全加固的具体落点以及如何在仓库源码中逐条印证这些变更。文档定位与当前版本状态仓库根目录下的 NEWS.md 采用 Markdown 格式1.7 版本起从纯文本 NEWS 文件迁移而来每个版本一个 H1 段落内部按 Releasing / Security fixes / CLI changes / New functions / Changes to existing functions / Language changes / Build and test changes / Documentation changes 等固定小节组织。当前最新条目为1.8.2其描述为这是一个在 1.8.1 基础上的补丁版本包含安全修复与缺陷修复并新增了 Windows arm64 与 Docker arm/v7 构建。配套的发布签名与校验文件位于 sig/ 目录按版本子目录组织如 sig/v1.8.2/sha256sum.txt、各平台二进制的.asc签名1.8.2 起还额外发布了 jq-attestation.json.asc 证明文件attestation用于对发布产物做来源验证。版本号的定义入口在 configure.acAC_INIT([jq],[jq_version]...)版本号在构建时注入。1.8.2以安全加固为主的补丁版本安全修复清单1.8.2 的安全修复覆盖了堆/栈溢出、越界读、整数溢出、DoS 递归等多个类别。以下按 NEWS.md 原文逐条继承并标注了部分可在源码中印证的位置CVE-2026-32316修复jvp_string_append与jvp_string_copy_replace_bad中的堆缓冲区溢出。CVE-2026-33947限制路径深度防止jv_setpath、jv_getpath、jv_delpaths发生栈溢出。CVE-2026-33948修复 JSON 解析器中的 NUL 截断问题。CVE-2026-39956修复_strindices缺失运行时类型检查。CVE-2026-39979修复jv_parse_sized()的越界读。CVE-2026-40164随机化哈希种子缓解哈希碰撞 DoS 攻击。在源码中可以直接印证src/jv.c 中的jvp_hash_seed_init通过arc4random/getentropy//dev/urandom依次兜底获取随机种子并以pthread_once保证只初始化一次随后jvp_string_hash基于 MurmurHash3以该种子作为初始h1。CVE-2026-40612限制包含检查containment check深度防止contains栈溢出。CVE-2026-41256修复通过-f加载的程序文件中的 NUL 截断。CVE-2026-41257修复stack_reallocate中的有符号整数溢出。CVE-2026-43894拒绝长度超过DEC_MAX_DIGITS999999999的数值字面量。源码印证src/jv.c 中jvp_literal_number_new在分配前显式判断if (len DEC_MAX_DIGITS) return JV_INVALID;。CVE-2026-43895拒绝模块导入路径中嵌入的 NUL 字节。CVE-2026-43896限制递归对象合并recursive merge深度防止栈溢出。CVE-2026-44777检测循环模块导入防止栈溢出对应仓库中 tests/modules/cycle_a.jq、tests/modules/cycle_b.jq、tests/modules/cycle_self.jq 等循环导入测试素材。CVE-2026-47770为深层结构相等性与比较的递归增加保护。CVE-2026-49839修复原始文件raw file加载中的堆缓冲区溢出。CVE-2026-54679收紧字符串长度边界并在implode中传播无效的 jv。GHSA-gf4g-95wj-4q4r修复args2obj()数组参数路径中的 use-after-free。GHSA-hj52-j2c9-r8r4修复tokenadd的有符号整数溢出可演变为缓冲区溢出。此外还有若干未分配编号的加固项限制函数参数与函数定义数量防止 SEGV#3460。为字符串解析器预分配tokenbuf避免未定义行为#3485。释放深层嵌套值时避免栈溢出。修复内存泄漏与双重释放#3487。发布与构建Releasing新增 Windows arm64 构建#3376。Docker 镜像支持 arm/v7 架构#3463。更新 GPG 签名密钥。为 actions/attest 增加artifact-metadata权限#3530。将 attestation bundle 作为发布产物上传可通过gh attestation verify --bundle jq-attestation.json做无认证验证#3563。CLI 变更改进错误信息截断补全闭合定界符#3478。去除die函数输出中的多余空格#3391。修复 raw 输入标志-R破坏多字节字符的问题#3421。修复两次导入含错误的模块时崩溃的问题#3497。最大打印深度从 256 提高到 10000#3414。既有函数修复修复rtrimstr()总是输出#3415。修复del(.[nan])的死循环与未定义行为#3490。重构uri/urid修复多字节 UTF-8 损坏#3495。tonumber/toboolean现在拒绝含内嵌 NUL 字节的字符串#3496。修复取模运算符的未定义行为#3486。修复f_env边界检查中的反向指针减法#3465。修复f_localtime之后f_strflocaltime缺失的有效性检查#3491。修复 32 位平台的 2038 年问题#3407。from_entries定义改用//替代//#3516。构建与测试1.8.2 的构建/测试侧变更包括弃用不可移植的strptime %F测试#3365、在 fuzz 目标中将 oniguruma 解析深度限制为 1024#3377与 src/main.c 中onig_set_parse_depth_limit(1024)的调用相呼应、修复时区格式化本地化测试、修复 tests/jq.test 中的笔误、重构tm2jv以处理小数秒、让 tests/jq_fuzz_parse_stream.c 使用迭代式解析 API、支持--disable-maintainer-mode与源码目录/构建目录分离、新增 Solaris 支持#3515、生成 man page 时尊重SOURCE_DATE_EPOCH#3514、修复 UTF-8 工具函数中的未定义指针运算、修复BASE64_DECODE_TABLE的单字节越界读#3547。文档侧则修复了 man 页 rawfile 的缺词、教程按钮切换、拼写等小问题。1.8.1修复 1.8.0 暴露的安全、性能与构建问题1.8.1 是紧跟 1.8.0 的补丁版本NEWS.md 中记载安全修复CVE-2025-49014修复f_strftime、f_strflocaltime中的堆 use-after-free。GHSA-f946-j5j2-4w5m修复 onigurumanode_min_byte_len中的栈溢出。CLI 与函数修复查询末尾出现语法错误时的断言失败#3350。提升strptime/1的可移植性尤其是 Windows 平台#3342。语言变更一次回滚回滚了 1.8.0 中reduce/foreach状态变量行为的变更原 #3205原因是该变更引入了严重的性能回归#3349。这条记录提示升级 1.8.x 时reduce/foreach的状态变量语义应以 1.8.1 及之后即回滚后的行为为准。其他在 COPYING 中补充 NetBSDstrptime()的 LICENSE 声明#3344。修复旧版 Mac 上旧 sed 导致的构建问题#3336。1.8.0功能最密集的版本含多个破坏性变更1.8.0 是 1.7.1 之后的第一个大版本NEWS.md 特别警告部分变更会破坏现有脚本升级前需仔细阅读全文。以下按原文各小节完整展开。版本与发布流程版本号模式改为1.X.Y1.8.0取代1.8#2999。这也体现在仓库 sig/ 目录同时保留v1.7、v1.7.1与v1.8.0/v1.8.1/v1.8.2等不同命名风格的子目录。为发布产物与 Docker 镜像生成来源证明provenance attestation#3225验证方式gh attestation verify --repo jqlang/jq jq-linux-amd64 gh attestation verify --repo jqlang/jq oci://ghcr.io/jqlang/jq:1.8.0安全修复CVE-2024-23337修复jvp_array_write与jvp_object_rehash的有符号整数溢出修复后数组与对象的最大元素数被限制为 5368709122^29。CVE-2024-53427解析 JSON 时拒绝带负载payload的 NaN如NaN123NaN、Infinity等其他 JSON 扩展仍支持。源码印证src/jv.c 中jvp_literal_number_new对decNumberIsNaN且digits 1或*lsu ! 0的情况直接返回JV_INVALID。CVE-2025-48060修复jv_string_vfmt的堆缓冲区溢出。修复check_literal中未初始化值的使用#3324。修复strftime/1、strflocaltime/1的分段错误#3271。修复base64d未处理的溢出#3080。CLI 变更含行为示例--indent 0不再隐式启用--compact-output#3232$ jq --indent 0 . { foo: [hello, world] } { foo: [ hello, world ] } # 此前会隐式启用 --compact-output现在保留换行错误信息标出问题位置#3292$ jq -n 1 $foo 2 jq: error: $foo is not defined at top-level, line 1, column 5: 1 $foo 2 ^^^^ jq: 1 compile error解析器与编译器错误信息中加入列号#3257修复以单引号开头的字符串字面量的错误提示#2964此前误报为 Invalid numeric literal。JQ_COLORS支持 truecolor 等更长转义序列#3282JQ_COLORS38;2;255;173;173:38;2;255;214;165:38;2;253;255;182:38;2;202;255;191:38;2;155;246;255:38;2;160;196;255:38;2;189;178;255:38;2;255;198;255 jq -nc [null,false,true,42,{a:bc}]为-L增加长选项--library-path#3194。修复--slurp --stream在输入无尾随换行时的行为#3279。--indent对非法取值报错#3195。修复非 Windows 平台--binary的选项解析#3131修复 Windows 上$HOME未设置时~/.jq的问题#3114。JSON 最大解析深度提高到 10000#3328。短选项按给出顺序解析#3194一致地重置颜色格式#3034。新增函数全部带可运行示例trim/0、ltrim/0、rtrim/0去除前/后空白#3056。$ jq -n hello | trim, ltrim, rtrim hello hello hello源码印证三者均为 C 实现而非 jq 定义见 src/builtin.c 的f_string_trim/f_string_ltrim/f_string_rtrim共享string_trim与TRIM_LEFT|TRIM_RIGHT标志并在 src/builtin.c 注册为 1 元函数。trimstr/1从两端去除指定字符串#3319。$ jq -n foobarfoo | trimstr(foo) bar源码印证src/builtin.jq 中def trimstr($val): ltrimstr($val) | rtrimstr($val);是既有ltrimstr/1、rtrimstr/1的组合。add/1add/0的生成器变体#3144。$ jq -c .sum add(.xs[]) {xs:[1,2,3]} {xs:[1,2,3],sum:6}源码印证src/builtin.jq 中def add(f): reduce f as $x (null; . $x); def add: add(.[]);两个重载并存。skip/2limit/2的对应物跳过前 n 个输出#3181。$ jq -nc [1,2,3,4,5] | [skip(2; .[])] [3,4,5]源码印证src/builtin.jq 用foreach递减计数实现负数会报错。toboolean/0把字符串转换为布尔值#2098。$ jq -n true, false | toboolean true false源码印证C 实现f_toboolean位于 src/builtin.c 并在第 1989 行注册。1.8.2 进一步让toboolean拒绝含 NUL 的字符串#3496。uriduri的反向格式#3161。$ jq -Rr urid %6a%71 jq既有函数变更标注破坏性项indices/1、index/1、rindex/1改用码点code point索引#3065——破坏性变更需要字节索引时用utf8bytelength/0。tonumber/0拒绝前后带空白的字符串#3055 #3195——破坏性变更先trim/0再转换。时间格式化时填充时区数据修复strftime/1、strflocaltime/1在 DST 下的时区名#3203 #3264 #3323。一元取负、abs/0、length/0保留数值精度#3242 #3275。last(empty)与first(empty)一致地不产生输出#3179。ltrimstr/1、rtrimstr/1对非字符串输入报错#2969。limit/2对负数计数报错#3181。修复mktime/0溢出并允许日期时间表示数组元素更少#3070 #3162。修复正则中未匹配的可选捕获组#3238。所有系统提供strptime/1#3008 #3094修复其_WIN32移植#3071。bsearch/1以 C 实现提升性能#2945unique/0、unique_by/1性能改进#3254 #3304。错误信息中的长字符串字面量不再截断 Unicode 字符#3249。移除pow10/0glibc 2.27 已弃用改用exp10/0移除未记录的私有过滤器_nwise#3260。语言变更绑定语法as对一元/二元运算符的优先级修正#3053 #3326——破坏性变更行为变化示例$ jq -nc [-1 as $x | 1,$x] [1,-1] # 此前为 [-1,-1] $ jq -nc 1 | . 2 as $x | -$x -3 # 此前为 -1 $ jq -nc {x: 1 2, y: false or true, z: null // 3} {x:3,y:true,z:3} # 此前为语法错误Tcl 风格多行注释#2989行尾反斜杠续接注释可用于 shebang 脚本#!/bin/sh -- # Next line will be seen as a comment be of the trailing backslash. \ exec jq ... # this jq expression will result in [1] [ 1, # \ 2 ]修复foreach的 init 回退与DUPN交互导致的破坏#3266$ jq -n [1, 2] | foreach .[] as $x (0, 1; . $x) 1 3 2 4reduce/foreach状态变量不再每次迭代重置#3205该变更在 1.8.1 中因性能回归被回滚注意版本差异$ jq -n reduce range(5) as $x (0; .$x | select($x!2)) 8过滤器支持 CRLF 换行#3274字符串重复操作性能改进#3272。构建与测试1.8.0 的构建改进覆盖面很广GCC 15C23构建修复#3209、-Woverlength-strings警告#3019、src/jv_dtoa.c 与 src/builtin.c 的编译错误修复、OpenBSD 支持_BSD_SOURCE#3278、IBM z/OS 支持#3277、修复不安全的RUNPATH#3212、避免零长度calloc、将 oniguruma 与 decNumber 移入 vendor 目录#3234等。测试侧在 C locale 下运行测试#3039、NO_COLOR测试可靠性改进#3188 #3283、常量折叠测试重构#3233、--disable-decnum下测试通过、Valgrind 默认关闭#3269。1.7.1 与 1.7五年空窗后的重启与精度革命1.7.1安全CVE-2023-50246jvp_literal_number_literal堆缓冲区溢出、CVE-2023-50268带负载 nan 比较时的栈缓冲区溢出。CLI默认背景色更适配亮色终端#2904允许在--之后传内联脚本#2919OpenBSD 系统操作限制#2934jq_init()失败时的未初始化引用修复#2935。语言简化paths/0、paths/1#2946字符串字面量拒绝U001F#2911decnum 由 decimal64 改为 binary64double使 jq 行为更贴近 JSON 规范#2949修复ltrimstr/1、rtrimstr/1与setpath/2的内存泄漏#2977 #2970允许注释中包含回车#2942 #2984。libjq为 C 增加 extern C#2953。构建与测试fuzz 覆盖扩展到解析器与 JSON 序列化器#2952对应 tests/jq_fuzz_parse.c、tests/jq_fuzz_execute.cpp 等 fuzz 目标发布产物保留旧命名#2951。1.7组织重启后的首个大版本NEWS.md 记录jq 在五年停更后由新的维护者团队jqlang 组织重启CI/发布/网站构建全面迁移到 GitHub ActionsNEWS 文件改为 Markdown 格式Docker 镜像改由 ghcr.io 提供并接入 OSS-fuzz。发布构建覆盖Linuxamd64/arm64/armel/armhf/i386/mips系列/powerpc/ppc64el/riscv64/s390xmacOSamd64/arm64Windowsi386/amd64Docker 多架构#2665。关键变更CLIJQ_COLORS支持键名颜色#2703尊重NO_COLOR#2728--exit-code/-e退出码语义修复#1697false/null退出 1、无输出退出 4新增 Windows 下--binary/-b新增--raw-output0NUL 分隔原始输出可与xargs -0、read -d 组合# will output a zero byte after each output $ jq -n --raw-output0 1,2,3 | xxd 00000000: 3100 3200 3300 1.2.3. $ jq -n --raw-output0 a,b,c | xargs -0 -n1 a b c--jsonarg修复断言崩溃并校验 JSON#2658移除已弃用的--argfile#2768启用栈保护#2801。语言/函数十进制数字字面量保留精度#1752100000000000000000原样往返、100000000000000000 100000000000000001为trueJavaScript 中为 false、排序正确算术运算仍可能截断。这与 src/jv.c 中jvp_literal_number同时持有num_double与decNumber num_decimal的双精度表示结构直接对应。新内建pick(stream)输出对象/数组投影#2656 #2779src/builtin.jq 中基于reduce path(...) setpath实现、debug(msgs)变参调试#2710、补全scan($re; $flags)#1961、新增abs#2767。if允许省略else缺省为.#1825 #2481。对象字面量键可直接用$binding此前需($key).a[b]允许写成.a.[b].a[]允许写成.a.[]。try/catch捕获范围修正#2750halt/halt_error立即退出#2667(| empty)对数组的删除语义修复#2133implode替换非法码点而非断言#2646sub/3全局替换修复#2641error/0、error/1抛出 null 错误#2823移除弃用过滤器leaf_paths、recurse_down#2666。1.6 及更早能力基线NEWS.md 尾部的 Previous releases 段落给出了版本时间线1.62018-11-021.52015-08-151.42014-06-09 等与各版本能力基线1.6Destructuring Alternation 语法新内建builtins/0、stderr/0、halt/0、halt_error/1、isempty/1、walk/1、utf8bytelength/1、localtime/0、strflocaltime/1及 SQL 风格内建ASAN/UBSAN 支持shebang 使用改进$ENV内建JQ_COLORS环境变量。1.5正则表达式Oniguruma与模块/库系统——这是 jq 表达力的分水岭datetime/math/regexp/stream 类内建解构语法、try/catch、泛化?、label/break、foreach、函数重载CLI 新增-j、--argjson、--slurpfile、--tab、--indent、--stream、--seq尾调用优化。1.4--unbuffered、-e/--exit-status、-S/--sort-keys从此不再默认排序键..递归下降、.a?静默错误、.foo语法、取模运算符%split/join/ltrimstr/rtrimstr/startswith/endswith/explode/implode/fromjson/tojson/index/rindex/indices等字符串内建libjq C API 首次确立。安全修复的源码落点速查将 NEWS.md 的条目与仓库源码对照可以在以下位置核验关键加固适用于对当前代码基线做安全审计的读者修复主题源码位置验证要点数字字面量长度上限CVE-2026-43894src/jv.clen DEC_MAX_DIGITS返回JV_INVALID带负载 NaN 拒绝CVE-2024-53427src/jv.cdigits 1 \|\| *lsu ! 0判为无效哈希种子随机化CVE-2026-40164src/jv.carc4random→getentropy→/dev/urandom三级兜底oniguruma 解析深度限制src/main.conig_set_parse_depth_limit(1024)trim族 C 内建src/builtin.c、src/builtin.c1.8.0 新增函数函数表注册 1 元字符串哈希MurmurHash3src/jv.c哈希种子作为初始h1fuzz 目标源码位于 tests/ 目录jq_fuzz_parse.c、jq_fuzz_execute.cpp、jq_fuzz_compile.c、jq_fuzz_load_file.c等功能回归主测试为 tests/jq.test与 NEWS 中 Build and test changes 各条目的修复对象一一对应。升级决策建议结合 NEWS.md 各版本的破坏性标记从旧版本升级到当前 1.8.2 时需重点回归测试的场景依赖indices/index/rindex字节语义的脚本1.8.0 起改为码点索引非 ASCII 数据会受影响。依赖tonumber容忍空白输入的脚本1.8.0 起需显式trim。使用as绑定与一元/二元运算符混合的过滤器1.8.0 优先级修正会改变输出。超大对象/数组1.8.0 起数组/对象上限为 2^29 元素超深嵌套JSON 解析与打印深度上限均为 10000。依赖reduce/foreach状态变量重置行为的代码1.8.0 变更已在 1.8.1 回滚跨版本行为不一致建议锁定 1.8.1 及以上。依赖pow10/0、leaf_paths、recurse_down、_nwise、--argfile的脚本这些接口已被移除。获取二进制后用对应 sig/ 子目录的sha256sum.txt与各平台.asc签名做完整性校验1.8.2 起可再叠加 attestation 验证。NEWS.md 作为单一事实来源single source of truth配合 sig/ 的签名产物与 src/ 下的实现代码构成了 jq 从 1.4 到 1.8.2 完整、可审计的演进档案——版本选择、风险评级与补丁验证均可直接以其为据。【免费下载链接】jqCommand-line JSON processor项目地址: https://gitcode.com/GitHub_Trending/jq/jq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考