ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

mruby 3.2 用户可见变更全解析:语言特性、工具链、mrbgems 与安全修复

mruby 3.2 用户可见变更全解析:语言特性、工具链、mrbgems 与安全修复 mruby 3.2 用户可见变更全解析语言特性、工具链、mrbgems 与安全修复【免费下载链接】h2oH2O - the optimized HTTP/1, HTTP/2, HTTP/3 server项目地址: https://gitcode.com/gh_mirrors/h2/h2o导读mruby3.2.md是 mruby 官方发布说明文档系统梳理了从 mruby 3.1 升级到 mruby 3.2 期间的所有用户可见变更。本篇文章以该文档为主体骨架结合本仓库deps/mruby下的真实源码与测试用例逐条剖析语言层新语法常量赋值求值顺序、匿名参数转发、多精度整数、命令行工具行为变化mruby的-b语义与.mrb自动识别、mrbc新增--no-optimize、mrbgems 的打包与新增 APImruby-errno内置、Class#subclasses、Module#undefined_instance_methods以及一批已修复的 CVE。读者读完后既能掌握升级到 mruby 3.2 时需要注意的行为差异也能从源码层面理解这些变更背后的实现机制。说明本仓库中的 mruby 3.1 版本见 deps/mruby/include/mruby/version.h 中MRUBY_RELEASE_MAJOR 3、MRUBY_RELEASE_MINOR 1是 H2O 内嵌的 Ruby 脚本运行时本文讨论的 mruby 3.2 变更文档位于 deps/mruby/doc/mruby3.2.md可作为理解后续版本演进的权威参考。语言层变更mruby 3.2 在语言语义上做了三处用户可见的调整全部影响日常 Ruby 代码的书写方式。1. 常量赋值a::B c的求值顺序修正在 mruby 3.2 中a::B c被明确为先求值a再求值c。这一修正影响的是赋值语句中操作数的求值次序过去不同 Ruby 实现以及 mruby 旧版本对这一表达式的求值顺序并不一致而 mruby 3.2 明确规定接收方a必须先于右值c被求值。对开发者而言当a或c带有副作用例如方法调用、变量自增时这一顺序将直接决定程序行为升级后需要留意这类边界表达式的结果变化。2. 匿名参数*、**、的转发支持mruby 3.2 允许在方法参数列表中直接书写裸的*、**、用于将调用方传入的位置参数、关键字参数与块整体转发给另一个方法而无需为它们显式命名。从源码看这一特性由编译器解析层实现在 deps/mruby/mrbgems/mruby-compiler/core/parse.y 中定义了tPOW tDSTAR**与tAMPER等 token并在arg_rest、block_arg、kwrest_mark等产生式中支持了裸 token 形态如 parse.y 第 2597 行 的block_arg : tAMPER arg | tAMPER。同时 parse.y 第 2529 行 保留了对意外参数转发场景的语法错误提示。典型用法示例def wrapper(*, **, ) # 匿名转发不关心参数名直接透传 inner(*, **, ) end这一语法与 CRuby 2.7 的匿名块转发等特性对齐让代理类、装饰器模式的代码更简洁。3. 多精度整数mruby-bigintgemmruby 3.2 起通过mruby-bigintgem 提供**多精度整数bigint**支持突破固定位宽整数如 32 位mrb_int的范围限制可表示任意大的整数适合在嵌入式/受限环境中处理大数运算。注意mruby-bigint是独立 gem需要显式加入构建配置gembox /conf.gem才会启用未启用时仍使用平台默认的mrb_int整数实现。命令行工具变更mruby 3.2 对mruby与mrbc两个核心命令行工具的行为做了调整。mruby命令mruby是 mruby 的解释器入口本仓库实现位于 deps/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c3.2 版本有两处行为变化1-b选项仅作用于主脚本-b只把命令行上指定的主脚本当作 Rite 二进制mrb字节码文件加载不再影响通过-r指定的库文件。库文件是否按二进制加载改由文件扩展名决定见下一条。这一点在该 gem 的集成测试中有直接验证在 deps/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb 中测试用例同时给-b、-r传入不同文件验证仅主脚本受-b影响、-r加载的库按各自扩展名决定格式的行为。2后缀为.mrb时自动按编译二进制加载mruby现在会根据脚本文件后缀自动判断若文件以.mrb结尾即使不显式加-b也会按 Rite 二进制字节码加载。对应源码逻辑见 deps/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.cif (args.mrbfile || mrb_extension_p(cmdline)) { v mrb_load_irep_file_cxt(mrb, args.rfp, c); } else if (args.rfp) { v mrb_load_detect_file_cxt(mrb, args.rfp, c); }其中mrb_extension_p判断扩展名是否为.mrb-r加载库文件的路径同样经过该判断mruby.c 第 336-341 行。mrb_load_detect_file_cxt则用于自动探测文件是文本脚本还是二进制。这意味着mruby script.rb按源码文本执行mruby script.mrb按编译后字节码执行无需-bmruby -b script.mrb与mruby -b script.bin-b强制把主脚本当二进制处理。mrbc命令新增--no-optimizemrbc是 mruby 的字节码编译器。mruby 3.2 为它新增了--no-optimize选项用于关闭窥孔优化peephole optimization。该选项在编译器主程序的参数解析与使用说明中均有体现deps/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c 与 mrbc.c 第 175-177 行--no-optimize disable peephole optimization, ... else if (strcmp(argv[i] 2, no-optimize) 0) { args-no_optimize TRUE; break; }解析后该标志被写入mrbc_contextmrbc.c 第 234 行 的c-no_optimize args-no_optimize;并经由解析器传入代码生成器deps/mruby/mrbgems/mruby-compiler/core/parse.y 第 6576 行 的p-no_optimize cxt-no_optimize;。在代码生成端codegen.c提供了统一的判定入口deps/mruby/mrbgems/mruby-compiler/core/codegen.cstatic mrb_bool no_optimize(codegen_scope *s) { if (s s-parser s-parser-no_optimize) return TRUE; return FALSE; }而窥孔优化是否启用的核心判定在 codegen.c 第 488-492 行static mrb_bool no_peephole(codegen_scope *s) { return no_optimize(s) || s-lastlabel s-pc || s-pc 0 || s-pc s-lastpc; }也就是说--no-optimize会令no_peephole恒为真代码生成器在生成指令如跳转、OP_MOVE折叠等优化点见 codegen.c 第 530 行 等处的if (!no_peephole(s) ...)分支时不再合并、消除或重排指令从而得到更直接、可读性更强、与源码结构一一对应的字节码。该选项的典型用途包括排查编译器优化引入的指令级问题如调试字节码、对比优化前后差异教学与逆向分析获得未经优化的、更容易对照源码的指令序列作为基准评估优化对字节码体积和执行性能的实际影响。配套的-g生成调试信息、-s生成静态变量、-B以 C 语言格式输出等选项不受影响。mrbgems 变更mruby-errno纳入默认内置mruby 3.2 起mruby-errnogem 随发行版内置。它提供Errno模块将平台原生错误码errno映射为 Ruby 异常类如Errno::ENOENT使异常处理可以按系统错误语义进行区分。从本仓库的构建配置看该 gem 已被列入标准库 gemboxdeps/mruby/mrbgems/stdlib.gembox 中的conf.gem :core mruby-errno。其实现位于 deps/mruby/mrbgems/mruby-errno/src/errno.c错误码表由 gen.rb 生成配套测试在 deps/mruby/mrbgems/mruby-errno/test/errno.rb。对使用内置 gemboxstdlib.gembox、default.gembox等的构建升级到 3.2 后即可直接使用Errno无需额外引入。mruby-class-ext新增两个反射 APImruby-class-extgem 在 3.2 中新增两个方法。1Class#subclasses返回当前类的直接子类数组。实现位于 deps/mruby/mrbgems/mruby-class-ext/src/class.c通过mrb_objspace_each_objects遍历对象空间由add_subclasses回调class.c 第 66 行收集父类指针等于自身的类。配套测试deps/mruby/mrbgems/mruby-class-ext/test/class.rb演示了其语义a Class.new b Class.new(a) c Class.new(b) d Class.new(a) a.subclasses.size # 2b 和 d均为直接子类 a.subclasses.include?(b) # true a.subclasses.include?(d) # true b.subclasses # [c]只含直接子类不含孙类 c.subclasses # []注意返回的是直接子类不含更深层的后代类。2Module#undefined_instance_methods返回模块/类中被undef_method或undef标记为未定义的实例方法名数组。实现位于 deps/mruby/mrbgems/mruby-metaprog/src/metaprog.c方法遍历该方法表mrb_mt_foreachundefined_method_i回调收集带未定义标记的方法。该方法在 metaprog.c 第 700 行 注册mrb_define_method(mrb, mod, undefined_instance_methods, mrb_mod_undefined_methods, MRB_ARGS_NONE());典型用途class Foo def bar; end undef_method :bar end Foo.undefined_instance_methods # [:bar]它可与已有的instance_methods对照帮助开发者掌握一个类被显式屏蔽了哪些继承方法。已修复的安全漏洞CVEmruby 3.2 修复了一批安全漏洞涉及解析器、编译器、VM 等多个层面。完整清单文档原样列出均可通过 NVD 数据库检索详情CVE 编号说明CVE-2022-0481mruby 相关安全修复CVE-2022-0525mruby 相关安全修复CVE-2022-0570mruby 相关安全修复CVE-2022-0614mruby 相关安全修复CVE-2022-0623mruby 相关安全修复CVE-2022-0630mruby 相关安全修复CVE-2022-0717mruby 相关安全修复CVE-2022-0817mruby 相关安全修复CVE-2022-1212mruby 相关安全修复CVE-2022-1276mruby 相关安全修复CVE-2022-1286mruby 相关安全修复安全提示若你的项目内嵌 mruby 且会解析不可信的 Ruby 脚本或字节码例如 H2O 这类服务器软件通过 mruby 处理用户请求脚本应优先升级到修复了上述 CVE 的版本并留意官方安全公告仓库内对应文档为 deps/mruby/SECURITY.md。升级到 mruby 3.2 的实践清单综合上述变更从 mruby 3.1 升级到 3.2 时建议逐项核对求值顺序检查代码中形如a::B c的常量赋值是否依赖旧版求值顺序尤其是a、c带副作用时参数转发可改用def f(*, **, )匿名转发语法简化代理类代码大整数若需要超出mrb_int范围的整数运算将mruby-bigint加入构建配置工具链脚本-r加载的库文件不再受-b影响.mrb后缀文件会被mruby自动按二进制加载注意$0/文件加载语义的差异字节码调试需要未优化的指令序列时mrbc使用--no-optimize新 APIClass#subclasses、Module#undefined_instance_methods可直接使用Errno随默认构建内置安全确认已包含上表 CVE 的修复尤其当运行环境会加载不可信脚本时。参考与延伸阅读变更文档原文deps/mruby/doc/mruby3.2.md版本定义deps/mruby/include/mruby/version.hmruby解释器入口deps/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.cmrbc编译器入口deps/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c代码生成与窥孔优化deps/mruby/mrbgems/mruby-compiler/core/codegen.c语法解析参数转发 tokendeps/mruby/mrbgems/mruby-compiler/core/parse.yClass#subclasses实现与测试deps/mruby/mrbgems/mruby-class-ext/src/class.c、deps/mruby/mrbgems/mruby-class-ext/test/class.rbModule#undefined_instance_methods实现deps/mruby/mrbgems/mruby-metaprog/src/metaprog.cmruby-errno内置配置deps/mruby/mrbgems/stdlib.gemboxmruby 安全策略deps/mruby/SECURITY.md【免费下载链接】h2oH2O - the optimized HTTP/1, HTTP/2, HTTP/3 server项目地址: https://gitcode.com/gh_mirrors/h2/h2o创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表