Как мне исправить ошибку неинициализированного значения valgrind? - PullRequest
0 голосов
/ 07 апреля 2019

Я написал небольшое приложение, которое в какой-то момент работает с двоичными данными.В модульных тестах я сравниваю эти данные с ожидаемыми.Когда возникает ошибка, я хочу, чтобы тест отображал шестнадцатеричный вывод, такой как:

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.

Как исправить эту ошибку?

1 Ответ

1 голос
/ 07 апреля 2019

Так что это один из случаев, когда передача указателя на char, который указывает на буфер, заполненный произвольными двоичными данными, в неявный неявный конструктор класса std::string приводил к тому, что строка усекалась до первого \0. Прямой подход заключается в передаче необработанного указателя, но лучшее решение - начать использовать array_view span или аналогичные служебные классы, которые обеспечат проверку индекса по крайней мере в отладочной сборке как для input, так и lut.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...