IT资讯
当前位置:集趣网 > IT资讯 >  互联网

我为Win10修复了一个bug

2019-07-09 14:55:12 N软网 编辑:玉米 浏览数:43集趣网

据这名开发者(下用 Peter 代称)介绍,他某日在 Reddit 闲逛时,一个位于 Windows 10 子版块下的帖子引起了他的注意。帖子内容如下:和大家一样,在计算两个日期之间的相隔天数时,Peter 也发现了关于...

据这名开发者(下用 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 计算器对间隔日期的计算逻辑用伪代码表示如下:

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
}

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

分享到:

版权与免责声明:

凡未注明"稿件来源"的内容均为转载稿,本网转载出于传递更多信息的目的;如转载稿涉及版权问题,请作者联系我们,同时对于用户评论等信息,本网并不意味着赞同其观点或证实其内容的真实性;


本文地址:http://www.zjzgh.net/news/2019/07/09/92334648.html

转载本站原创文章请注明来源:集趣网

行业聚焦

十代桌面酷睿i3开放超线程 可提供八个逻辑线程

这几年,Intel酷睿处理器的规格不断提升,如今的i5已经媲美甚至超越几年前的i7,而接下来的第十代酷睿更猛。十代酷睿目前只有笔记本移动版的10nm Ice L...[详细]

小米9 Pro 5G今日正式开售:骁龙855+处理器加持,3699元起

IT之家9月27日消息 今日上午10点小米9 Pro 5G将正式开售:搭载高通骁龙855+处理器及三重快充技术,起售价3699元。据官方资料显示,小米9 Pro...[详细]

传闻中的“Windows Lite”操作系统将被称为Windows 10X

微软明天的Surface发布会剩下的悬念越来越少,因为今天的泄漏依然没有停止。在泄露了Surface Pro 7,Surface Laptop 3和新的ARM芯...[详细]

支付宝刷脸支付再提速 “蜻蜓”全面开放“轻会员”

9月24日,在支付宝开放日上海站上,支付宝正式宣布:面向线上线下全商业场景开放“轻会员”能力,力图破解商家与消费者在会员这件事上的信任难...[详细]

苹果iPhone 11/11 Pro首批订单开始发货,离开郑州富士康前往美国

IT之家9月17日消息 外媒报道,苹果iPhone 11和iPhone 11 Pro现在开始发货。第一批订单计划于9月20日星期五之前到达。IT之家报道,苹果官...[详细]

科技趋势

更多

科大讯飞智能录音笔SR301青春版 1节课录音5分钟成稿

 

新学期已然开始,步入新学期,面对新学业,如何提高学习效率,如何提高学习成绩成为学生党的困扰。不少家长对此也产生疑惑:“辅...[详细]

为什么舌头尝不出自己的味道?

 

当一道美味摆在你的面前时,扑鼻而来的香味总会让你垂涎三尺。无论是咸鲜脆嫩的鲁菜还是汤鲜味浓的浙菜,亦或是麻辣鲜香的川菜,...[详细]

云徙发布数字中台3.0 从内到外中台运营能力突破

 

  9月26日下午,云徙科技“双中台驱动的营销创新与实践专场”论坛在云栖大会火爆开幕,现场吸引了400多位企业CIO及技...[详细]

“iPod之父”推特在线作答有关苹果iPod开发的问题

 

IT之家10月7日消息 近日被称为“iPod之父”的托尼·法德尔(Tony Fadell)在Twitter上回答了关于他...[详细]

富士康员工曝新iPhone细节:有墨绿色版本,依旧5V1A

 

8月14日消息 日前,安兔兔援引自称即将离职的富士康员工在知乎上爆料的消息称,全新iPhone包含黑、白、金和墨绿色四种...[详细]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 一周排行每月关注
  • 01999元起,Redmi Note 8今天上午10点首次开售:双面玻璃机身,4800万四摄
  • 02首家外资获第三方支付牌照!央行批准PayPal收购国付宝70%股权(附解读)
  • 03IT之家教程:一文看懂如何从Windows 7升级到Windows 10
  • 04投行预测iPhone 11热卖,苹果市值再超1万亿美元
  • 05IT之家安卓版6.93发布:日间模式导航栏使用简白主题配色
  • 06分享几个能赚钱的项目
  • 07全面线上销售成噱头,特斯拉开设新零售中心招募销售人员
  • 08苹果发布 iOS 13.1.2 / iPadOS 13.1.2 正式版更新
  • 09首发价999元起!小米米家一口气发布四款新冰箱,推3年超长整机质保
  • 10因改装/转售PS3游戏主机,日本一男子被捕