你知道嗎?在FunC中,1並不等於1

嗨大家好,我和 @Alan 在撰寫測試 FunC 的一個合約,發現了一個很有趣的現象,不曉得是不是 FunC 的 bug,這是我們執行的程式碼:

我們呼叫這個 function 時,帶入的 index 參數為 0,因此 claim_bit_index = 0 % 256,也就是 claim_bit_index = 0,則 int mask = 1 << 0,也就是 mask = 1

當我們開始拿 mask 變數開始去做一些比對,發現下列有趣的情況:mask 目前等於 1,但若是拿他來跟 mask == 1,dump 出來的結果卻是 0,這和預料的結果不太一樣,他應該是 -1,因為 mask = 1,而 1 == 1。接著再拿 mask ≠ 1 進行比較,dump 出來的結果就變成 -1,這也和常理相反。

下方是我跑程式的結果輸出:

但我們發現我做了一個操作後,可以讓 mask == 1 以及 mask != 1 得到正確的結果,也就是在做完位元運算後多 / 1,也就是 int mask = (1 << claim_bit_index) / 1;

透過這樣更改可以得到下方的結果:

這樣的結果不知道是碰到什麼問題了?想和大家一起討論看看這是不是屬於 FunC 的 bugs ??? 還是我們忽略了些什麼問題?!

2 Likes

算是實錘了 這是ton實作的疏失 沒有考慮到位移運算中的 null shift 會在之後的版本進行更新