首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++Builder 2010 集合類 Set ToInt Bug 分析

     編輯:關於C++

現象

Set<TTest, tt0, tt16> 定義第 15、16 位元,ToInt() 應回傳 1<<15 = 32768、1<<16 = 65536,但第 16 位元實際回傳 16777216 (1<<24),多左移 8 位。

原因

sysset.h 中 SetBase::Data 陣列大小計算錯誤,導致 ToInt() 迴圈處理額外 8 位元(1 byte)。

錯誤程式碼

template<class T, unsigned char minEl, unsigned char maxEl>
class SetBase {
protected:
    unsigned char Data[((((int)(maxEl/8))-((int)(minEl/8))+1) != 3)?
        (((int)(maxEl/8))-((int)(minEl/8))+1) : 4]; // 條件判斷導致 maxEl=16 時大小為 4 而非 3
};

int ToInt() const {
    int Result = 0;
    for (int i = sizeof(Data)-1; i >= 0; i--) {
        Result |= Data[i];
        Result <<= (i * sizeof(unsigned char) * 8); // 多處理 1 byte 導致左移 8 位
    }
    return Result;
}

修正建議

  • 修正 Data 陣列大小計算公式,移除錯誤的三元條件。
  • 或升級至更新版本(RAD Studio 10+ 已修復)。
  • Delphi 同版本無此 Bug,確為 C++Builder 編譯器/標頭檔問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved