Я написал небольшое приложение, которое в какой-то момент работает с двоичными данными.В модульных тестах я сравниваю эти данные с ожидаемыми.Когда возникает ошибка, я хочу, чтобы тест отображал шестнадцатеричный вывод, такой как:
Failure
Expected: string_to_hex(expected, 11)
Which is: "01 43 02 01 00 65 6E 74 FA 3E 17"
To be equal to: string_to_hex(writeBuffer, 11)
Which is: "01 43 02 01 00 00 00 00 98 37 DB"
Чтобы отобразить это (и для сравнения двоичных данных в первую очередь), я использовал кодиз переполнения стека , слегка изменив его для своих нужд:
std::string string_to_hex(const std::string& input, size_t len)
{
static const char* const lut = "0123456789ABCDEF";
std::string output;
output.reserve(2 * len);
for (size_t i = 0; i < len; ++i)
{
const unsigned char c = input[i];
output.push_back(lut[c >> 4]);
output.push_back(lut[c & 15]);
}
return output;
}
При проверке утечек памяти с помощью valgrind
я обнаружил много ошибок, таких как эта:
Использование неинициализированного значения размера 8
в 0x11E75A: string_to_hex (std :: __cxx11 :: basic_string, std :: allocator> const &, unsigned long)
Я не уверенчтобы понять это.Во-первых, все кажется инициализированным, в том числе, я ошибаюсь, output
.Более того, в коде нет упоминания о размере 8;значение len
варьируется от теста к тесту, тогда как valgrind
каждый раз сообщает об одном и том же размере 8.
Как исправить эту ошибку?