優易網 - 深度 - 正文

我為Win10修復了一個bug

2019-07-15 15:43N軟網

據這名開發者(下用 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.ilsqcq.tw/news/2019/07/15/33298484.html

轉載本站原創文章請注明來源:優易網

點擊排行
焦點

《報告》:騰訊手機管家查殺病毒12.42億次,助力全民反詐騙

  收到詐騙短信怎么辦?是趕快刪掉“看不見就不會 ...詳情

戴爾靈越3650硬件性能如何?跑分情況說明

我們來看看戴爾靈越3650的硬件性能表現。 首先這款機器配備 ...詳情

網曝機械工程圖 iPhone7白帶或消失

啄木網-青島IT(www.zomiu.com):網曝機械工程 ...詳情

加速AR對象分類,Facebook開源計算機視覺算法Detectron

文章相關引用及參考:roadtovrFacebook今天正式 ...詳情

錘子駕駛新版發布:功能更強大

啄木網-青島IT(www.zomiu.com):錘子駕駛新版 ...詳情

CopyRight ? 2019 www.ilsqcq.tw, All Rights Reserved 優易網 版權所有

使用優易網前必讀 | 關于我們 | 免責聲明 | 隱私政策 | 版權聲明 | 聯系我們
海南七星彩规律论坛