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{};
};

浙公网安备 33010602011771号