bilibili lua BUG 本地未复现

2022-07-24 12:00:32 +08:00
 XCG0000
看了 b 站回顾去年 7 月份的崩溃问题,https://www.bilibili.com/read/cv17521097 ,聚焦在 lua 函数的参数校验和死循环上,但本地未能复现,有大神知道怎么回事吗? (第一次写 lua ,没有经验)

代码:

local _gcd
_gcd = function (a, b)
if b == 0 then
return a
end

return _gcd(b, a % b)
end

print(_gcd(123, "0"))

使用 VS Code 编写和运行, 在 a % b 时就直接退出了,并没有造成死循环:

lua: attempt to perform 'n%0'
stack traceback:
[C]: in metamethod 'mod'
/Users/.../lua_bilibug.lua:21: in local '_gcd'
/Users/.../lua_bilibug.lua:24: in main chunk
[C]: in ?


其次,入参 b 是 ip 地址是什么意思?为什么 ip 地址会计算 GCD 呢?
3164 次点击
所在节点    程序员
8 条回复
FYFX
2022-07-24 12:02:46 +08:00
换 luajit
chotow
2022-07-24 12:09:58 +08:00
> SLB 在 balance_by_lua 阶段,会将共享内存中保存的服务 IP 、Port 、Weight 作为参数传给 lua-resty-balancer 模块用于选择 upstream server ,在节点 weight = "0" 时,balancer 模块中的 _gcd 函数收到的入参 b 可能为 "0"。

b 不是 IP 地址
j0hnj
2022-07-24 12:34:33 +08:00
用 luajit 复现了
securityCoding
2022-07-24 15:02:39 +08:00
文章写的确实很好,里面提到了 jit 问题
HankLu
2022-07-24 15:51:25 +08:00
尽量不要递归
msg7086
2022-07-25 05:15:17 +08:00
我简单找了一下,没有找到 lua 的标准化语言参考文档。所以我怀疑是不同的 lua 实现产生不同的行为导致的。
比如说我看到有些文章里提到 lua 里除 0 会得到正无穷、负无穷或者 NaN ,所以我相信至少有一个实现是会得到这样结果的。
unclemcz
2022-07-28 13:12:01 +08:00
版本 5.2 ( linux arm64 )下也复现了,5.4 ( win x64 )没有复现。
unclemcz
2022-07-29 10:07:30 +08:00
@unclemcz #7 补充一下,版本 5.1-5.3 都可复现,5.4 代码传入‘0’会报错。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868332

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX