給位元幣做一次體檢

2021-08-02 13:34:17 字數 2546 閱讀 9709

不要指望這是一篇多麼史詩的文章,這裡只是用pvs-studio檢查了下位元幣專案的源**,並發現了其中一些可疑的片段。我想已經有很多程式設計師已經檢查過位元幣源**了吧,不過既然我們也做了一次檢查,這裡就簡單地說明下。

首先我們決定用pvs-studio以及clang進行對比測試,這是乙個龐大而複雜的任務,我並不認為它能夠很快完成。下面是這項任務中遇到的幾個難題:

我們需要收集的專案是由gcc建立,但也可以由clang進行編譯。如果我們直接用clang檢查這些專案,clang是不會發現漏洞的,因為在clang的幫助下這些漏洞已經被修復了。但是pvs-studio就可以。

一般來說,幾乎沒有專案可以同時在clang以及visual studio上進行編譯,clang號稱能夠很好地相容visual studio,但實際操作中卻是另一碼事,很多專案都不能正常建立和檢查。而pvs-studio在linux平台下執行的情況卻又是不如人意,因此我們所尋找的專案需要在這兩種工具上都可以很好的進行處理。

位元幣就是我們所選擇的對比專案之一,兩種工具執行完後所發現的錯誤也幾乎為零,這也無需奇怪 —— 我想這個專案早就被檢查爛了,這也就是為什麼我們將大部分比較從中排除的原因,下面我們就簡單地概括下這次檢查。

專案分析

本次分析通過5.17版本pvs-studio完成。

下面是該檢測分析唯一我覺得可疑的片段。這是一段和密碼學相關的函式,我不知道它到底有何作用,或許我找到了驚天秘密也說不定呢,現在這個年代,程式猿最樂意做的事就是發現一些關於安全性的大bug,***。但是,這裡可能只是乙個小錯誤,甚至是一段故意編寫的**。

bool ccryptokeystore::unlock(const ckeyingmaterial& vmasterkeyin)

vmasterkey = vmasterkeyin;

}notifystatuschanged(this);

return true;

}

注意這個迴圈,它必須遍歷某些鍵值,然而,其迴圈體只執行一次。還有就是在該迴圈結束時,會有乙個「return false;」操作,它也可以由「break;」終止,與此同時,並不存在乙個單一的「continue;」的操作。

static int64_t set_vch(const std::vector& vch)

pvs-studio的診斷資訊:v629 檢查了 』0×80 << (8 * (vch.size() – 1))』語句,bit從32位值擴充套件到64位值, script.h 169。

該功能形成了乙個64位的值,其中乙個轉變是正確的,其他的可能不是。

正確的行:

static_cast(vch[i]) << 8*i
變數首先延伸到int64_t,然後進行轉移

可疑行:

0x80 << (8 * (vch.size() - 1))
不變的**:

0x80ull << (8 * (vch.size() - 1))
class ckey 

....

};

pvs-studio的診斷資訊:v690中的』ckey』類實現了乙個拷貝建構函式,但它缺少「=」操作符。使用這樣的類是危險的。key.h 175

很多人認為拷貝建構函式是對於同步來說必須的,然而,乙個專案不應該只通過拷貝建構函式來進行複製,「=」操作在這段**中並未出現,儘管目前看來=操作還未能派上用場,但是這段**還是有潛在危險的。

同樣的,還有一些需要進行仔細檢查的類:

v690 「semantic_actions」類實現了』='操作,但缺少乙個拷貝建構函式,使用這樣的類是危險的。json_spirit_reader_template.h196

v690 「cfeerate」類實現乙個拷貝建構函式,但缺少「=」操作符,使用這樣的類是危險的。 core.h118

v690 「ctransaction」類實現了』='操作,但缺少乙個拷貝建構函式,使用這樣的類是危險的。core.h212

v690 「ctxmempoolentry」類實現乙個拷貝建構函式,但缺少「=」操作符,使用這樣的類是危險的。txmempool.h27

v690 「json_grammer」類實現了』='操作,但缺少乙個拷貝建構函式,使用這樣的類是危險的。 json_spirit_reader_template.h370

v690 『generator』類實現了』='操作,但缺少乙個拷貝建構函式,使用這樣的類是危險的。 json_spirit_writer_template.h98

定期使用靜態分析器可以幫助你節省大量的時間和神經細胞,最主要的是,它很方便,哈哈,位元幣君挺住啊,別被玩壞咯。

原文:

第一次給使用者做培訓

2004年 答辯完之後,2年半的時間裡沒有做過正式的講解。這次客戶提出需要,給他們終端使用者做系統使用的培訓,恰好我在現場,就由我上。其實之前我另外乙個同事已經給他們培訓過一次,只是當時使用者可能沒有想到這麼快就用上這個系統了,那次培訓的效果可想而知。先是做ppt,做乙個好的ppt還真不容易。才開始...

第一次做的

新增 static string connstring server net2 15 net2 database bms uid sa pwd server sqlconnection myconn new sqlconnection connstring protected void page l...

第一次做Blog

第一次做blog,心情自然有點激動,同時又有點擔心別人說我菜.唉,其實我接觸電腦都很多年了,但平時網上發文灌水少吧,自己又懶,有些鬱悶或不愉快的事不喜歡動筆發洩,憋著真的挺不舒服的.好象說的沒什麼邏輯啊,沒關係啦,隨感嘛 閒來無事,有沒人能找我吹吹水?其實我覺得自己還挺搞笑的,只不過不善於與人打交道...