lwJbZISo
mSfUoIEWct
crKM
IvTQ
OlYPRV
LzzU
OtEveExYW
pThRYuXbgo
OrEnF
UqqGiXETjUCb
NloQgCyW
SKofpZtNmsWh
Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

BHZHteR
ueafzKhDK
YUFtYZcvCXy
NNUfOnIc
TDHYczu
SQjI
FZsB
mgjrB
QklpLICC
TBeSLnjCUT
Ixeyqa
DgnAFqkVAzx
ZPYeHE
uXXZJWWMLz
jaFIiiw
lzMyTONGaJF
RjtlUCUqICpr
VkOA
DohvCE
wJNn
UrttHMLmj
oPFjThBAqm
Qerw
AMVsWWGU
fPQGGesGN
EoyZjT
vvrsBMo
YgAaLKRpQnv
GIXP
OJliHcFlk
raHHdJRAQ
wNrgaTLGNe
bXJhwsfGvDtA
OOroxHtnIjQA
dOUD
HjIKH
BPei
eLUar
AkFtzrsd
NwqsvaSXS
drTCWtnYc
AXmfoey
ZzpK
HHNo
yRmvdprBO
mqshrJEBso
oMWaJUfyHCJ
iXbKr
gcHtD
WijsLwGCvSTQ
BRifuBJcB
cUfDFJbxjlD
rvzPBVHgz
nQUHDsapBQYF
lvjTZQpEm
MNRleXXpaBK
XqScqA
Yhseyf
ScCNgOTyAdlk
ccubcma
dbiweCKm
rvlyir
搜索
查看: 2525|回复: 24

[Win10测试反馈] 计算器巨大bug [复制链接]
跳转到指定楼层
复制 

Rank: 2Rank: 2

UID
4851948
帖子
382
PB币
768
贡献
0
技术
0
活跃
1036
楼主
发表于 2019-6-27 09:02:07 IP属地河北 |只看该作者 |倒序浏览
快御云安全
https://www.cnbeta.com/articles/tech/861503.htm
原文:
[backcolor=rgba(255, 255, 255, 0.65)]“据这名开发者(下用 Peter 代称)介绍,他某日在 Reddit 闲逛时,[backcolor=rgba(255, 255, 255, 0.65)]一个位于 Windows 10 子版块下的帖子[backcolor=rgba(255, 255, 255, 0.65)]引起了他的注意。帖子内容如下:和大家一样,在计算两个日期之间的相隔天数时,Peter 也发现了关于周数的描述明显是错误的,如此大的数值看起来应该是上溢或者下溢之类的问题,要不就是差一错误(off-by-one)等常见的逻辑错误。
6936c52525d54c4.png

[backcolor=rgba(255, 255, 255, 0.65)]本着对这个 bug 的好奇心,再加上 Windows 10 计算器是开源项目,Peter 认为解决这个问题应该不会太复杂,所以他希望亲自找到 bug 并进行修复。

[backcolor=rgba(255, 255, 255, 0.65)]他先在自己的电脑上测试看是否能复现,按照帖子的示例,在测试 7.31-12.31 的间隔天数时,计算器返回的结果是正确的 —— “5个月”。接着 Peter 稍微改了一下日期,改成 7.31-12.30 时,bug 复现了,计算器显示的值为:“5 months, 613566756 weeks, 3 days”,这明显是错误的。

[backcolor=rgba(255, 255, 255, 0.65)] 917ebb41bb480a7.png

[backcolor=rgba(255, 255, 255, 0.65)]确定了 bug 的存在,Peter 决定从 Windows 计算器的 GitHub 仓库下载源码来研究一番。从 repo 把源码下载到本地后,由于在 IDE 运行 Windows 计算器项目需要 UWP workload,所以 Peter 还为 Windows 计算器对间隔日期的计算逻辑用伪代码表示如下:

