我该如何解决valgrind的未初始化值错误?

时间:2019-04-06 21:00:18

标签: c++ memory-management memory-leaks

我编写了一个小型应用程序,该应用程序有时可以处理二进制数据。在单元测试中,我将此数据与预期数据进行比较。发生错误时,我希望测试显示十六进制输出,例如:

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"

为了显示该信息(并首先比较二进制数据),我使用了the code from Stack Overflow,并根据需要对其进行了一些修改:

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 个答案:

答案 0 :(得分:1)

因此,这是将指向char的指针指向填充有任意二进制数据的缓冲区到std::string类的邪恶隐式构造函数中的一种情况,这种情况导致字符串被截断为第一个{{ 1}}。简单的方法是传递原始指针,但是更好的解决方案是开始使用\0 array_view或类似的实用程序类,这些类至少在span和{的调试版本中提供索引验证{1}}。