std::copy 内存越界

1.问题代码

class OneChannelData{
	...
    bool combine(const OneChannelData &oneChannelData) {

        try {
            /* 合并两个 std::array */
            /* 不会检查越界 */
            std::copy(oneChannelData.data.cbegin(), oneChannelData.data.cend(),data.begin() + index);
            index += oneChannelData.index;
            return true;
        } catch (const std::exception &e) {
            e.what();
            return false;
        } catch (...) {
            return false;
        }

    }

	...

    /* 维护设备通道下1-50个采样点 */
    constexpr static uint64_t PointNumber = 50l;

    std::array<DataUnit, PointNumber> data;

    std::atomic<uint64_t> index{};
};

2.问题分析

在我的类结构中,在 std::array<DataUnit, PointNumber> data; 紧跟一个std::atomic<uint64_t>的维护数组下标的变量。当使用std::copy 继续向后拷贝50个元素时会造成越界,因此造成index 的值被数组的溢出修改。

3.修改后代码

手动保证数组不会越界

class OneChannelData{
	...
    bool combine(const OneChannelData &oneChannelData) {

        try {
            /* 合并两个 std::array */
            /* 不会检查越界 */
            std::copy(oneChannelData.data.cbegin(), oneChannelData.data.cbegin() + oneChannelData.index,
                      data.begin() + index);
            index += oneChannelData.index;
            return true;
        } catch (const std::exception &e) {
            e.what();
            return false;
        } catch (...) {
            return false;
        }

    }

	...

    /* 维护设备通道下1-50个采样点 */
    constexpr static uint64_t PointNumber = 50l;

    std::array<DataUnit, PointNumber> data;

    std::atomic<uint64_t> index{};
};

posted @ 2025-04-27 14:35  BlackSnow  阅读(28)  评论(0)    收藏  举报