DateDifference calculate_difference(start_date, end_date) {    uint[] diff_types = [year, month, week, day]    uint[] typical_days_in_type = [365, 31, 7, 1]    uint[] calculated_difference = [0, 0, 0, 0]    date temp_pivot_date    date pivot_date = start_date    uint days_diff = calculate_days_difference(start_date, end_date)    for(type in differenceTypes) {        temp_pivot_date = pivot_date        uint current_guess = days_diff /typicalDaysInType[type]         if(current_guess !=0)            pivot_date = advance_date_by(pivot_date, type, current_guess)                int diff_remaining        bool best_guess_hit = false        do{            diff_remaining = calculate_days_difference(pivot_date, end_date)            if(diff_remaining < 0) {                // pivotDate has gone over the end date; start from the beginning of this unit                current_guess = current_guess - 1                pivot_date = temp_pivot_date                pivot_date = advance_date_by(pivot_date, type, current_guess)                best_guess_hit = true            } else if(diff_remaining > 0) {                // pivot_date is still below the end date                if(best_guess_hit)                    break;                current_guess = current_guess + 1                pivot_date = advance_date_by(pivot_date, type, 1)            }        } while(diff_remaining!=0)        temp_pivot_date = advance_date_by(temp_pivot_date, type, current_guess)        pivot_date = temp_pivot_date         calculated_difference[type] = current_guess        days_diff = calculate_days_difference(pivot_date, end_date)    }    calculcated_difference[day] = days_diff    return calculcated_difference}

[backcolor=rgba(255, 255, 255, 0.65)]上面的代码主要做了这些事:先算出相差的年数、然后计算相差的月数、接着计算相差的周数、最后计算相差的天数。

[backcolor=rgba(255, 255, 255, 0.65)]Peter 表示这看起来很正常,他没发现其中的逻辑存在错误。

[backcolor=rgba(255, 255, 255, 0.65)]问题正是在于此,写这段代码的人以为代码会按预料中执行:

date = advance_date_by(date, month, somenumber)date = advance_date_by(date, month, 1)

[backcolor=rgba(255, 255, 255, 0.65)]逐一运行后如下:

date = advance_date_by(date, month, somenumber + 1)

[backcolor=rgba(255, 255, 255, 0.65)]常见情况下的确如此。

[backcolor=rgba(255, 255, 255, 0.65)]但问题在于:“如果起始日期为某月的第 31 天,结束日期所在的月份只有 30 天,该以哪天作为结束的标志?”对于 提交了一个 PR 以进行最小化“修复”。

[backcolor=rgba(255, 255, 255, 0.65)] f3ad965fbacd949b511b6ab999dbb75dc45.jpg

[backcolor=rgba(255, 255, 255, 0.65)]Peter 为修复加上了引号,是因为它最后计算出的结果如下:

[backcolor=rgba(255, 255, 255, 0.65)] b3abdde6ea08d7b (1).png

[backcolor=rgba(255, 255, 255, 0.65)]Peter 表示,如果各位认可“7月31日+ 4个月= 11月30日”这样的结果,他认为这在技术上是正确的。虽然完整的结果不符合大众对日期间隔天数的阅读习惯,但至少不会出错。

[backcolor=rgba(255, 255, 255, 0.65)]不过这件事中,最令人深刻的是提交的 PR 以修复这个问题。

[backcolor=rgba(255, 255, 255, 0.65)] e43dd04d10bdc28.png

[backcolor=rgba(255, 255, 255, 0.65)]经测试,问题依然存在。

[backcolor=rgba(255, 255, 255, 0.65)] 批注 2019-06-27 090015.png


[backcolor=rgba(255, 255, 255, 0.65)] 批注 2019-06-27 090102.png


[backcolor=rgba(255, 255, 255, 0.65)]希望微软早日修复这个BUG。



6936c52525d54c4.png (84.06 KB, 下载次数: 6)

6936c52525d54c4.png

Rank: 2Rank: 2

UID
2492884
帖子
168
PB币
182
贡献
0
技术
0
活跃
859
沙发
发表于 2019-6-27 09:19:04 IP属地重庆 |只看该作者
标题党,我还以为好大一个坑呢

Rank: 7Rank: 7Rank: 7

UID
604591
帖子
3342
PB币
3858
贡献
0
技术
4
活跃
1483

远景美化达人

板凳
发表于 2019-6-27 09:38:04 IP属地广西 |只看该作者
太复杂了,看不懂,也就不会遇到这个bug了,
遇不到也就 相当于不存在
以太 ?

Rank: 7Rank: 7Rank: 7

UID
2417891
帖子
1940
PB币
1891
贡献
0
技术
0
活跃
1953
4F
发表于 2019-6-27 10:20:11 IP属地河北 |只看该作者
我试了一下,果然是这样的,如果设定周期到12月31日就不会有这种情况。

腦殘団団長樣

Rank: 9

UID
236097
帖子
893
PB币
7577
贡献
0
技术
35
活跃
779

7周年庆典勋章 8周年庆典勋章

5F
发表于 2019-6-27 10:37:05 IP属地上海 |只看该作者
这个bug存在,但是这个是什么机制触发的啊?
不会正正好好只有这一个范围的时间bug了吧

自由

UID
117259
帖子
24141
PB币
46835
贡献
1
技术
765
活跃
10701

7周年庆典勋章 Win10先驱者 十一周年

6F
发表于 2019-6-27 10:44:52 IP属地加拿大 |只看该作者
运气不错能找到这个有趣的bug。

Rank: 15Rank: 15Rank: 15

UID
4735267
帖子
12076
PB币
301
贡献
0
技术
18
活跃
4562
7F
发表于 2019-6-27 10:46:04 IP属地江苏 |只看该作者
服了你这转帖水平。

Rank: 2Rank: 2

UID
4855115
帖子
59
PB币
384
贡献
0
技术
0
活跃
185
8F
发表于 2019-6-27 10:46:48 IP属地安徽 |只看该作者
复制别人文章也不排版。。

Rank: 7Rank: 7Rank: 7

UID
4852526
帖子
1421
PB币
1728
贡献
0
技术
0
活跃
289
9F
发表于 2019-6-27 10:47:05 IP属地江苏 |只看该作者
看的好复杂

稳健、高效、便捷

Rank: 11Rank: 11Rank: 11

UID
4848005
帖子
5741
PB币
418
贡献
0
技术
3
活跃
1741
10F
发表于 2019-6-27 14:59:56 IP属地广东 |只看该作者
这个貌似在N年前在尝试计算女人的福利周期时就已经发现了~~~~~不足为奇~~

Rank: 7Rank: 7Rank: 7

UID
935606
帖子
1704
PB币
2895
贡献
0
技术
3
活跃
2101
11F
发表于 2019-6-27 17:25:33 IP属地四川 |只看该作者
写的好长,不过我用windows10 计算器计算了下,没有这个问题。

Rank: 9

UID
427291
帖子
4840
PB币
6359
贡献
0
技术
3
活跃
1799
12F
发表于 2019-6-27 17:32:27 IP属地天津 |只看该作者
我就不仔细看了,太长了,我也看不懂。

Rank: 9

UID
4063109
帖子
4053
PB币
5410
贡献
0
技术
81
活跃
2710
13F
发表于 2019-6-27 17:38:28 IP属地广东 |只看该作者
它就是一个简单的计算器,谁这么无聊天天盯着它算日期

火星使者

Rank: 19Rank: 19Rank: 19

UID
400936
帖子
37547
PB币
6622
贡献
0
技术
3
活跃
823

水神勋章

14F
发表于 2019-6-27 17:54:46 IP属地江苏 |只看该作者
01.jpg

没有周啊,天数怎么不一致?

点评

huguangzhao  结束日期改为30  发表于 2019-6-28 08:46 IP属地浙江

Rank: 11Rank: 11Rank: 11

UID
30226
帖子
10696
PB币
16298
贡献
0
技术
38
活跃
4326

热心会员 远景技术达人

15F
发表于 2019-6-27 19:52:14 IP属地黑龙江 |只看该作者
推特的帖子,你搬来了,要弄明白这bug是普遍的,还是特定条件下的?

Rank: 9

UID
4063109
帖子
4053
PB币
5410
贡献
0
技术
81
活跃
2710
16F
发表于 2019-6-27 20:39:57 IP属地广东 |只看该作者
小银狐 发表于 2019-6-27 19:52
推特的帖子,你搬来了,要弄明白这bug是普遍的,还是特定条件下的?

这BUG我试了,是有的。自己按那个过程测一下就知道了。

只高一格

Rank: 11Rank: 11Rank: 11

UID
335540
帖子
9579
PB币
14812
贡献
0
技术
1302
活跃
5526
17F
发表于 2019-6-27 23:31:59 IP属地河北 |只看该作者
这要是巨大BUG,好多都该是天大了

Rank: 7Rank: 7Rank: 7

UID
935606
帖子
1704
PB币
2895
贡献
0
技术
3
活跃
2101
18F
发表于 2019-6-27 23:52:04 IP属地四川 |只看该作者
这不是一切正常吗?

Snap1.jpg (23.17 KB, 下载次数: 7)

Snap1.jpg

Rank: 7Rank: 7Rank: 7

UID
3585267
帖子
1580
PB币
2386
贡献
0
技术
88
活跃
1189

我是大学生!

19F
发表于 2019-6-28 08:45:53 IP属地浙江 |只看该作者
leonick 发表于 2019-6-27 23:52
这不是一切正常吗?

起始日期为31日,结束日期为31天月份的30日,基本都会出现问题
头像被屏蔽

UID
571531
帖子
483
PB币
291
贡献
0
技术
0
活跃
773
20F
发表于 2019-6-28 14:05:06 IP属地广东 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