强制整数缓冲区溢出是否合法?

时间:2014-02-10 22:55:11

标签: c++ c overflow

我想在此example中实现一个Handletype。

(长话短说:结构Handleindex - 成员保存到包含元素的数组中。其他成员count验证index是否为最新,对应于数据countArraycountcountArray具有固定大小的类型/位域(u32:20bits))

为避免被限制在生成/计数器大小的20位,我想到了以下内容:为什么不让unsigned char count/countArray故意溢出? 我也可以使用modulo方法( counter = ++counter % 0xff )做同样的事情,但那是另一个额外的操作。 因此,当0xff发生时,让计数增长到0并且溢出将再次设置为0xff + 1。 这是合法的吗?

这是我的伪实现(C ++):

struct Handle
{
        unsigned short index;
        unsigned char count;
};

struct myData
{
        unsigned short curIndex;
        int* dataArray;
        unsigned char* countArray;

        Handle create()
        {
            // check if index not already used
            // create object at dataArray[handle.index]
            Handle handle;
            handle.index = curIndex;
            handle.count = countArray[curIndex]; 
            return handle;
        }

        void destroy( const Handle& handle )
        {
            // delete object at dataArray[handle.index]
            countArray[handle.index]++; // <-- overflow here?
        }

        bool isValid( const Handle& handle ) const
        {
            return handle.count == countArray[handle.index];
        }
};

编辑#1:是的,这些整数类型都应该是无符号的(如索引所示)

1 个答案:

答案 0 :(得分:1)

只要您不使用signed类型,就可以安全了。

从技术上讲,unsigned类型不会溢出:

3.9.1基本类型[basic.fundamental]

  

46)这意味着无符号算术不会溢出,因为a   结果无法由结果无符号整数表示   type是以大于最大值的数量减少的模数   可以由结果无符号整数类型表示的值。