0717-7821348
爱彩人彩票网基本走势图

爱彩人彩票网基本走势图

您现在的位置: 首页 > 爱彩人彩票网基本走势图
爱彩人双色球走势图带连线-我为Windows 10修正了一个bug
2019-06-30 23:11:27

本文叙述了一名开发者为 Windows 核算器使用修正 bug 的阅历。

据这名开发者(下用 Peter 代称)介绍,他某日在 Reddit 闲逛时,一个坐落 Windows 10 子版块下的帖子引起了他的留意。帖子内容如下:

和我们相同,在核算两个日期之间的相隔天数时,Peter 也发现了关于周数的描绘显着是过错的,如此大的数值看起来应该是上溢或许下溢之类的问题,要不便是差一过错(off-by-one)等常见的逻辑过错。

本着对这个 bug 的好奇心,再加上 Windows 10 核算器是开源项目,Peter 以为处理这个问题应该不会太杂乱,所以他期望亲身找到 bug 并进行修正。

他先在自己的电脑上测验看是否能复现,依照帖子的示例,在测验 7.31-12.31 的距离天数时,核算器回来的成果是正确的 —— “5个月”。接着 Peter 略微改了一下日期,改成 7.31-12.30 时,bug 复现了,核算器显现的值为:

爱彩人双色球走势图带连线-我为Windows 10修正了一个bug

“5 months, 613566756 weeks, 3 days”,这显着是过错的。

确认了 bug 的存在,Peter 决议从 Windows 核算器的 GitHub 库房下载源码来研讨一番。从 repo 把源码下载到本地后,因为在 IDE 运转 Windows 核算器项目需求 UWP workload,所以 Peter 还为 Visual Studio 添加了 UWP workload。不过 Peter 表明建立开发环境也非常顺畅,修 bug 第一步至此完结。

接着 Peter 翻开了处理方案文件(solution file),检查 “Calculator” 项目,并查找看似相关的任何文件。他找到了界面文件DateCalculator.xaml,接着从相关的文件DateDiff_FromDate追寻到了DateCalculatorViewModel.cpp,最终找到

DateCalculator.cpp。

然后 Peter 开端设置断点并调查相关变量的改变,他发现 final 变量DateDifference的值有误。因而他判别这个 bug 不是由转换为字符串存在过错而导致的,而是实实在在的核算过错。

已然核算存在问题,那就看看它的核算逻辑是怎么完成的。

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)

fo茶叶分类r(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)

intdiff_remaining

boolbest_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

} elseif(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

returncalculcated_difference

}

上面的代码首要做了这些事:先算出相差的年数、然后核算相差的月数、接着核算相差的周数、最终核算相差的天数。

Peter 表明这看起来很正常,他没发现其间的逻辑存在过错。

问题正是在于此,写这段代码的人以为代码会按预料中履行:

date= advance_date_by(date, month, somenumber)

date= advance_date_by(date, month, 1)

逐个运转后如下:

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

常见情况下确实如此。

但问题在于:“假如开始日期为某月的第 31 天,完毕日期地点的月份只要 30 天,该以哪天作为完毕的标志?”关于

Windows.Globalization.Calendar.AddMonths(Int32) 来说,它的答案显然是“在第 30 天”。

详细而言,这就意味着:

“July 31st + 4 Months = November 30th”

“November 30th + 1 Month = December 30th”

但是实际情况是:

“July 31st + 5 Months = December 31st”

这就引起了“差一过错”。逐渐调用

Window::Globalization::Calendar::AddMonths会导致

GetDifferenceInDays呈现负值,然后将其分配给无符号变量daysDiff,通过后边的循环迭代后,daysDiff会将这个负值变为更大的数字。

接着 Peter 在 Windows 核算器的 GitHub 库房提交了一爱彩人双色球走势图带连线-我为Windows 10修正了一个bug个 PR 以进行最小化“修正”。

Peter 为修正加上了引号,是因为它最终核算出的成果如下:

Peter 表明,假如各位认可“7月31日+ 4个月 = 11月30爱彩人双色球走势图带连线-我为Windows 10修正了一个bug日”这样的成果,他以为这在技术上是正确的。爱彩人双色球走势图带连线-我为Windows 10修正了一个bug尽管完好的成果不符合群众对日期距离天数的阅览习气,但至少不会犯错。

不过这件事中,最令人深入的是微软最终兼并了 Peter 提交的 PR 以修正这个问题。

这说明微软的开源项目不仅仅是将代码保管在 GitHub 罢了,而是会听取来自社区用户的建议和改善。

那么问题来了,假如是你,你会怎样处理这个过错呢?

全国最大“同性结交”社区了解一下