Commit 58000683 authored by Guolin Ke's avatar Guolin Ke
Browse files

fix index out of range bug.

parent 5e3b7193
......@@ -206,7 +206,8 @@ public:
void LoadFromMemory(const void* memory, const std::vector<data_size_t>& local_used_indices) override {
const uint8_t* mem_data = reinterpret_cast<const uint8_t*>(memory);
if (!local_used_indices.empty()) {
for (int i = 0; i < num_data_; i += 2) {
const data_size_t rest = num_data_ & 1;
for (int i = 0; i < num_data_ - rest; i += 2) {
// get old bins
data_size_t idx = local_used_indices[i];
const auto bin1 = static_cast<uint8_t>((mem_data[idx >> 1] >> ((idx & 1) << 2)) & 0xf);
......@@ -216,7 +217,7 @@ public:
const int i1 = i >> 1;
data_[i1] = (bin1 | (bin2 << 4));
}
if ((num_data_ & 1) == 1) {
if (rest) {
data_size_t idx = local_used_indices[num_data_ - 1];
data_[num_data_ / 2 + 1] = (mem_data[idx >> 1] >> ((idx & 1) << 2)) & 0xf;
}
......@@ -229,7 +230,8 @@ public:
void CopySubset(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices) override {
auto other_bin = reinterpret_cast<const Dense4bitsBin*>(full_bin);
for (int i = 0; i < num_used_indices; i += 2) {
const data_size_t rest = num_used_indices & 1;
for (int i = 0; i < num_used_indices - rest; i += 2) {
data_size_t idx = used_indices[i];
const auto bin1 = static_cast<uint8_t>((other_bin->data_[idx >> 1] >> ((idx & 1) << 2)) & 0xf);
idx = used_indices[i + 1];
......@@ -237,7 +239,7 @@ public:
const int i1 = i >> 1;
data_[i1] = (bin1 | (bin2 << 4));
}
if ((num_used_indices & 1) == 1) {
if (rest) {
data_size_t idx = used_indices[num_used_indices - 1];
data_[num_used_indices / 2 + 1] = (other_bin->data_[idx >> 1] >> ((idx & 1) << 2)) & 0xf;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment