Luau中的二进制和十六进制整数字面常量解析规则正在改进中

开发者们大家好!

接下来的日子里,我们将开始对二进制和十六进制整数字面常量解析规则进行改进。在某些情况下,这可能会影响到您的体验。为帮助解决这个问题,我们进行了一次试运行,其中涉及到多个阶段的工作室警告,同时,我们也与受影响的开发人员取得了联系。

请您阅读以下的这些更新信息,如果有您有任何疑问,欢迎随时向我们提问或者反馈。

概述:

用于解析二进制和十六进制整数字面常量的逻辑导致了某些字面常量没有按开发人员的意图表达。其使用的格式化方法可能不会产生您本来想要的数字,在某些情况下,这种方法还允许使用在原始Lua语言中无效的句法。

所以,我们将会这里将讨论三个问题。

十六进制整数字面常量静默溢出

Luau会将十六进制和二进制字面常量解析为64位整数,然后再将其转换为Luau数。

因此,超过2^64的数字会被静默地截断为2^64,这会导致程序出现意外的行为。

未来,脚本分析中将会有一个linter警告,通知您正在发生这些截断的位置。例如:

-- 十六进制数字字面常量超出可用精度,已截断为2^64

local x=0x11111111111111111111111111111111111AA

-- 上一行得出的数字与下面这一行相同:

local x = 0xffffffffffffffff

在某些情境下,Lua 5.1会被解析为2.3787461545099e+43或429496729 (0xffffffff),具体取决于C编译器版本。而Lua 5.3会包含最后16位十六进制的数字,得出1229782938247303594 (0x11111111111111AA)。

展望未来,我们可以重新探讨如何执行大型整数的解析,以及是否需要实现十六进制浮点。但就目前来说,报告不符合预期性能的代码非常重要。

二进制整数字面常量静默溢出

二进制整数字面常量也会出现同样的问题,并且还会生成新的linter警告。例如:

-- 二进制数字面常量超出可用精度,已截断为2^64

local x=0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

-- 上一行得出的数字与下面这一行相同:

local x=0b1111111111111111111111111111111111111111111111111111111111111111

双‘0x’前缀

十六进制整数字面常量前面可能会出现写入两次“0x”的错误:

-- 十六进制数字字面常量有两个前缀,导致后续无法解析;删除额外的0x来修复这个问题

local a=0x0x20

-- 同

local a=0x20

试运行

对于二进制和十六进制整数字面常量溢出,我们计划本周启用linter警告,并在可预见的未来保持启用状态。

我们将联系具有特定经验开发人员来进行修复。如果您看到linter警告,请密切关注我们的信息。

一旦我们确定平台上的体验已修复,我们将重新探讨这个问题并考虑将其更改为解析错误。

对于十六进制整数字面常量双前缀的问题,我们有一个更严格的方案:

从本周开始,工作室将生成十六进制整数字面常量双前缀的lint警告。我们将联系因此受影响的开发人员。

2022年9月5日 ,工作室会将这个问题归类为硬解析错误,带有错误的脚本将不会运行。 2022年10月5日 ,客户端和服务器也会将这个问题归类为硬解析错误。

如果您有任何疑问或顾虑,欢迎随时向我们反馈。

谢谢!

关于我们    加入我们    条款    隐私政策
©2021 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。
粤ICP备20013629号