Giải thích nguyên nhân về bug dupe gold. Blizzard programmer lại fucked up 1 lần nữa =)

IntoTh3Rainbow

~vkRainbow~
Moderator
Lão Làng GVN
Tham gia ngày
8/2/03
Bài viết
5,303
Reaction score
8
Link tiếng Anh: https://webcache.googleusercontent.com/search?q=cache:minimaxir.com/2013/05/stones-of-jordan/

Dịch sơ sơ tạm hiểu là thế này:

1.
Trước 1.08: bán 1 stack 1mil dc giá 0.25$ minimum
Sau 1.08: tăng 1 stack lên 10mil, dẫn đến tình trạng gold treo 1 lần dc hơn 2 tỉ ( tạm gọi X là số tiền bán mỗi lần).

2. (Phần này cần hiểu biết lập trình tin học 1 ít)
Programmer của Blizzard lập trình đặt biến X này dưới type INTEGER. Biến INTEGER thì có giá trị max chỉ có thể là 2,147,483,648 hay là 2^31.
(Cũng là lý do từ trước đến nay bán trên GAH đồ bị limit ở 2 Bil)

3.
Người chơi đặt bán gold 1 lần trên số lượng đó, dẫn đến sai lệch tính toán dây chuyền, số tiền đặt bán sẽ dc hiểu sai và khi cancel người chơi sẽ dc thêm tiền vì những tính toán sai lệch đấy.

Nói ngắn gọn hơn nữa thì Programmer của Blizzard đã phạm 1 trong những lỗi cơ bản và sơ đẳng nhất. Ngoài ra quên đặt điều kiện, khi test thì ẩu tả ko kĩ càng, dẫn đến lỗi dupe như mọi ng đã biết.


PS: Lần này ko phải là lần đầu và cũng chắc chắn chẳng phải là lần cuối. Đã có rất nhiều lỗi sơ đẳng do làm việc ẩu tả, kém cỏi của team lập trình viên ở Blizzard rồi, nhưng lần này thì lỗi dẫn đến hậu quả lớn nhất từ trước đến giờ :)
 
Nếu nguyên nhân là do vậy thì bước unit test nó làm cái dek gi??? Nó thay đổi mà ko tính đc vùng ảnh hưởng và việc ko unit test lại à???
 
Nếu nguyên nhân là do vậy thì bước unit test nó làm cái dek gi??? Nó thay đổi mà ko tính đc vùng ảnh hưởng và việc ko unit test lại à???

uh, nhưng unit test cho dù có đi nữa nhưng design ẩu tả thiếu những cái test cơ bản như thế thì cũng thọt thui....
 
Đúng là khi đưa lên PTR thì người ta chỉ test game là chủ yếu chứ ít ai lại vào AH vọc phá nên chỉ có thể nói lỗi do programmer Blizz gà =))
 
lol, làm nhớ đến 1 vài game fb ngày xưa cũng dính lỗi y chang thế này. =))
 
Test trên PTR chỉ là test gameplay thôi,chứ cái AH là cái chợ sống,phải hoạt động thực tế thì mới thấy lỗi phát sinh được.
 
h mới biết đc vì sao mesos game maplestory luôn max là 2.147.483.647 .:D
 
Hồi xưa học phân tích, thầy mình cứ dự phòng tình huống này bằng việc đặt biến luôn kiểu float hoặc decimal rồi giới hạn biến nhỏ hơn gia trị nào đó, giờ mới thấy tác dụng của việc này...haha...quá sơ đẳng
 
Bài đó nói rõ hơn là như vầy:
- Trước 1.0.8: Số gold tối đa cho một lần treo là 1 tỷ (250/0.25 * 1.000.000) ==> no star where.
- Sau 1.0.8: Số gold tối đa cho một lần treo là 10 tỷ (250/0,25 * 10.000.000). Người bán treo lên 6 tỷ, AH chỉ hiểu được 2 tỷ, còn lại cỡ 4 tỷ không lên được. Như vậy số gold bị trừ khỏi acc là cỡ 2 tỷ. Tuy nhiên, nếu người bán cancel thì họ được bù lại 6 tỷ ==> lời cỡ 4 tỷ mỗi lần treo bán và cancel. Do đó bug có thể xảy ra khi treo số gold khác, giá khác, ko nhất định phải là 6 tỷ và 0.39 USD.

Lỗi này có thể được phát hiện bằng unit test. Nhưng chắc lúc viết UT họ lại không xét các giá trị biên. Nếu đúng như vậy thì đây là lỗi căn bản không đáng xảy ra ở công ty lớn như Blizzard.
 
