我应该如何修复瓦尔格林德的未初始化值错误?



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

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"

为了显示它(并首先比较二进制数据),我使用了 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检查内存泄漏时,我犯了很多错误,例如:

在 0x11E75A 处使用大小为 8
    的未初始化值:string_to_hex(std::__cxx11::basic_string,std::分配器> const&,无符号长)

我不确定是否理解它。首先,一切似乎都已初始化,包括,我错了,output.此外,代码中没有提到尺寸 8;len的值因测试而异,而valgrind每次报告相同的大小 8。

我应该如何修复此错误?

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

最新更新