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

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

行业聚焦

寻找大数据领域独角兽

2011年至今大数据概念火了八年势头依然强盛从随处可见的“经由大数据统计分析”到大数据商业化应用典型案例的出现强大的功能神乎其神的魔力这样的“大数据”早已深入人...[详细]

88元!绿联Type

IT之家6月25日消息 绿联Type-C接口65W折叠PD充电器日常售价128元,今日可用20元优惠券(点此领券),到手88元新低。可折叠插头,Type-C单口...[详细]

贝索斯:将用月球水冰制造氢气为航天器提炼燃料

6月20日消息,据CNBC报道,美国当地时间周三,在马萨诸塞州波士顿举行的肯尼迪航天峰会上,蓝色起源公司创始人杰夫·贝索斯(Jeff Bezos)透露了有关其月...[详细]

计算存储分离 华为云多模NoSQL服务GeminiDB更易用

随着互联网技术架构的快速普及,企业对于NoSQL的需求也越来越大,在云计算的潮流下,如何将云服务的思维和技术纳入到数据库创新,成为摆在云服务厂商面前的一道难题。...[详细]

深圳华人娱乐彩票 app下载运营班哪家好

领程培训创业2013年是一家全国连锁培训学校,开业以来已经成功培训了近5万名各界人士进入白领、专业技术领域等高薪阶层,成为了珠三角地区具有影响力及代表性的培训机...[详细]

科技趋势

更多

iPhone11概念图曝光 与三星S10很相似

 

近日,有外媒发布了一组关于iPhone11的全新的概念渲染图,与之前爆料略有不同,新的iPhone11概念图看起来很像目...[详细]

欧洲希望重塑汽车电池制造行业,正向中国“学习”

 

7月12日消息,在为下一代汽车和卡车制造电池方面,欧盟正开始像中国那样行事。▲法国Neac Saft Groupe S...[详细]

接入拼多多、京东 快手华人娱乐彩票 app下载全面打通主流华人娱乐彩票 app下载平台

 

DoNews 6月17日消息(记者 向密) 近日,拼多多和京东出现在快手小店的购物车。加上此前接入的淘宝、天猫,快手华人娱乐彩票 app下载...[详细]

你喜欢翘的二郎腿,竟是这样毁身体的

 

我猜,你现在正在跷着二郎腿读这篇文章。你有没有这种情况呢?当你一坐下来,不自觉地就跷起了二郎腿,当你察觉到自己正在跷二郎...[详细]

Magic Leap起诉前员工:窃取技术后创业做竞品

 

6月19日消息,据国外媒体报道,当地时间周一美国增强现实初创企业Magic Leap指控公司前工程师、现Nreal公司创...[详细]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 一周排行每月关注
  • 01奇瑞新能源欲独立上市 知情人士:正在为登陆科创板做准备
  • 02iPhone11概念图曝光 与三星S10很相似
  • 03飞利浦上架新款显示器:144Hz/1ms响应IPS屏,1399元
  • 04网易云音乐发声明:对造谣者向网友征集线索
  • 05FIIL DNC无线降噪耳机开箱图赏:不到400元的通勤心头好
  • 06微博2018智能手机报告发布 国产品牌vivo逆势上扬
  • 07北京首都机场停车场将于6月试用停车机器人
  • 08分期乐商城618下单额增长400% 平台数据显示95后消费升级需求旺盛
  • 09传北京开放了首个T5级自动驾驶车辆“考场”
  • 10星巴克在北京开了家主打外带服务的概念店