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: ...@@ -206,7 +206,8 @@ public:
void LoadFromMemory(const void* memory, const std::vector<data_size_t>& local_used_indices) override { 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); const uint8_t* mem_data = reinterpret_cast<const uint8_t*>(memory);
if (!local_used_indices.empty()) { 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 // get old bins
data_size_t idx = local_used_indices[i]; data_size_t idx = local_used_indices[i];
const auto bin1 = static_cast<uint8_t>((mem_data[idx >> 1] >> ((idx & 1) << 2)) & 0xf); const auto bin1 = static_cast<uint8_t>((mem_data[idx >> 1] >> ((idx & 1) << 2)) & 0xf);
...@@ -216,7 +217,7 @@ public: ...@@ -216,7 +217,7 @@ public:
const int i1 = i >> 1; const int i1 = i >> 1;
data_[i1] = (bin1 | (bin2 << 4)); data_[i1] = (bin1 | (bin2 << 4));
} }
if ((num_data_ & 1) == 1) { if (rest) {
data_size_t idx = local_used_indices[num_data_ - 1]; data_size_t idx = local_used_indices[num_data_ - 1];
data_[num_data_ / 2 + 1] = (mem_data[idx >> 1] >> ((idx & 1) << 2)) & 0xf; data_[num_data_ / 2 + 1] = (mem_data[idx >> 1] >> ((idx & 1) << 2)) & 0xf;
} }
...@@ -229,7 +230,8 @@ public: ...@@ -229,7 +230,8 @@ public:
void CopySubset(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices) override { 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); 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]; data_size_t idx = used_indices[i];
const auto bin1 = static_cast<uint8_t>((other_bin->data_[idx >> 1] >> ((idx & 1) << 2)) & 0xf); const auto bin1 = static_cast<uint8_t>((other_bin->data_[idx >> 1] >> ((idx & 1) << 2)) & 0xf);
idx = used_indices[i + 1]; idx = used_indices[i + 1];
...@@ -237,7 +239,7 @@ public: ...@@ -237,7 +239,7 @@ public:
const int i1 = i >> 1; const int i1 = i >> 1;
data_[i1] = (bin1 | (bin2 << 4)); data_[i1] = (bin1 | (bin2 << 4));
} }
if ((num_used_indices & 1) == 1) { if (rest) {
data_size_t idx = used_indices[num_used_indices - 1]; 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; 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