* Cái này thì chắc mấy ông nào lập trình cho các ngân hàng, hoặc nói chung là lập trình liên quan đến cái gì mà phải xử lý những con số lớn mới gặp, chứ lập trình bt cũng ít khi gặp phải mấy cái này. Nhưng mà chốt lại là làm cái gì mà liên quan đến tiền bạc thật cũng đều nguy hiểm, có sơ sót gì đó thì hậu quả khó lường

* Ví dụ 1 công ty mà sử dụng phần mềm tính toán số liệu, tiền bạc, thống kê mà phần mềm bị sai thì ... tèn ten :D

- - - Updated - - -

Bài đó nói rõ hơn là như vầy:
- Trước 1.0.8: Số gold tối đa cho một lần treo là 1 tỷ (250/0.25 * 1.000.000) ==> no star where.
- Sau 1.0.8: Số gold tối đa cho một lần treo là 10 tỷ (250/0,25 * 10.000.000). Người bán treo lên 6 tỷ, AH chỉ hiểu được 2 tỷ, còn lại cỡ 4 tỷ không lên được. Như vậy số gold bị trừ khỏi acc là cỡ 2 tỷ. Tuy nhiên, nếu người bán cancel thì họ được bù lại 6 tỷ ==> lời cỡ 4 tỷ mỗi lần treo bán và cancel. Do đó bug có thể xảy ra khi treo số gold khác, giá khác, ko nhất định phải là 6 tỷ và 0.39 USD.

Lỗi này có thể được phát hiện bằng unit test. Nhưng chắc lúc viết UT họ lại không xét các giá trị biên. Nếu đúng như vậy thì đây là lỗi căn bản không đáng xảy ra ở công ty lớn như Blizzard.

Mở rộng số lượng gold cho 1 stack lên đến 10 tỷ, nhưng mà chắc là ko thèm test lại, vì cứ nghĩ la treo bình thường, chứ cái test treo/cancel đơn giản như vậy làm gì chẳng phát hiện ra bug =))
 
Hông biết thời nào rồi mà blizzard còn có anh programmer xài số integer (4 bytes giá trị) cho value dự kiến có thể lên đc vài chục, vài trăm tỷ nữa :7cool_waaaht:

Mấy game VN làm bây giờ từ mobile đến webgame nhiều game còn support cả vài trăm ngàn tỷ luôn (chính xác là 9,223,372,036,854,775,807 , kiểu long, data lưu 8 bytes).
 
Giờ mà đổi lại 1 trường trong database có mà chết:)) chuyển lại 1 lần bán max 2 bil thôi :))
 
chuyển lại 1 lần bán max 2bil, giảm giá bán xuống 0.025$, ko lẽ blizz nó chê số bé quá ăn tiền chả bõ hay sao nhỉ :))
 
thật tình thấy nếu blizzard bị lỗi đúng như thế này thì kỹ năng của lập trình viên củ chuối dữ vậy sao :|
 
thằng lập trình và thằng thiết kế hệ thống,do 2 thằng này fucked up mới gây ra như thế này.......
 
Sao nó lại phạm sai lầm căn bản thế nhỉ, đặt biến phải lường trước giá trị căn bản và các biến phụ thuộc, chứ không xảy ra bug dây chuyền thì có mà ăn cho hết à. Với lại không viết kèm theo cái exception để quăng lỗi ra à, có lỗi phải roll back transaction lại chứ.
 
thật tình thấy nếu blizzard bị lỗi đúng như thế này thì kỹ năng của lập trình viên củ chuối dữ vậy sao :|

Thật ra lập trình lỗi là chuyện bt, vần đề quan trọng là ... ếu test lại => trong khi lỗi lại liên quan đến tiền bạc thật, chết là chết ở chỗ này đây bác. Chắc đại ca này vừa lập trình xong, chưa kịp test lại thì gấu alo gọi về nhà có chiện gấp, anh này code xong nghĩ ... mình wa là pro, chắc là chạy vù vù ko cần test lại, thôi zdề với vợ lẹ ko lại ăn đòn
:-s
 
thật tình thì chẳng ai dám tự tin lập trình xong là ok ngay, phải luôn test và phải test nhiều kiểu khác nhau nhiều góc độ khác nhau, mà 1.08 cũng có thgời gian chuẩn bị khá lâu mà bị lỗi nghiêm trọng :|
 
Mình mờ là D3 dev, mình sẽ lập trình sao cho 1 case nào vô cùng khó gặp (ví dụ như phải chạy vòng vòng 5', nhảy cò cò 10 cái, hít đất 20 cái), ko ai phát hiện (trừ những người vô cùng bệnh hoạn mới tìm ra) sẽ có bug, rồi sau đó khi chơi D3, ta exploit cái bug đó để, tự sướng, tư lợi riêng, hà hà :2cool_confident:
 
Chỉnh sửa cuối:
ko biết có liên quan nhiều đến việc hợp tác với bọn Activision có cái series COD càng ngày càng tệ ko nhỉ :-s
 
Back
Top