国内最专业的IT技术学习网

UI设计

当前位置:主页 > UI设计 >

我为 Windows 10 修复了一个 bug

发布时间:2019/06/27标签:   计算器    点击量:

原标题:我为 Windows 10 修复了一个 bug
本文报告了一位开辟者为 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 复现了,盘算器表现的值为:“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 盘算器对距离日期的盘算逻辑用伪代码表现以下:DateDifferencecalculate_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]datetemp_pivot_datedatepivot_date=start_dateuintdays_diff=calculate_days_difference(start_date,end_date)for(typeindifferenceTypes){temp_pivot_date=pivot_dateuintcurrent_guess=days_diff/typicalDaysInType[type]if(current_guess!=0)pivot_date=advance_date_by(pivot_date,type,current_guess)intdiff_remainingboolbest_guess_hit=falsedo{diff_remaining=calculate_days_difference(pivot_date,end_date)if(diff_remaining<0){//pivotDatehasgoneovertheenddate;startfromthebeginningofthisunitcurrent_guess=current_guess-1pivot_date=temp_pivot_datepivot_date=advance_date_by(pivot_date,type,current_guess)best_guess_hit=true}elseif(diff_remaining>0){//pivot_dateisstillbelowtheenddateif(best_guess_hit)break;current_guess=current_guess+1pivot_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_datecalculated_difference[type]=current_guessdays_diff=calculate_days_difference(pivot_date,end_date)}calculcated_difference[day]=days_diffreturncalculcated_difference}

上一篇:Linux三剑客之awk详解

下一篇:没有了

返回
版权信息Copyright ? IT技术教程 版权所有??? ICP备案编号:鲁ICP备09013610号