Stops calling std::copy_n over zero-sided vec, which indeed dereferences null.

Also added vector::reserve() call before the for loop.

PiperOrigin-RevId: 316589226
Change-Id: Iae6edd6f3bf5c8b737cbad782d45c978e622df43
This commit is contained in:
A. Unique TensorFlower 2020-06-15 18:39:25 -07:00 committed by TensorFlower Gardener
parent 2a96849f47
commit cd7da16dd6

View File

@ -154,7 +154,14 @@ class CTCDecodeHelper {
auto& p_batch = sequences[b][p];
int64 num_decoded = p_batch.size();
max_decoded = std::max(max_decoded, num_decoded);
std::copy_n(p_batch.begin(), num_decoded, &values_t(offset));
if (num_decoded > 0) {
DCHECK_NE(values_t.data(), nullptr)
<< "values_t should not be nullptr: p_num=" << p_num
<< " num_decoded=" << num_decoded;
DCHECK_LT(offset, values_t.size())
<< "offset should be smaller than values_t.size()";
std::copy_n(p_batch.begin(), num_decoded, &values_t(offset));
}
for (int64 t = 0; t < num_decoded; ++t, ++offset) {
indices_t(offset, 0) = b;
indices_t(offset, 1) = t;
@ -203,6 +210,7 @@ class CTCGreedyDecoderOp : public OpKernel {
auto inputs_t = inputs->tensor<T, 3>();
input_list_t.reserve(max_time);
for (std::size_t t = 0; t < max_time; ++t) {
input_list_t.emplace_back(inputs_t.data() + t * batch_size * num_classes,
batch_size, num_classes);
@ -305,6 +313,7 @@ class CTCBeamSearchDecoderOp : public OpKernel {
std::vector<typename TTypes<T>::UnalignedConstMatrix> input_list_t;
input_list_t.reserve(max_time);
for (std::size_t t = 0; t < max_time; ++t) {
input_list_t.emplace_back(inputs_t.data() + t * batch_size * num_classes,
batch_size, num_classes);